From 303019cc7d07a43e384185f276842ac3a234e801 Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Mon, 17 Nov 2025 16:22:47 -0300 Subject: [PATCH 1/3] fix: phpseclib scoper Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- .../phpseclib/Common/Functions/Strings.php | 230 +- .../phpseclib/phpseclib/Crypt/AES.php | 9 +- .../phpseclib/phpseclib/Crypt/Blowfish.php | 435 +++- .../phpseclib/phpseclib/Crypt/ChaCha20.php | 1175 ++++----- .../phpseclib/Crypt/Common/AsymmetricKey.php | 151 +- .../phpseclib/Crypt/Common/BlockCipher.php | 2 +- .../Crypt/Common/Formats/Keys/JWK.php | 28 +- .../Crypt/Common/Formats/Keys/OpenSSH.php | 90 +- .../Crypt/Common/Formats/Keys/PKCS.php | 6 +- .../Crypt/Common/Formats/Keys/PKCS1.php | 89 +- .../Crypt/Common/Formats/Keys/PKCS8.php | 294 ++- .../Crypt/Common/Formats/Keys/PuTTY.php | 197 +- .../Crypt/Common/Formats/Signature/Raw.php | 18 +- .../phpseclib/Crypt/Common/PrivateKey.php | 5 +- .../phpseclib/Crypt/Common/PublicKey.php | 2 +- .../phpseclib/Crypt/Common/StreamCipher.php | 6 +- .../phpseclib/Crypt/Common/SymmetricKey.php | 1133 +++++--- .../Crypt/Common/Traits/Fingerprint.php | 21 +- .../Crypt/Common/Traits/PasswordProtected.php | 7 +- .../phpseclib/phpseclib/Crypt/DES.php | 1077 +++++++- .../phpseclib/phpseclib/Crypt/DH.php | 179 +- .../phpseclib/Crypt/DH/Formats/Keys/PKCS1.php | 19 +- .../phpseclib/Crypt/DH/Formats/Keys/PKCS8.php | 28 +- .../phpseclib/Crypt/DH/Parameters.php | 4 +- .../phpseclib/Crypt/DH/PrivateKey.php | 12 +- .../phpseclib/Crypt/DH/PublicKey.php | 6 +- .../phpseclib/phpseclib/Crypt/DSA.php | 62 +- .../Crypt/DSA/Formats/Keys/OpenSSH.php | 27 +- .../Crypt/DSA/Formats/Keys/PKCS1.php | 41 +- .../Crypt/DSA/Formats/Keys/PKCS8.php | 30 +- .../Crypt/DSA/Formats/Keys/PuTTY.php | 18 +- .../phpseclib/Crypt/DSA/Formats/Keys/Raw.php | 20 +- .../phpseclib/Crypt/DSA/Formats/Keys/XML.php | 66 +- .../Crypt/DSA/Formats/Signature/ASN1.php | 14 +- .../Crypt/DSA/Formats/Signature/Raw.php | 3 +- .../Crypt/DSA/Formats/Signature/SSH2.php | 32 +- .../phpseclib/Crypt/DSA/Parameters.php | 4 +- .../phpseclib/Crypt/DSA/PrivateKey.php | 30 +- .../phpseclib/Crypt/DSA/PublicKey.php | 23 +- .../phpseclib/phpseclib/Crypt/EC.php | 111 +- .../phpseclib/Crypt/EC/BaseCurves/Base.php | 33 +- .../phpseclib/Crypt/EC/BaseCurves/Binary.php | 80 +- .../Crypt/EC/BaseCurves/KoblitzPrime.php | 83 +- .../Crypt/EC/BaseCurves/Montgomery.php | 50 +- .../phpseclib/Crypt/EC/BaseCurves/Prime.php | 203 +- .../Crypt/EC/BaseCurves/TwistedEdwards.php | 36 +- .../phpseclib/Crypt/EC/Curves/Curve25519.php | 15 +- .../phpseclib/Crypt/EC/Curves/Curve448.php | 25 +- .../phpseclib/Crypt/EC/Curves/Ed25519.php | 101 +- .../phpseclib/Crypt/EC/Curves/Ed448.php | 88 +- .../Crypt/EC/Curves/brainpoolP160r1.php | 13 +- .../Crypt/EC/Curves/brainpoolP160t1.php | 11 +- .../Crypt/EC/Curves/brainpoolP192r1.php | 13 +- .../Crypt/EC/Curves/brainpoolP192t1.php | 11 +- .../Crypt/EC/Curves/brainpoolP224r1.php | 13 +- .../Crypt/EC/Curves/brainpoolP224t1.php | 11 +- .../Crypt/EC/Curves/brainpoolP256r1.php | 13 +- .../Crypt/EC/Curves/brainpoolP256t1.php | 11 +- .../Crypt/EC/Curves/brainpoolP320r1.php | 23 +- .../Crypt/EC/Curves/brainpoolP320t1.php | 23 +- .../Crypt/EC/Curves/brainpoolP384r1.php | 41 +- .../Crypt/EC/Curves/brainpoolP384t1.php | 41 +- .../Crypt/EC/Curves/brainpoolP512r1.php | 41 +- .../Crypt/EC/Curves/brainpoolP512t1.php | 41 +- .../phpseclib/Crypt/EC/Curves/nistb233.php | 2 +- .../phpseclib/Crypt/EC/Curves/nistb409.php | 2 +- .../phpseclib/Crypt/EC/Curves/nistk163.php | 2 +- .../phpseclib/Crypt/EC/Curves/nistk233.php | 2 +- .../phpseclib/Crypt/EC/Curves/nistk283.php | 2 +- .../phpseclib/Crypt/EC/Curves/nistk409.php | 2 +- .../phpseclib/Crypt/EC/Curves/nistp192.php | 2 +- .../phpseclib/Crypt/EC/Curves/nistp224.php | 2 +- .../phpseclib/Crypt/EC/Curves/nistp256.php | 2 +- .../phpseclib/Crypt/EC/Curves/nistp384.php | 2 +- .../phpseclib/Crypt/EC/Curves/nistp521.php | 2 +- .../phpseclib/Crypt/EC/Curves/nistt571.php | 2 +- .../phpseclib/Crypt/EC/Curves/prime192v1.php | 2 +- .../phpseclib/Crypt/EC/Curves/prime192v2.php | 13 +- .../phpseclib/Crypt/EC/Curves/prime192v3.php | 13 +- .../phpseclib/Crypt/EC/Curves/prime239v1.php | 13 +- .../phpseclib/Crypt/EC/Curves/prime239v2.php | 13 +- .../phpseclib/Crypt/EC/Curves/prime239v3.php | 13 +- .../phpseclib/Crypt/EC/Curves/prime256v1.php | 2 +- .../phpseclib/Crypt/EC/Curves/secp112r1.php | 13 +- .../phpseclib/Crypt/EC/Curves/secp112r2.php | 13 +- .../phpseclib/Crypt/EC/Curves/secp128r1.php | 13 +- .../phpseclib/Crypt/EC/Curves/secp128r2.php | 13 +- .../phpseclib/Crypt/EC/Curves/secp160k1.php | 24 +- .../phpseclib/Crypt/EC/Curves/secp160r1.php | 13 +- .../phpseclib/Crypt/EC/Curves/secp160r2.php | 13 +- .../phpseclib/Crypt/EC/Curves/secp192k1.php | 24 +- .../phpseclib/Crypt/EC/Curves/secp192r1.php | 43 +- .../phpseclib/Crypt/EC/Curves/secp224k1.php | 24 +- .../phpseclib/Crypt/EC/Curves/secp224r1.php | 13 +- .../phpseclib/Crypt/EC/Curves/secp256k1.php | 26 +- .../phpseclib/Crypt/EC/Curves/secp256r1.php | 13 +- .../phpseclib/Crypt/EC/Curves/secp384r1.php | 35 +- .../phpseclib/Crypt/EC/Curves/secp521r1.php | 29 +- .../phpseclib/Crypt/EC/Curves/sect113r1.php | 13 +- .../phpseclib/Crypt/EC/Curves/sect113r2.php | 13 +- .../phpseclib/Crypt/EC/Curves/sect131r1.php | 13 +- .../phpseclib/Crypt/EC/Curves/sect131r2.php | 13 +- .../phpseclib/Crypt/EC/Curves/sect163k1.php | 13 +- .../phpseclib/Crypt/EC/Curves/sect163r1.php | 13 +- .../phpseclib/Crypt/EC/Curves/sect163r2.php | 13 +- .../phpseclib/Crypt/EC/Curves/sect193r1.php | 13 +- .../phpseclib/Crypt/EC/Curves/sect193r2.php | 13 +- .../phpseclib/Crypt/EC/Curves/sect233k1.php | 13 +- .../phpseclib/Crypt/EC/Curves/sect233r1.php | 13 +- .../phpseclib/Crypt/EC/Curves/sect239k1.php | 13 +- .../phpseclib/Crypt/EC/Curves/sect283k1.php | 13 +- .../phpseclib/Crypt/EC/Curves/sect283r1.php | 13 +- .../phpseclib/Crypt/EC/Curves/sect409k1.php | 19 +- .../phpseclib/Crypt/EC/Curves/sect409r1.php | 19 +- .../phpseclib/Crypt/EC/Curves/sect571k1.php | 23 +- .../phpseclib/Crypt/EC/Curves/sect571r1.php | 23 +- .../Crypt/EC/Formats/Keys/Common.php | 241 +- .../phpseclib/Crypt/EC/Formats/Keys/JWK.php | 57 +- .../EC/Formats/Keys/MontgomeryPrivate.php | 17 +- .../EC/Formats/Keys/MontgomeryPublic.php | 15 +- .../Crypt/EC/Formats/Keys/OpenSSH.php | 81 +- .../phpseclib/Crypt/EC/Formats/Keys/PKCS1.php | 73 +- .../phpseclib/Crypt/EC/Formats/Keys/PKCS8.php | 81 +- .../phpseclib/Crypt/EC/Formats/Keys/PuTTY.php | 46 +- .../phpseclib/Crypt/EC/Formats/Keys/XML.php | 228 +- .../Crypt/EC/Formats/Keys/libsodium.php | 31 +- .../Crypt/EC/Formats/Signature/ASN1.php | 14 +- .../Crypt/EC/Formats/Signature/IEEE.php | 25 +- .../Crypt/EC/Formats/Signature/Raw.php | 3 +- .../Crypt/EC/Formats/Signature/SSH2.php | 30 +- .../phpseclib/Crypt/EC/Parameters.php | 4 +- .../phpseclib/Crypt/EC/PrivateKey.php | 89 +- .../phpseclib/Crypt/EC/PublicKey.php | 77 +- .../phpseclib/phpseclib/Crypt/Hash.php | 926 +++++-- .../phpseclib/Crypt/PublicKeyLoader.php | 14 +- .../phpseclib/phpseclib/Crypt/RC2.php | 257 +- .../phpseclib/phpseclib/Crypt/RC4.php | 67 +- .../phpseclib/phpseclib/Crypt/RSA.php | 209 +- .../phpseclib/Crypt/RSA/Formats/Keys/JWK.php | 43 +- .../Crypt/RSA/Formats/Keys/MSBLOB.php | 100 +- .../Crypt/RSA/Formats/Keys/OpenSSH.php | 46 +- .../Crypt/RSA/Formats/Keys/PKCS1.php | 77 +- .../Crypt/RSA/Formats/Keys/PKCS8.php | 18 +- .../phpseclib/Crypt/RSA/Formats/Keys/PSS.php | 80 +- .../Crypt/RSA/Formats/Keys/PuTTY.php | 29 +- .../phpseclib/Crypt/RSA/Formats/Keys/Raw.php | 62 +- .../phpseclib/Crypt/RSA/Formats/Keys/XML.php | 62 +- .../phpseclib/Crypt/RSA/PrivateKey.php | 170 +- .../phpseclib/Crypt/RSA/PublicKey.php | 213 +- .../phpseclib/phpseclib/Crypt/Random.php | 111 +- .../phpseclib/phpseclib/Crypt/Rijndael.php | 713 +++-- .../phpseclib/phpseclib/Crypt/Salsa20.php | 204 +- .../phpseclib/phpseclib/Crypt/TripleDES.php | 93 +- .../phpseclib/phpseclib/Crypt/Twofish.php | 447 +++- .../Exception/BadConfigurationException.php | 2 +- .../Exception/BadDecryptionException.php | 2 +- .../phpseclib/Exception/BadModeException.php | 2 +- .../Exception/ConnectionClosedException.php | 2 +- .../Exception/FileNotFoundException.php | 2 +- .../Exception/InconsistentSetupException.php | 2 +- .../Exception/InsufficientSetupException.php | 2 +- .../InvalidPacketLengthException.php | 1 - .../Exception/NoKeyLoadedException.php | 2 +- .../NoSupportedAlgorithmsException.php | 2 +- .../phpseclib/Exception/TimeoutException.php | 1 - .../Exception/UnableToConnectException.php | 2 +- .../UnsupportedAlgorithmException.php | 2 +- .../Exception/UnsupportedCurveException.php | 2 +- .../Exception/UnsupportedFormatException.php | 2 +- .../UnsupportedOperationException.php | 2 +- .../phpseclib/phpseclib/File/ANSI.php | 285 +- .../phpseclib/phpseclib/File/ASN1.php | 854 +++--- .../phpseclib/phpseclib/File/ASN1/Element.php | 3 +- .../File/ASN1/Maps/AccessDescription.php | 11 +- .../ASN1/Maps/AdministrationDomainName.php | 8 +- .../File/ASN1/Maps/AlgorithmIdentifier.php | 14 +- .../phpseclib/File/ASN1/Maps/AnotherName.php | 16 +- .../phpseclib/File/ASN1/Maps/Attribute.php | 16 +- .../File/ASN1/Maps/AttributeType.php | 3 +- .../File/ASN1/Maps/AttributeTypeAndValue.php | 11 +- .../File/ASN1/Maps/AttributeValue.php | 3 +- .../phpseclib/File/ASN1/Maps/Attributes.php | 10 +- .../ASN1/Maps/AuthorityInfoAccessSyntax.php | 10 +- .../File/ASN1/Maps/AuthorityKeyIdentifier.php | 24 +- .../phpseclib/File/ASN1/Maps/BaseDistance.php | 3 +- .../File/ASN1/Maps/BasicConstraints.php | 18 +- .../Maps/BuiltInDomainDefinedAttribute.php | 11 +- .../Maps/BuiltInDomainDefinedAttributes.php | 8 +- .../ASN1/Maps/BuiltInStandardAttributes.php | 46 +- .../phpseclib/File/ASN1/Maps/CPSuri.php | 3 +- .../File/ASN1/Maps/CRLDistributionPoints.php | 10 +- .../phpseclib/File/ASN1/Maps/CRLNumber.php | 3 +- .../phpseclib/File/ASN1/Maps/CRLReason.php | 32 +- .../phpseclib/File/ASN1/Maps/CertPolicyId.php | 3 +- .../phpseclib/File/ASN1/Maps/Certificate.php | 12 +- .../File/ASN1/Maps/CertificateIssuer.php | 2 +- .../File/ASN1/Maps/CertificateList.php | 12 +- .../File/ASN1/Maps/CertificatePolicies.php | 10 +- .../ASN1/Maps/CertificateSerialNumber.php | 3 +- .../File/ASN1/Maps/CertificationRequest.php | 12 +- .../ASN1/Maps/CertificationRequestInfo.php | 20 +- .../File/ASN1/Maps/Characteristic_two.php | 20 +- .../phpseclib/File/ASN1/Maps/CountryName.php | 8 +- .../phpseclib/File/ASN1/Maps/Curve.php | 15 +- .../phpseclib/File/ASN1/Maps/DHParameter.php | 15 +- .../phpseclib/File/ASN1/Maps/DSAParams.php | 12 +- .../File/ASN1/Maps/DSAPrivateKey.php | 15 +- .../phpseclib/File/ASN1/Maps/DSAPublicKey.php | 3 +- .../phpseclib/File/ASN1/Maps/DigestInfo.php | 11 +- .../File/ASN1/Maps/DirectoryString.php | 14 +- .../phpseclib/File/ASN1/Maps/DisplayText.php | 13 +- .../File/ASN1/Maps/DistributionPoint.php | 24 +- .../File/ASN1/Maps/DistributionPointName.php | 19 +- .../phpseclib/File/ASN1/Maps/DssSigValue.php | 11 +- .../phpseclib/File/ASN1/Maps/ECParameters.php | 12 +- .../phpseclib/File/ASN1/Maps/ECPoint.php | 3 +- .../phpseclib/File/ASN1/Maps/ECPrivateKey.php | 25 +- .../phpseclib/File/ASN1/Maps/EDIPartyName.php | 26 +- .../File/ASN1/Maps/EcdsaSigValue.php | 11 +- .../File/ASN1/Maps/EncryptedData.php | 3 +- .../ASN1/Maps/EncryptedPrivateKeyInfo.php | 11 +- .../File/ASN1/Maps/ExtKeyUsageSyntax.php | 10 +- .../phpseclib/File/ASN1/Maps/Extension.php | 16 +- .../File/ASN1/Maps/ExtensionAttribute.php | 21 +- .../File/ASN1/Maps/ExtensionAttributes.php | 8 +- .../phpseclib/File/ASN1/Maps/Extensions.php | 5 +- .../phpseclib/File/ASN1/Maps/FieldElement.php | 3 +- .../phpseclib/File/ASN1/Maps/FieldID.php | 14 +- .../phpseclib/File/ASN1/Maps/GeneralName.php | 59 +- .../phpseclib/File/ASN1/Maps/GeneralNames.php | 10 +- .../File/ASN1/Maps/GeneralSubtree.php | 21 +- .../File/ASN1/Maps/GeneralSubtrees.php | 10 +- .../File/ASN1/Maps/HashAlgorithm.php | 2 +- .../File/ASN1/Maps/HoldInstructionCode.php | 3 +- .../File/ASN1/Maps/InvalidityDate.php | 3 +- .../File/ASN1/Maps/IssuerAltName.php | 2 +- .../ASN1/Maps/IssuingDistributionPoint.php | 47 +- .../File/ASN1/Maps/KeyIdentifier.php | 3 +- .../phpseclib/File/ASN1/Maps/KeyPurposeId.php | 3 +- .../phpseclib/File/ASN1/Maps/KeyUsage.php | 18 +- .../File/ASN1/Maps/MaskGenAlgorithm.php | 2 +- .../phpseclib/File/ASN1/Maps/Name.php | 10 +- .../File/ASN1/Maps/NameConstraints.php | 19 +- .../File/ASN1/Maps/NetworkAddress.php | 3 +- .../File/ASN1/Maps/NoticeReference.php | 16 +- .../File/ASN1/Maps/NumericUserIdentifier.php | 3 +- .../phpseclib/File/ASN1/Maps/ORAddress.php | 12 +- .../File/ASN1/Maps/OneAsymmetricKey.php | 25 +- .../File/ASN1/Maps/OrganizationName.php | 3 +- .../ASN1/Maps/OrganizationalUnitNames.php | 8 +- .../File/ASN1/Maps/OtherPrimeInfo.php | 18 +- .../File/ASN1/Maps/OtherPrimeInfos.php | 10 +- .../phpseclib/File/ASN1/Maps/PBEParameter.php | 11 +- .../phpseclib/File/ASN1/Maps/PBES2params.php | 11 +- .../phpseclib/File/ASN1/Maps/PBKDF2params.php | 25 +- .../phpseclib/File/ASN1/Maps/PBMAC1params.php | 11 +- .../phpseclib/File/ASN1/Maps/PKCS9String.php | 11 +- .../phpseclib/File/ASN1/Maps/Pentanomial.php | 18 +- .../phpseclib/File/ASN1/Maps/PersonalName.php | 33 +- .../File/ASN1/Maps/PolicyInformation.php | 17 +- .../File/ASN1/Maps/PolicyMappings.php | 16 +- .../File/ASN1/Maps/PolicyQualifierId.php | 3 +- .../File/ASN1/Maps/PolicyQualifierInfo.php | 11 +- .../File/ASN1/Maps/PostalAddress.php | 11 +- .../phpseclib/File/ASN1/Maps/Prime_p.php | 3 +- .../File/ASN1/Maps/PrivateDomainName.php | 11 +- .../phpseclib/File/ASN1/Maps/PrivateKey.php | 3 +- .../File/ASN1/Maps/PrivateKeyInfo.php | 20 +- .../File/ASN1/Maps/PrivateKeyUsagePeriod.php | 19 +- .../phpseclib/File/ASN1/Maps/PublicKey.php | 3 +- .../File/ASN1/Maps/PublicKeyAndChallenge.php | 11 +- .../File/ASN1/Maps/PublicKeyInfo.php | 11 +- .../File/ASN1/Maps/RC2CBCParameter.php | 14 +- .../phpseclib/File/ASN1/Maps/RDNSequence.php | 5 +- .../File/ASN1/Maps/RSAPrivateKey.php | 41 +- .../phpseclib/File/ASN1/Maps/RSAPublicKey.php | 11 +- .../File/ASN1/Maps/RSASSA_PSS_params.php | 35 +- .../phpseclib/File/ASN1/Maps/ReasonFlags.php | 18 +- .../ASN1/Maps/RelativeDistinguishedName.php | 10 +- .../File/ASN1/Maps/RevokedCertificate.php | 14 +- .../ASN1/Maps/SignedPublicKeyAndChallenge.php | 12 +- .../File/ASN1/Maps/SpecifiedECDomain.php | 22 +- .../File/ASN1/Maps/SubjectAltName.php | 2 +- .../ASN1/Maps/SubjectDirectoryAttributes.php | 10 +- .../ASN1/Maps/SubjectInfoAccessSyntax.php | 10 +- .../File/ASN1/Maps/SubjectPublicKeyInfo.php | 11 +- .../phpseclib/File/ASN1/Maps/TBSCertList.php | 33 +- .../File/ASN1/Maps/TBSCertificate.php | 59 +- .../File/ASN1/Maps/TerminalIdentifier.php | 3 +- .../phpseclib/File/ASN1/Maps/Time.php | 11 +- .../phpseclib/File/ASN1/Maps/Trinomial.php | 3 +- .../File/ASN1/Maps/UniqueIdentifier.php | 3 +- .../phpseclib/File/ASN1/Maps/UserNotice.php | 17 +- .../phpseclib/File/ASN1/Maps/Validity.php | 11 +- .../File/ASN1/Maps/netscape_ca_policy_url.php | 3 +- .../File/ASN1/Maps/netscape_cert_type.php | 17 +- .../File/ASN1/Maps/netscape_comment.php | 3 +- .../phpseclib/phpseclib/File/X509.php | 1784 ++++++++----- .../phpseclib/phpseclib/Math/BigInteger.php | 141 +- .../Math/BigInteger/Engines/BCMath.php | 208 +- .../Math/BigInteger/Engines/BCMath/Base.php | 13 +- .../BigInteger/Engines/BCMath/BuiltIn.php | 6 +- .../Engines/BCMath/DefaultEngine.php | 3 +- .../BigInteger/Engines/BCMath/OpenSSL.php | 3 +- .../Engines/BCMath/Reductions/Barrett.php | 127 +- .../Engines/BCMath/Reductions/EvalBarrett.php | 29 +- .../Math/BigInteger/Engines/Engine.php | 520 ++-- .../phpseclib/Math/BigInteger/Engines/GMP.php | 155 +- .../BigInteger/Engines/GMP/DefaultEngine.php | 6 +- .../Math/BigInteger/Engines/OpenSSL.php | 23 +- .../phpseclib/Math/BigInteger/Engines/PHP.php | 628 +++-- .../Math/BigInteger/Engines/PHP/Base.php | 13 +- .../BigInteger/Engines/PHP/DefaultEngine.php | 3 +- .../BigInteger/Engines/PHP/Montgomery.php | 18 +- .../Math/BigInteger/Engines/PHP/OpenSSL.php | 3 +- .../Engines/PHP/Reductions/Barrett.php | 166 +- .../Engines/PHP/Reductions/Classic.php | 3 +- .../Engines/PHP/Reductions/EvalBarrett.php | 152 +- .../Engines/PHP/Reductions/Montgomery.php | 56 +- .../Engines/PHP/Reductions/MontgomeryMult.php | 37 +- .../Engines/PHP/Reductions/PowerOfTwo.php | 6 +- .../Math/BigInteger/Engines/PHP32.php | 63 +- .../Math/BigInteger/Engines/PHP64.php | 61 +- .../phpseclib/phpseclib/Math/BinaryField.php | 81 +- .../phpseclib/Math/BinaryField/Integer.php | 225 +- .../phpseclib/Math/Common/FiniteField.php | 2 +- .../Math/Common/FiniteField/Integer.php | 7 +- .../phpseclib/phpseclib/Math/PrimeField.php | 13 +- .../phpseclib/Math/PrimeField/Integer.php | 78 +- .../phpseclib/phpseclib/Net/SFTP.php | 1727 +++++++----- .../phpseclib/phpseclib/Net/SFTP/Stream.php | 310 ++- .../phpseclib/phpseclib/Net/SSH2.php | 2313 +++++++++++------ .../phpseclib/phpseclib/System/SSH/Agent.php | 83 +- .../phpseclib/System/SSH/Agent/Identity.php | 57 +- .../System/SSH/Common/Traits/ReadBytes.php | 8 +- .../phpseclib/phpseclib/bootstrap.php | 12 +- 336 files changed, 16780 insertions(+), 7609 deletions(-) diff --git a/composer/phpseclib/phpseclib/phpseclib/Common/Functions/Strings.php b/composer/phpseclib/phpseclib/phpseclib/Common/Functions/Strings.php index c23fad0..402e0ad 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Common/Functions/Strings.php +++ b/composer/phpseclib/phpseclib/phpseclib/Common/Functions/Strings.php @@ -10,6 +10,7 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Common\Functions; use OCA\Libresign\Vendor\ParagonIE\ConstantTime\Base64; @@ -17,11 +18,11 @@ use OCA\Libresign\Vendor\ParagonIE\ConstantTime\Hex; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; use OCA\Libresign\Vendor\phpseclib3\Math\Common\FiniteField; + /** * Common String Functions * * @author Jim Wigginton - * @internal */ abstract class Strings { @@ -36,10 +37,11 @@ abstract class Strings */ public static function shift(&$string, $index = 1) { - $substr = \substr($string, 0, $index); - $string = \substr($string, $index); + $substr = substr($string, 0, $index); + $string = substr($string, $index); return $substr; } + /** * String Pop * @@ -51,10 +53,11 @@ public static function shift(&$string, $index = 1) */ public static function pop(&$string, $index = 1) { - $substr = \substr($string, -$index); - $string = \substr($string, 0, -$index); + $substr = substr($string, -$index); + $string = substr($string, 0, -$index); return $substr; } + /** * Parse SSH2-style string * @@ -80,11 +83,11 @@ public static function unpackSSH2($format, &$data) { $format = self::formatPack($format); $result = []; - for ($i = 0; $i < \strlen($format); $i++) { + for ($i = 0; $i < strlen($format); $i++) { switch ($format[$i]) { case 'C': case 'b': - if (!\strlen($data)) { + if (!strlen($data)) { throw new \LengthException('At least one byte needs to be present for successful C / b decodes'); } break; @@ -92,27 +95,28 @@ public static function unpackSSH2($format, &$data) case 'i': case 's': case 'L': - if (\strlen($data) < 4) { + if (strlen($data) < 4) { throw new \LengthException('At least four byte needs to be present for successful N / i / s / L decodes'); } break; case 'Q': - if (\strlen($data) < 8) { + if (strlen($data) < 8) { throw new \LengthException('At least eight byte needs to be present for successful N / i / s / L decodes'); } break; + default: throw new \InvalidArgumentException('$format contains an invalid character'); } switch ($format[$i]) { case 'C': - $result[] = \ord(self::shift($data)); + $result[] = ord(self::shift($data)); continue 2; case 'b': - $result[] = \ord(self::shift($data)) != 0; + $result[] = ord(self::shift($data)) != 0; continue 2; case 'N': - list(, $temp) = \unpack('N', self::shift($data, 4)); + list(, $temp) = unpack('N', self::shift($data, 4)); $result[] = $temp; continue 2; case 'Q': @@ -122,18 +126,18 @@ public static function unpackSSH2($format, &$data) // 64-bit floats can be used to get larger numbers then 32-bit signed ints would allow // for. sure, you're not gonna get the full precision of 64-bit numbers but just because // you need > 32-bit precision doesn't mean you need the full 64-bit precision - $unpacked = \unpack('Nupper/Nlower', self::shift($data, 8)); + $unpacked = unpack('Nupper/Nlower', self::shift($data, 8)); $upper = $unpacked['upper']; $lower = $unpacked['lower']; $temp = $upper ? 4294967296 * $upper : 0; - $temp += $lower < 0 ? ($lower & 0x7ffffffff) + 0x80000000 : $lower; + $temp += $lower < 0 ? ($lower & 0x7FFFFFFFF) + 0x80000000 : $lower; // $temp = hexdec(bin2hex(self::shift($data, 8))); $result[] = $temp; continue 2; } - list(, $length) = \unpack('N', self::shift($data, 4)); - if (\strlen($data) < $length) { - throw new \LengthException("{$length} bytes needed; " . \strlen($data) . ' bytes available'); + list(, $length) = unpack('N', self::shift($data, 4)); + if (strlen($data) < $length) { + throw new \LengthException("$length bytes needed; " . strlen($data) . ' bytes available'); } $temp = self::shift($data, $length); switch ($format[$i]) { @@ -144,11 +148,13 @@ public static function unpackSSH2($format, &$data) $result[] = $temp; break; case 'L': - $result[] = \explode(',', $temp); + $result[] = explode(',', $temp); } } + return $result; } + /** * Create SSH2-style string * @@ -159,60 +165,60 @@ public static function unpackSSH2($format, &$data) public static function packSSH2($format, ...$elements) { $format = self::formatPack($format); - if (\strlen($format) != \count($elements)) { + if (strlen($format) != count($elements)) { throw new \InvalidArgumentException('There must be as many arguments as there are characters in the $format string'); } $result = ''; - for ($i = 0; $i < \strlen($format); $i++) { + for ($i = 0; $i < strlen($format); $i++) { $element = $elements[$i]; switch ($format[$i]) { case 'C': - if (!\is_int($element)) { + if (!is_int($element)) { throw new \InvalidArgumentException('Bytes must be represented as an integer between 0 and 255, inclusive.'); } - $result .= \pack('C', $element); + $result .= pack('C', $element); break; case 'b': - if (!\is_bool($element)) { + if (!is_bool($element)) { throw new \InvalidArgumentException('A boolean parameter was expected.'); } - $result .= $element ? "\x01" : "\x00"; + $result .= $element ? "\1" : "\0"; break; case 'Q': - if (!\is_int($element) && !\is_float($element)) { + if (!is_int($element) && !is_float($element)) { throw new \InvalidArgumentException('An integer was expected.'); } // 4294967296 == 1 << 32 - $result .= \pack('NN', $element / 4294967296, $element); + $result .= pack('NN', $element / 4294967296, $element); break; case 'N': - if (\is_float($element)) { + if (is_float($element)) { $element = (int) $element; } - if (!\is_int($element)) { + if (!is_int($element)) { throw new \InvalidArgumentException('An integer was expected.'); } - $result .= \pack('N', $element); + $result .= pack('N', $element); break; case 's': if (!self::is_stringable($element)) { throw new \InvalidArgumentException('A string was expected.'); } - $result .= \pack('Na*', \strlen($element), $element); + $result .= pack('Na*', strlen($element), $element); break; case 'i': if (!$element instanceof BigInteger && !$element instanceof FiniteField\Integer) { - throw new \InvalidArgumentException('A phpseclib3\\Math\\BigInteger or phpseclib3\\Math\\Common\\FiniteField\\Integer object was expected.'); + throw new \InvalidArgumentException('A phpseclib3\Math\BigInteger or phpseclib3\Math\Common\FiniteField\Integer object was expected.'); } - $element = $element->toBytes(\true); - $result .= \pack('Na*', \strlen($element), $element); + $element = $element->toBytes(true); + $result .= pack('Na*', strlen($element), $element); break; case 'L': - if (!\is_array($element)) { + if (!is_array($element)) { throw new \InvalidArgumentException('An array was expected.'); } - $element = \implode(',', $element); - $result .= \pack('Na*', \strlen($element), $element); + $element = implode(',', $element); + $result .= pack('Na*', strlen($element), $element); break; default: throw new \InvalidArgumentException('$format contains an invalid character'); @@ -220,6 +226,7 @@ public static function packSSH2($format, ...$elements) } return $result; } + /** * Expand a pack string * @@ -230,14 +237,16 @@ public static function packSSH2($format, ...$elements) */ private static function formatPack($format) { - $parts = \preg_split('#(\\d+)#', $format, -1, \PREG_SPLIT_DELIM_CAPTURE); + $parts = preg_split('#(\d+)#', $format, -1, PREG_SPLIT_DELIM_CAPTURE); $format = ''; - for ($i = 1; $i < \count($parts); $i += 2) { - $format .= \substr($parts[$i - 1], 0, -1) . \str_repeat(\substr($parts[$i - 1], -1), $parts[$i]); + for ($i = 1; $i < count($parts); $i += 2) { + $format .= substr($parts[$i - 1], 0, -1) . str_repeat(substr($parts[$i - 1], -1), $parts[$i]); } $format .= $parts[$i - 1]; + return $format; } + /** * Convert binary data into bits * @@ -257,37 +266,45 @@ public static function bits2bin($x) return strlen($x) ? gmp_export(gmp_init($x, 2)) : gmp_init(0); } */ - if (\preg_match('#[^01]#', $x)) { + + if (preg_match('#[^01]#', $x)) { throw new \RuntimeException('The only valid characters are 0 and 1'); } - if (!\defined('PHP_INT_MIN')) { - \define('PHP_INT_MIN', ~\PHP_INT_MAX); + + if (!defined('PHP_INT_MIN')) { + define('PHP_INT_MIN', ~PHP_INT_MAX); } - $length = \strlen($x); + + $length = strlen($x); if (!$length) { return ''; } - $block_size = \PHP_INT_SIZE << 3; - $pad = $block_size - $length % $block_size; + $block_size = PHP_INT_SIZE << 3; + $pad = $block_size - ($length % $block_size); if ($pad != $block_size) { - $x = \str_repeat('0', $pad) . $x; + $x = str_repeat('0', $pad) . $x; } - $parts = \str_split($x, $block_size); + + $parts = str_split($x, $block_size); $str = ''; foreach ($parts as $part) { - $xor = $part[0] == '1' ? \PHP_INT_MIN : 0; + $xor = $part[0] == '1' ? PHP_INT_MIN : 0; $part[0] = '0'; - $str .= \pack(\PHP_INT_SIZE == 4 ? 'N' : 'J', $xor ^ eval('return 0b' . $part . ';')); + $str .= pack( + PHP_INT_SIZE == 4 ? 'N' : 'J', + $xor ^ eval('return 0b' . $part . ';') + ); } - return \ltrim($str, "\x00"); + return ltrim($str, "\0"); } + /** * Convert bits to binary data * * @param string $x * @return string */ - public static function bin2bits($x, $trim = \true) + public static function bin2bits($x, $trim = true) { /* // the pure-PHP approach is slower than the GMP approach BUT @@ -296,25 +313,29 @@ public static function bin2bits($x, $trim = \true) return gmp_strval(gmp_import($x), 2); } */ - $len = \strlen($x); - $mod = $len % \PHP_INT_SIZE; + + $len = strlen($x); + $mod = $len % PHP_INT_SIZE; if ($mod) { - $x = \str_pad($x, $len + \PHP_INT_SIZE - $mod, "\x00", \STR_PAD_LEFT); + $x = str_pad($x, $len + PHP_INT_SIZE - $mod, "\0", STR_PAD_LEFT); } + $bits = ''; - if (\PHP_INT_SIZE == 4) { - $digits = \unpack('N*', $x); + if (PHP_INT_SIZE == 4) { + $digits = unpack('N*', $x); foreach ($digits as $digit) { - $bits .= \sprintf('%032b', $digit); + $bits .= sprintf('%032b', $digit); } } else { - $digits = \unpack('J*', $x); + $digits = unpack('J*', $x); foreach ($digits as $digit) { - $bits .= \sprintf('%064b', $digit); + $bits .= sprintf('%064b', $digit); } } - return $trim ? \ltrim($bits, '0') : $bits; + + return $trim ? ltrim($bits, '0') : $bits; } + /** * Switch Endianness Bit Order * @@ -324,22 +345,25 @@ public static function bin2bits($x, $trim = \true) public static function switchEndianness($x) { $r = ''; - for ($i = \strlen($x) - 1; $i >= 0; $i--) { - $b = \ord($x[$i]); - if (\PHP_INT_SIZE === 8) { + for ($i = strlen($x) - 1; $i >= 0; $i--) { + $b = ord($x[$i]); + if (PHP_INT_SIZE === 8) { // 3 operations // from http://graphics.stanford.edu/~seander/bithacks.html#ReverseByteWith64BitsDiv - $r .= \chr(($b * 0x202020202 & 0x10884422010) % 1023); + $r .= chr((($b * 0x0202020202) & 0x010884422010) % 1023); } else { // 7 operations // from http://graphics.stanford.edu/~seander/bithacks.html#ReverseByteWith32Bits - $p1 = $b * 0x802 & 0x22110; - $p2 = $b * 0x8020 & 0x88440; - $r .= \chr(($p1 | $p2) * 0x10101 >> 16); + $p1 = ($b * 0x0802) & 0x22110; + $p2 = ($b * 0x8020) & 0x88440; + $r .= chr( + (($p1 | $p2) * 0x10101) >> 16 + ); } } return $r; } + /** * Increment the current string * @@ -348,36 +372,42 @@ public static function switchEndianness($x) */ public static function increment_str(&$var) { - if (\function_exists('sodium_increment')) { - $var = \strrev($var); - \sodium_increment($var); - $var = \strrev($var); + if (function_exists('sodium_increment')) { + $var = strrev($var); + sodium_increment($var); + $var = strrev($var); return $var; } - for ($i = 4; $i <= \strlen($var); $i += 4) { - $temp = \substr($var, -$i, 4); + + for ($i = 4; $i <= strlen($var); $i += 4) { + $temp = substr($var, -$i, 4); switch ($temp) { - case "\xff\xff\xff\xff": - $var = \substr_replace($var, "\x00\x00\x00\x00", -$i, 4); + case "\xFF\xFF\xFF\xFF": + $var = substr_replace($var, "\x00\x00\x00\x00", -$i, 4); break; - case "\xff\xff\xff": - $var = \substr_replace($var, "\x80\x00\x00\x00", -$i, 4); + case "\x7F\xFF\xFF\xFF": + $var = substr_replace($var, "\x80\x00\x00\x00", -$i, 4); return $var; default: - $temp = \unpack('Nnum', $temp); - $var = \substr_replace($var, \pack('N', $temp['num'] + 1), -$i, 4); + $temp = unpack('Nnum', $temp); + $var = substr_replace($var, pack('N', $temp['num'] + 1), -$i, 4); return $var; } } - $remainder = \strlen($var) % 4; + + $remainder = strlen($var) % 4; + if ($remainder == 0) { return $var; } - $temp = \unpack('Nnum', \str_pad(\substr($var, 0, $remainder), 4, "\x00", \STR_PAD_LEFT)); - $temp = \substr(\pack('N', $temp['num'] + 1), -$remainder); - $var = \substr_replace($var, $temp, 0, $remainder); + + $temp = unpack('Nnum', str_pad(substr($var, 0, $remainder), 4, "\0", STR_PAD_LEFT)); + $temp = substr(pack('N', $temp['num'] + 1), -$remainder); + $var = substr_replace($var, $temp, 0, $remainder); + return $var; } + /** * Find whether the type of a variable is string (or could be converted to one) * @@ -387,8 +417,9 @@ public static function increment_str(&$var) */ public static function is_stringable($var) { - return \is_string($var) || \is_object($var) && \method_exists($var, '__toString'); + return is_string($var) || (is_object($var) && method_exists($var, '__toString')); } + /** * Constant Time Base64-decoding * @@ -400,8 +431,11 @@ public static function is_stringable($var) */ public static function base64_decode($data) { - return \function_exists('sodium_base642bin') ? \sodium_base642bin($data, \SODIUM_BASE64_VARIANT_ORIGINAL_NO_PADDING, '=') : Base64::decode($data); + return function_exists('sodium_base642bin') ? + sodium_base642bin($data, SODIUM_BASE64_VARIANT_ORIGINAL_NO_PADDING, '=') : + Base64::decode($data); } + /** * Constant Time Base64-decoding (URL safe) * @@ -411,8 +445,12 @@ public static function base64_decode($data) public static function base64url_decode($data) { // return self::base64_decode(str_replace(['-', '_'], ['+', '/'], $data)); - return \function_exists('sodium_base642bin') ? \sodium_base642bin($data, \SODIUM_BASE64_VARIANT_URLSAFE_NO_PADDING, '=') : Base64UrlSafe::decode($data); + + return function_exists('sodium_base642bin') ? + sodium_base642bin($data, SODIUM_BASE64_VARIANT_URLSAFE_NO_PADDING, '=') : + Base64UrlSafe::decode($data); } + /** * Constant Time Base64-encoding * @@ -421,8 +459,11 @@ public static function base64url_decode($data) */ public static function base64_encode($data) { - return \function_exists('sodium_bin2base64') ? \sodium_bin2base64($data, \SODIUM_BASE64_VARIANT_ORIGINAL) : Base64::encode($data); + return function_exists('sodium_bin2base64') ? + sodium_bin2base64($data, SODIUM_BASE64_VARIANT_ORIGINAL) : + Base64::encode($data); } + /** * Constant Time Base64-encoding (URL safe) * @@ -432,8 +473,12 @@ public static function base64_encode($data) public static function base64url_encode($data) { // return str_replace(['+', '/'], ['-', '_'], self::base64_encode($data)); - return \function_exists('sodium_bin2base64') ? \sodium_bin2base64($data, \SODIUM_BASE64_VARIANT_URLSAFE_NO_PADDING) : Base64UrlSafe::encode($data); + + return function_exists('sodium_bin2base64') ? + sodium_bin2base64($data, SODIUM_BASE64_VARIANT_URLSAFE_NO_PADDING) : + Base64UrlSafe::encode($data); } + /** * Constant Time Hex Decoder * @@ -442,8 +487,11 @@ public static function base64url_encode($data) */ public static function hex2bin($data) { - return \function_exists('sodium_hex2bin') ? \sodium_hex2bin($data) : Hex::decode($data); + return function_exists('sodium_hex2bin') ? + sodium_hex2bin($data) : + Hex::decode($data); } + /** * Constant Time Hex Encoder * @@ -452,6 +500,8 @@ public static function hex2bin($data) */ public static function bin2hex($data) { - return \function_exists('sodium_bin2hex') ? \sodium_bin2hex($data) : Hex::encode($data); + return function_exists('sodium_bin2hex') ? + sodium_bin2hex($data) : + Hex::encode($data); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/AES.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/AES.php index 6367b97..1dd6a61 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/AES.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/AES.php @@ -44,13 +44,13 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt; /** * Pure-PHP implementation of AES. * * @author Jim Wigginton - * @internal */ class AES extends Rijndael { @@ -67,6 +67,7 @@ public function setBlockLength($length) { throw new \BadMethodCallException('The block length cannot be set for AES.'); } + /** * Sets the key length * @@ -88,6 +89,7 @@ public function setKeyLength($length) } parent::setKeyLength($length); } + /** * Sets the key. * @@ -100,14 +102,15 @@ public function setKeyLength($length) */ public function setKey($key) { - switch (\strlen($key)) { + switch (strlen($key)) { case 16: case 24: case 32: break; default: - throw new \LengthException('Key of size ' . \strlen($key) . ' not supported by this algorithm. Only keys of sizes 16, 24 or 32 supported'); + throw new \LengthException('Key of size ' . strlen($key) . ' not supported by this algorithm. Only keys of sizes 16, 24 or 32 supported'); } + parent::setKey($key); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/Blowfish.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/Blowfish.php index 4cf9d0e..ad2d669 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/Blowfish.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/Blowfish.php @@ -113,15 +113,16 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt; use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\BlockCipher; + /** * Pure-PHP implementation of Blowfish. * * @author Jim Wigginton * @author Hans-Juergen Petrich - * @internal */ class Blowfish extends BlockCipher { @@ -132,6 +133,7 @@ class Blowfish extends BlockCipher * @var int */ protected $block_size = 8; + /** * The mcrypt specific name of the cipher * @@ -139,6 +141,7 @@ class Blowfish extends BlockCipher * @var string */ protected $cipher_name_mcrypt = 'blowfish'; + /** * Optimizing value while CFB-encrypting * @@ -146,6 +149,7 @@ class Blowfish extends BlockCipher * @var int */ protected $cfb_init_len = 500; + /** * The fixed subkeys boxes * @@ -153,13 +157,151 @@ class Blowfish extends BlockCipher * * @var array */ - private static $sbox = [0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, 0x24a19947, 0xb3916cf7, 0x801f2e2, 0x858efc16, 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, 0xd95748f, 0x728eb658, 0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0xf6d6ff3, 0x83f44239, 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, 0x75372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x4c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 0x250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x2e5b9c5, 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x8ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, 0x53b02d5d, 0xa99f8fa1, 0x8ba4799, 0x6e85076a, 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x21ecc5e, 0x9686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x200b3ff, 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, 0xa9446146, 0xfd0030e, 0xecc8c73e, 0xa4751e41, 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, 0x43556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x18cff28, 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, 0x334fe1e, 0xaa0363cf, 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, 0xe358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, 0x95bbf00, 0xad19489d, 0x1462b174, 0x23820e00, 0x58428d2a, 0xc55f5ea, 0x1dadf43e, 0x233f7061, 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, 0x9e447a2e, 0xc3453484, 0xfdd56705, 0xe1e9ec9, 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7, 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x3bd9785, 0x7fac6dd0, 0x31cb8504, 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, 0x28507825, 0x530429f4, 0xa2c86da, 0xe9b66dfb, 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, 0xfdf8e802, 0x4272f70, 0x80bb155c, 0x5282ce3, 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, 0x7f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 0xe12b4c2, 0x2e1329e, 0xaf664fd1, 0xcad18115, 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, 0xa476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, 0x6a124237, 0xb79251e7, 0x6a1bbe6, 0x4bfb6350, 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, 0x44421659, 0xa121386, 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, 0xe85a1f02, 0x9f0be8c, 0x4a99a025, 0x1d6efe10, 0x1ab93d1d, 0xba5a4df, 0xa186f20f, 0x2868f169, 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa, 0xa002b5c4, 0xde6d027, 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, 0x6058aa, 0x30dc7d62, 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, 0xed545578, 0x8fca5b5, 0xd83d7cd3, 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0, 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x22b8b51, 0x96d5ac3a, 0x17da67d, 0xd1cf3ed6, 0x7c7d2d28, 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba, 0x3a16125, 0x564f0bd, 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, 0x7533d928, 0xb155fdf5, 0x3563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x9072166, 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x115af84, 0xe1b00428, 0x95983a1d, 0x6b89fb4, 0xce6ea048, 0x6f3f3b82, 0x3520ab82, 0x11a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, 0x339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a, 0xf91fc71, 0x9b941525, 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0xfe3f11d, 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x2fb8a8c, 0x1c36ae4, 0xd6ebe1f9, 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6]; + private static $sbox = [ + 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, + 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, + 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, + 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, + 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, + 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, + 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, + 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, + 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, + 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, + 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, + 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, + 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, + 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, + 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, + 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, + 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, + 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, + 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, + 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, + 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, + 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, + 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, + 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, + 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, + 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, + 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, + 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, + 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, + 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, + 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, + 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a, + + 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, + 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, + 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, + 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, + 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, + 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, + 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, + 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, + 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, + 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, + 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, + 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, + 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, + 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, + 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, + 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, + 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, + 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, + 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, + 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, + 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, + 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, + 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, + 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, + 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, + 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, + 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, + 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, + 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, + 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, + 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, + 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7, + + 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, + 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, + 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, + 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, + 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, + 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, + 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, + 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, + 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, + 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, + 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, + 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, + 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, + 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, + 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, + 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, + 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, + 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, + 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, + 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, + 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, + 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, + 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, + 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, + 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, + 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, + 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, + 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, + 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, + 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, + 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, + 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0, + + 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, + 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, + 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, + 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, + 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, + 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, + 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, + 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, + 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, + 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, + 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, + 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, + 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, + 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, + 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, + 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, + 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, + 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, + 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, + 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, + 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, + 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, + 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, + 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, + 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, + 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, + 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, + 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, + 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, + 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, + 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, + 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6 + ]; + /** * P-Array consists of 18 32-bit subkeys * * @var array */ - private static $parray = [0x243f6a88, 0x85a308d3, 0x13198a2e, 0x3707344, 0xa4093822, 0x299f31d0, 0x82efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979fb1b]; + private static $parray = [ + 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0, + 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, + 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979fb1b + ]; + /** * The BCTX-working Array * @@ -168,12 +310,14 @@ class Blowfish extends BlockCipher * @var array */ private $bctx; + /** * Holds the last used key * * @var array */ private $kl; + /** * The Key Length (in bytes) * {@internal The max value is 256 / 8 = 32, the min value is 128 / 8 = 16. Exists in conjunction with $Nk @@ -185,6 +329,7 @@ class Blowfish extends BlockCipher * @var int */ protected $key_length = 16; + /** * Default Constructor. * @@ -194,10 +339,12 @@ class Blowfish extends BlockCipher public function __construct($mode) { parent::__construct($mode); + if ($this->mode == self::MODE_STREAM) { throw new \InvalidArgumentException('Block ciphers cannot be ran in stream mode'); } } + /** * Sets the key length. * @@ -208,11 +355,14 @@ public function __construct($mode) public function setKeyLength($length) { if ($length < 32 || $length > 448) { - throw new \LengthException('Key size of ' . $length . ' bits is not supported by this algorithm. Only keys of sizes between 32 and 448 bits are supported'); + throw new \LengthException('Key size of ' . $length . ' bits is not supported by this algorithm. Only keys of sizes between 32 and 448 bits are supported'); } + $this->key_length = $length >> 3; + parent::setKeyLength($length); } + /** * Test for engine validity * @@ -226,19 +376,21 @@ protected function isValidEngineHelper($engine) { if ($engine == self::ENGINE_OPENSSL) { if ($this->key_length < 16) { - return \false; + return false; } // quoting https://www.openssl.org/news/openssl-3.0-notes.html, OpenSSL 3.0.1 // "Moved all variations of the EVP ciphers CAST5, BF, IDEA, SEED, RC2, RC4, RC5, and DES to the legacy provider" // in theory openssl_get_cipher_methods() should catch this but, on GitHub Actions, at least, it does not - if (\defined('OPENSSL_VERSION_TEXT') && \version_compare(\preg_replace('#OpenSSL (\\d+\\.\\d+\\.\\d+) .*#', '$1', \OPENSSL_VERSION_TEXT), '3.0.1', '>=')) { - return \false; + if (defined('OPENSSL_VERSION_TEXT') && version_compare(preg_replace('#OpenSSL (\d+\.\d+\.\d+) .*#', '$1', OPENSSL_VERSION_TEXT), '3.0.1', '>=')) { + return false; } $this->cipher_name_openssl_ecb = 'bf-ecb'; $this->cipher_name_openssl = 'bf-' . $this->openssl_translate_mode(); } + return parent::isValidEngineHelper($engine); } + /** * Setup the key (expansion) * @@ -251,49 +403,58 @@ protected function setupKey() return; } $this->kl = ['key' => $this->key]; + /* key-expanding p[] and S-Box building sb[] */ - $this->bctx = ['p' => [], 'sb' => self::$sbox]; + $this->bctx = [ + 'p' => [], + 'sb' => self::$sbox + ]; + // unpack binary string in unsigned chars - $key = \array_values(\unpack('C*', $this->key)); - $keyl = \count($key); + $key = array_values(unpack('C*', $this->key)); + $keyl = count($key); // with bcrypt $keyl will always be 16 (because the key is the sha512 of the key you provide) for ($j = 0, $i = 0; $i < 18; ++$i) { // xor P1 with the first 32-bits of the key, xor P2 with the second 32-bits ... for ($data = 0, $k = 0; $k < 4; ++$k) { - $data = $data << 8 | $key[$j]; + $data = ($data << 8) | $key[$j]; if (++$j >= $keyl) { $j = 0; } } - $this->bctx['p'][] = self::$parray[$i] ^ \intval($data); + $this->bctx['p'][] = self::$parray[$i] ^ intval($data); } + // encrypt the zero-string, replace P1 and P2 with the encrypted data, // encrypt P3 and P4 with the new P1 and P2, do it with all P-array and subkeys - $data = "\x00\x00\x00\x00\x00\x00\x00\x00"; + $data = "\0\0\0\0\0\0\0\0"; for ($i = 0; $i < 18; $i += 2) { - list($l, $r) = \array_values(\unpack('N*', $data = $this->encryptBlock($data))); - $this->bctx['p'][$i] = $l; + list($l, $r) = array_values(unpack('N*', $data = $this->encryptBlock($data))); + $this->bctx['p'][$i ] = $l; $this->bctx['p'][$i + 1] = $r; } for ($i = 0; $i < 0x400; $i += 0x100) { for ($j = 0; $j < 256; $j += 2) { - list($l, $r) = \array_values(\unpack('N*', $data = $this->encryptBlock($data))); + list($l, $r) = array_values(unpack('N*', $data = $this->encryptBlock($data))); $this->bctx['sb'][$i | $j] = $l; - $this->bctx['sb'][$i | $j + 1] = $r; + $this->bctx['sb'][$i | ($j + 1)] = $r; } } } + /** * Initialize Static Variables */ protected static function initialize_static_variables() { - if (\is_float(self::$sbox[0x200])) { - self::$sbox = \array_map('intval', self::$sbox); - self::$parray = \array_map('intval', self::$parray); + if (is_float(self::$sbox[0x200])) { + self::$sbox = array_map('intval', self::$sbox); + self::$parray = array_map('intval', self::$parray); } + parent::initialize_static_variables(); } + /** * bcrypt * @@ -306,22 +467,26 @@ private static function bcrypt_hash($sha2pass, $sha2salt) { $p = self::$parray; $sbox = self::$sbox; - $cdata = \array_values(\unpack('N*', 'OxychromaticBlowfishSwatDynamite')); - $sha2pass = \array_values(\unpack('N*', $sha2pass)); - $sha2salt = \array_values(\unpack('N*', $sha2salt)); + + $cdata = array_values(unpack('N*', 'OxychromaticBlowfishSwatDynamite')); + $sha2pass = array_values(unpack('N*', $sha2pass)); + $sha2salt = array_values(unpack('N*', $sha2salt)); + self::expandstate($sha2salt, $sha2pass, $sbox, $p); for ($i = 0; $i < 64; $i++) { self::expand0state($sha2salt, $sbox, $p); self::expand0state($sha2pass, $sbox, $p); } + for ($i = 0; $i < 64; $i++) { - for ($j = 0; $j < 8; $j += 2) { - // count($cdata) == 8 + for ($j = 0; $j < 8; $j += 2) { // count($cdata) == 8 list($cdata[$j], $cdata[$j + 1]) = self::encryptBlockHelperFast($cdata[$j], $cdata[$j + 1], $sbox, $p); } } - return \pack('V*', ...$cdata); + + return pack('V*', ...$cdata); } + /** * Performs OpenSSH-style bcrypt * @@ -335,18 +500,20 @@ private static function bcrypt_hash($sha2pass, $sha2salt) public static function bcrypt_pbkdf($pass, $salt, $keylen, $rounds) { self::initialize_static_variables(); - if (\PHP_INT_SIZE == 4) { + + if (PHP_INT_SIZE == 4) { throw new \RuntimeException('bcrypt is far too slow to be practical on 32-bit versions of PHP'); } - $sha2pass = \hash('sha512', $pass, \true); + + $sha2pass = hash('sha512', $pass, true); $results = []; $count = 1; - while (32 * \count($results) < $keylen) { - $countsalt = $salt . \pack('N', $count++); - $sha2salt = \hash('sha512', $countsalt, \true); + while (32 * count($results) < $keylen) { + $countsalt = $salt . pack('N', $count++); + $sha2salt = hash('sha512', $countsalt, true); $out = $tmpout = self::bcrypt_hash($sha2pass, $sha2salt); for ($i = 1; $i < $rounds; $i++) { - $sha2salt = \hash('sha512', $tmpout, \true); + $sha2salt = hash('sha512', $tmpout, true); $tmpout = self::bcrypt_hash($sha2pass, $sha2salt); $out ^= $tmpout; } @@ -358,8 +525,9 @@ public static function bcrypt_pbkdf($pass, $salt, $keylen, $rounds) $output .= $result[$i]; } } - return \substr($output, 0, $keylen); + return substr($output, 0, $keylen); } + /** * Key expansion without salt * @@ -374,23 +542,46 @@ private static function expand0state(array $key, array &$sbox, array &$p) // expand0state is basically the same thing as this: //return self::expandstate(array_fill(0, 16, 0), $key); // but this separate function eliminates a bunch of XORs and array lookups - $p = [$p[0] ^ $key[0], $p[1] ^ $key[1], $p[2] ^ $key[2], $p[3] ^ $key[3], $p[4] ^ $key[4], $p[5] ^ $key[5], $p[6] ^ $key[6], $p[7] ^ $key[7], $p[8] ^ $key[8], $p[9] ^ $key[9], $p[10] ^ $key[10], $p[11] ^ $key[11], $p[12] ^ $key[12], $p[13] ^ $key[13], $p[14] ^ $key[14], $p[15] ^ $key[15], $p[16] ^ $key[0], $p[17] ^ $key[1]]; + + $p = [ + $p[0] ^ $key[0], + $p[1] ^ $key[1], + $p[2] ^ $key[2], + $p[3] ^ $key[3], + $p[4] ^ $key[4], + $p[5] ^ $key[5], + $p[6] ^ $key[6], + $p[7] ^ $key[7], + $p[8] ^ $key[8], + $p[9] ^ $key[9], + $p[10] ^ $key[10], + $p[11] ^ $key[11], + $p[12] ^ $key[12], + $p[13] ^ $key[13], + $p[14] ^ $key[14], + $p[15] ^ $key[15], + $p[16] ^ $key[0], + $p[17] ^ $key[1] + ]; + // @codingStandardsIgnoreStart - list($p[0], $p[1]) = self::encryptBlockHelperFast(0, 0, $sbox, $p); - list($p[2], $p[3]) = self::encryptBlockHelperFast($p[0], $p[1], $sbox, $p); - list($p[4], $p[5]) = self::encryptBlockHelperFast($p[2], $p[3], $sbox, $p); - list($p[6], $p[7]) = self::encryptBlockHelperFast($p[4], $p[5], $sbox, $p); - list($p[8], $p[9]) = self::encryptBlockHelperFast($p[6], $p[7], $sbox, $p); - list($p[10], $p[11]) = self::encryptBlockHelperFast($p[8], $p[9], $sbox, $p); + list( $p[0], $p[1]) = self::encryptBlockHelperFast( 0, 0, $sbox, $p); + list( $p[2], $p[3]) = self::encryptBlockHelperFast($p[ 0], $p[ 1], $sbox, $p); + list( $p[4], $p[5]) = self::encryptBlockHelperFast($p[ 2], $p[ 3], $sbox, $p); + list( $p[6], $p[7]) = self::encryptBlockHelperFast($p[ 4], $p[ 5], $sbox, $p); + list( $p[8], $p[9]) = self::encryptBlockHelperFast($p[ 6], $p[ 7], $sbox, $p); + list($p[10], $p[11]) = self::encryptBlockHelperFast($p[ 8], $p[ 9], $sbox, $p); list($p[12], $p[13]) = self::encryptBlockHelperFast($p[10], $p[11], $sbox, $p); list($p[14], $p[15]) = self::encryptBlockHelperFast($p[12], $p[13], $sbox, $p); list($p[16], $p[17]) = self::encryptBlockHelperFast($p[14], $p[15], $sbox, $p); // @codingStandardsIgnoreEnd + list($sbox[0], $sbox[1]) = self::encryptBlockHelperFast($p[16], $p[17], $sbox, $p); for ($i = 2; $i < 1024; $i += 2) { list($sbox[$i], $sbox[$i + 1]) = self::encryptBlockHelperFast($sbox[$i - 2], $sbox[$i - 1], $sbox, $p); } } + /** * Key expansion with salt * @@ -403,24 +594,45 @@ private static function expand0state(array $key, array &$sbox, array &$p) */ private static function expandstate(array $data, array $key, array &$sbox, array &$p) { - $p = [$p[0] ^ $key[0], $p[1] ^ $key[1], $p[2] ^ $key[2], $p[3] ^ $key[3], $p[4] ^ $key[4], $p[5] ^ $key[5], $p[6] ^ $key[6], $p[7] ^ $key[7], $p[8] ^ $key[8], $p[9] ^ $key[9], $p[10] ^ $key[10], $p[11] ^ $key[11], $p[12] ^ $key[12], $p[13] ^ $key[13], $p[14] ^ $key[14], $p[15] ^ $key[15], $p[16] ^ $key[0], $p[17] ^ $key[1]]; + $p = [ + $p[0] ^ $key[0], + $p[1] ^ $key[1], + $p[2] ^ $key[2], + $p[3] ^ $key[3], + $p[4] ^ $key[4], + $p[5] ^ $key[5], + $p[6] ^ $key[6], + $p[7] ^ $key[7], + $p[8] ^ $key[8], + $p[9] ^ $key[9], + $p[10] ^ $key[10], + $p[11] ^ $key[11], + $p[12] ^ $key[12], + $p[13] ^ $key[13], + $p[14] ^ $key[14], + $p[15] ^ $key[15], + $p[16] ^ $key[0], + $p[17] ^ $key[1] + ]; + // @codingStandardsIgnoreStart - list($p[0], $p[1]) = self::encryptBlockHelperFast($data[0], $data[1], $sbox, $p); - list($p[2], $p[3]) = self::encryptBlockHelperFast($data[2] ^ $p[0], $data[3] ^ $p[1], $sbox, $p); - list($p[4], $p[5]) = self::encryptBlockHelperFast($data[4] ^ $p[2], $data[5] ^ $p[3], $sbox, $p); - list($p[6], $p[7]) = self::encryptBlockHelperFast($data[6] ^ $p[4], $data[7] ^ $p[5], $sbox, $p); - list($p[8], $p[9]) = self::encryptBlockHelperFast($data[8] ^ $p[6], $data[9] ^ $p[7], $sbox, $p); - list($p[10], $p[11]) = self::encryptBlockHelperFast($data[10] ^ $p[8], $data[11] ^ $p[9], $sbox, $p); + list( $p[0], $p[1]) = self::encryptBlockHelperFast($data[ 0] , $data[ 1] , $sbox, $p); + list( $p[2], $p[3]) = self::encryptBlockHelperFast($data[ 2] ^ $p[ 0], $data[ 3] ^ $p[ 1], $sbox, $p); + list( $p[4], $p[5]) = self::encryptBlockHelperFast($data[ 4] ^ $p[ 2], $data[ 5] ^ $p[ 3], $sbox, $p); + list( $p[6], $p[7]) = self::encryptBlockHelperFast($data[ 6] ^ $p[ 4], $data[ 7] ^ $p[ 5], $sbox, $p); + list( $p[8], $p[9]) = self::encryptBlockHelperFast($data[ 8] ^ $p[ 6], $data[ 9] ^ $p[ 7], $sbox, $p); + list($p[10], $p[11]) = self::encryptBlockHelperFast($data[10] ^ $p[ 8], $data[11] ^ $p[ 9], $sbox, $p); list($p[12], $p[13]) = self::encryptBlockHelperFast($data[12] ^ $p[10], $data[13] ^ $p[11], $sbox, $p); list($p[14], $p[15]) = self::encryptBlockHelperFast($data[14] ^ $p[12], $data[15] ^ $p[13], $sbox, $p); - list($p[16], $p[17]) = self::encryptBlockHelperFast($data[0] ^ $p[14], $data[1] ^ $p[15], $sbox, $p); + list($p[16], $p[17]) = self::encryptBlockHelperFast($data[ 0] ^ $p[14], $data[ 1] ^ $p[15], $sbox, $p); // @codingStandardsIgnoreEnd + list($sbox[0], $sbox[1]) = self::encryptBlockHelperFast($data[2] ^ $p[16], $data[3] ^ $p[17], $sbox, $p); - for ($i = 2, $j = 4; $i < 1024; $i += 2, $j = ($j + 2) % 16) { - // instead of 16 maybe count($data) would be better? + for ($i = 2, $j = 4; $i < 1024; $i += 2, $j = ($j + 2) % 16) { // instead of 16 maybe count($data) would be better? list($sbox[$i], $sbox[$i + 1]) = self::encryptBlockHelperFast($data[$j] ^ $sbox[$i - 2], $data[$j + 1] ^ $sbox[$i - 1], $sbox, $p); } } + /** * Encrypts a block * @@ -432,12 +644,18 @@ protected function encryptBlock($in) $p = $this->bctx['p']; // extract($this->bctx['sb'], EXTR_PREFIX_ALL, 'sb'); // slower $sb = $this->bctx['sb']; - $in = \unpack('N*', $in); + + $in = unpack('N*', $in); $l = $in[1]; $r = $in[2]; - list($r, $l) = \PHP_INT_SIZE == 4 ? self::encryptBlockHelperSlow($l, $r, $sb, $p) : self::encryptBlockHelperFast($l, $r, $sb, $p); - return \pack("N*", $r, $l); + + list($r, $l) = PHP_INT_SIZE == 4 ? + self::encryptBlockHelperSlow($l, $r, $sb, $p) : + self::encryptBlockHelperFast($l, $r, $sb, $p); + + return pack("N*", $r, $l); } + /** * Fast helper function for block encryption * @@ -451,24 +669,26 @@ protected function encryptBlock($in) private static function encryptBlockHelperFast($x0, $x1, array $sbox, array $p) { $x0 ^= $p[0]; - $x1 ^= ($sbox[($x0 & 0xff000000) >> 24] + $sbox[0x100 | ($x0 & 0xff0000) >> 16] ^ $sbox[0x200 | ($x0 & 0xff00) >> 8]) + $sbox[0x300 | $x0 & 0xff] ^ $p[1]; - $x0 ^= ($sbox[($x1 & 0xff000000) >> 24] + $sbox[0x100 | ($x1 & 0xff0000) >> 16] ^ $sbox[0x200 | ($x1 & 0xff00) >> 8]) + $sbox[0x300 | $x1 & 0xff] ^ $p[2]; - $x1 ^= ($sbox[($x0 & 0xff000000) >> 24] + $sbox[0x100 | ($x0 & 0xff0000) >> 16] ^ $sbox[0x200 | ($x0 & 0xff00) >> 8]) + $sbox[0x300 | $x0 & 0xff] ^ $p[3]; - $x0 ^= ($sbox[($x1 & 0xff000000) >> 24] + $sbox[0x100 | ($x1 & 0xff0000) >> 16] ^ $sbox[0x200 | ($x1 & 0xff00) >> 8]) + $sbox[0x300 | $x1 & 0xff] ^ $p[4]; - $x1 ^= ($sbox[($x0 & 0xff000000) >> 24] + $sbox[0x100 | ($x0 & 0xff0000) >> 16] ^ $sbox[0x200 | ($x0 & 0xff00) >> 8]) + $sbox[0x300 | $x0 & 0xff] ^ $p[5]; - $x0 ^= ($sbox[($x1 & 0xff000000) >> 24] + $sbox[0x100 | ($x1 & 0xff0000) >> 16] ^ $sbox[0x200 | ($x1 & 0xff00) >> 8]) + $sbox[0x300 | $x1 & 0xff] ^ $p[6]; - $x1 ^= ($sbox[($x0 & 0xff000000) >> 24] + $sbox[0x100 | ($x0 & 0xff0000) >> 16] ^ $sbox[0x200 | ($x0 & 0xff00) >> 8]) + $sbox[0x300 | $x0 & 0xff] ^ $p[7]; - $x0 ^= ($sbox[($x1 & 0xff000000) >> 24] + $sbox[0x100 | ($x1 & 0xff0000) >> 16] ^ $sbox[0x200 | ($x1 & 0xff00) >> 8]) + $sbox[0x300 | $x1 & 0xff] ^ $p[8]; - $x1 ^= ($sbox[($x0 & 0xff000000) >> 24] + $sbox[0x100 | ($x0 & 0xff0000) >> 16] ^ $sbox[0x200 | ($x0 & 0xff00) >> 8]) + $sbox[0x300 | $x0 & 0xff] ^ $p[9]; - $x0 ^= ($sbox[($x1 & 0xff000000) >> 24] + $sbox[0x100 | ($x1 & 0xff0000) >> 16] ^ $sbox[0x200 | ($x1 & 0xff00) >> 8]) + $sbox[0x300 | $x1 & 0xff] ^ $p[10]; - $x1 ^= ($sbox[($x0 & 0xff000000) >> 24] + $sbox[0x100 | ($x0 & 0xff0000) >> 16] ^ $sbox[0x200 | ($x0 & 0xff00) >> 8]) + $sbox[0x300 | $x0 & 0xff] ^ $p[11]; - $x0 ^= ($sbox[($x1 & 0xff000000) >> 24] + $sbox[0x100 | ($x1 & 0xff0000) >> 16] ^ $sbox[0x200 | ($x1 & 0xff00) >> 8]) + $sbox[0x300 | $x1 & 0xff] ^ $p[12]; - $x1 ^= ($sbox[($x0 & 0xff000000) >> 24] + $sbox[0x100 | ($x0 & 0xff0000) >> 16] ^ $sbox[0x200 | ($x0 & 0xff00) >> 8]) + $sbox[0x300 | $x0 & 0xff] ^ $p[13]; - $x0 ^= ($sbox[($x1 & 0xff000000) >> 24] + $sbox[0x100 | ($x1 & 0xff0000) >> 16] ^ $sbox[0x200 | ($x1 & 0xff00) >> 8]) + $sbox[0x300 | $x1 & 0xff] ^ $p[14]; - $x1 ^= ($sbox[($x0 & 0xff000000) >> 24] + $sbox[0x100 | ($x0 & 0xff0000) >> 16] ^ $sbox[0x200 | ($x0 & 0xff00) >> 8]) + $sbox[0x300 | $x0 & 0xff] ^ $p[15]; - $x0 ^= ($sbox[($x1 & 0xff000000) >> 24] + $sbox[0x100 | ($x1 & 0xff0000) >> 16] ^ $sbox[0x200 | ($x1 & 0xff00) >> 8]) + $sbox[0x300 | $x1 & 0xff] ^ $p[16]; - return [$x1 & 0xffffffff ^ $p[17], $x0 & 0xffffffff]; + $x1 ^= ((($sbox[($x0 & 0xFF000000) >> 24] + $sbox[0x100 | (($x0 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x0 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x0 & 0xFF)]) ^ $p[1]; + $x0 ^= ((($sbox[($x1 & 0xFF000000) >> 24] + $sbox[0x100 | (($x1 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x1 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x1 & 0xFF)]) ^ $p[2]; + $x1 ^= ((($sbox[($x0 & 0xFF000000) >> 24] + $sbox[0x100 | (($x0 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x0 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x0 & 0xFF)]) ^ $p[3]; + $x0 ^= ((($sbox[($x1 & 0xFF000000) >> 24] + $sbox[0x100 | (($x1 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x1 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x1 & 0xFF)]) ^ $p[4]; + $x1 ^= ((($sbox[($x0 & 0xFF000000) >> 24] + $sbox[0x100 | (($x0 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x0 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x0 & 0xFF)]) ^ $p[5]; + $x0 ^= ((($sbox[($x1 & 0xFF000000) >> 24] + $sbox[0x100 | (($x1 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x1 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x1 & 0xFF)]) ^ $p[6]; + $x1 ^= ((($sbox[($x0 & 0xFF000000) >> 24] + $sbox[0x100 | (($x0 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x0 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x0 & 0xFF)]) ^ $p[7]; + $x0 ^= ((($sbox[($x1 & 0xFF000000) >> 24] + $sbox[0x100 | (($x1 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x1 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x1 & 0xFF)]) ^ $p[8]; + $x1 ^= ((($sbox[($x0 & 0xFF000000) >> 24] + $sbox[0x100 | (($x0 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x0 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x0 & 0xFF)]) ^ $p[9]; + $x0 ^= ((($sbox[($x1 & 0xFF000000) >> 24] + $sbox[0x100 | (($x1 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x1 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x1 & 0xFF)]) ^ $p[10]; + $x1 ^= ((($sbox[($x0 & 0xFF000000) >> 24] + $sbox[0x100 | (($x0 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x0 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x0 & 0xFF)]) ^ $p[11]; + $x0 ^= ((($sbox[($x1 & 0xFF000000) >> 24] + $sbox[0x100 | (($x1 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x1 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x1 & 0xFF)]) ^ $p[12]; + $x1 ^= ((($sbox[($x0 & 0xFF000000) >> 24] + $sbox[0x100 | (($x0 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x0 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x0 & 0xFF)]) ^ $p[13]; + $x0 ^= ((($sbox[($x1 & 0xFF000000) >> 24] + $sbox[0x100 | (($x1 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x1 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x1 & 0xFF)]) ^ $p[14]; + $x1 ^= ((($sbox[($x0 & 0xFF000000) >> 24] + $sbox[0x100 | (($x0 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x0 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x0 & 0xFF)]) ^ $p[15]; + $x0 ^= ((($sbox[($x1 & 0xFF000000) >> 24] + $sbox[0x100 | (($x1 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x1 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x1 & 0xFF)]) ^ $p[16]; + + return [$x1 & 0xFFFFFFFF ^ $p[17], $x0 & 0xFFFFFFFF]; } + /** * Slow helper function for block encryption * @@ -483,24 +703,26 @@ private static function encryptBlockHelperSlow($x0, $x1, array $sbox, array $p) { // -16777216 == intval(0xFF000000) on 32-bit PHP installs $x0 ^= $p[0]; - $x1 ^= self::safe_intval((self::safe_intval($sbox[($x0 & -16777216) >> 24 & 0xff] + $sbox[0x100 | ($x0 & 0xff0000) >> 16]) ^ $sbox[0x200 | ($x0 & 0xff00) >> 8]) + $sbox[0x300 | $x0 & 0xff]) ^ $p[1]; - $x0 ^= self::safe_intval((self::safe_intval($sbox[($x1 & -16777216) >> 24 & 0xff] + $sbox[0x100 | ($x1 & 0xff0000) >> 16]) ^ $sbox[0x200 | ($x1 & 0xff00) >> 8]) + $sbox[0x300 | $x1 & 0xff]) ^ $p[2]; - $x1 ^= self::safe_intval((self::safe_intval($sbox[($x0 & -16777216) >> 24 & 0xff] + $sbox[0x100 | ($x0 & 0xff0000) >> 16]) ^ $sbox[0x200 | ($x0 & 0xff00) >> 8]) + $sbox[0x300 | $x0 & 0xff]) ^ $p[3]; - $x0 ^= self::safe_intval((self::safe_intval($sbox[($x1 & -16777216) >> 24 & 0xff] + $sbox[0x100 | ($x1 & 0xff0000) >> 16]) ^ $sbox[0x200 | ($x1 & 0xff00) >> 8]) + $sbox[0x300 | $x1 & 0xff]) ^ $p[4]; - $x1 ^= self::safe_intval((self::safe_intval($sbox[($x0 & -16777216) >> 24 & 0xff] + $sbox[0x100 | ($x0 & 0xff0000) >> 16]) ^ $sbox[0x200 | ($x0 & 0xff00) >> 8]) + $sbox[0x300 | $x0 & 0xff]) ^ $p[5]; - $x0 ^= self::safe_intval((self::safe_intval($sbox[($x1 & -16777216) >> 24 & 0xff] + $sbox[0x100 | ($x1 & 0xff0000) >> 16]) ^ $sbox[0x200 | ($x1 & 0xff00) >> 8]) + $sbox[0x300 | $x1 & 0xff]) ^ $p[6]; - $x1 ^= self::safe_intval((self::safe_intval($sbox[($x0 & -16777216) >> 24 & 0xff] + $sbox[0x100 | ($x0 & 0xff0000) >> 16]) ^ $sbox[0x200 | ($x0 & 0xff00) >> 8]) + $sbox[0x300 | $x0 & 0xff]) ^ $p[7]; - $x0 ^= self::safe_intval((self::safe_intval($sbox[($x1 & -16777216) >> 24 & 0xff] + $sbox[0x100 | ($x1 & 0xff0000) >> 16]) ^ $sbox[0x200 | ($x1 & 0xff00) >> 8]) + $sbox[0x300 | $x1 & 0xff]) ^ $p[8]; - $x1 ^= self::safe_intval((self::safe_intval($sbox[($x0 & -16777216) >> 24 & 0xff] + $sbox[0x100 | ($x0 & 0xff0000) >> 16]) ^ $sbox[0x200 | ($x0 & 0xff00) >> 8]) + $sbox[0x300 | $x0 & 0xff]) ^ $p[9]; - $x0 ^= self::safe_intval((self::safe_intval($sbox[($x1 & -16777216) >> 24 & 0xff] + $sbox[0x100 | ($x1 & 0xff0000) >> 16]) ^ $sbox[0x200 | ($x1 & 0xff00) >> 8]) + $sbox[0x300 | $x1 & 0xff]) ^ $p[10]; - $x1 ^= self::safe_intval((self::safe_intval($sbox[($x0 & -16777216) >> 24 & 0xff] + $sbox[0x100 | ($x0 & 0xff0000) >> 16]) ^ $sbox[0x200 | ($x0 & 0xff00) >> 8]) + $sbox[0x300 | $x0 & 0xff]) ^ $p[11]; - $x0 ^= self::safe_intval((self::safe_intval($sbox[($x1 & -16777216) >> 24 & 0xff] + $sbox[0x100 | ($x1 & 0xff0000) >> 16]) ^ $sbox[0x200 | ($x1 & 0xff00) >> 8]) + $sbox[0x300 | $x1 & 0xff]) ^ $p[12]; - $x1 ^= self::safe_intval((self::safe_intval($sbox[($x0 & -16777216) >> 24 & 0xff] + $sbox[0x100 | ($x0 & 0xff0000) >> 16]) ^ $sbox[0x200 | ($x0 & 0xff00) >> 8]) + $sbox[0x300 | $x0 & 0xff]) ^ $p[13]; - $x0 ^= self::safe_intval((self::safe_intval($sbox[($x1 & -16777216) >> 24 & 0xff] + $sbox[0x100 | ($x1 & 0xff0000) >> 16]) ^ $sbox[0x200 | ($x1 & 0xff00) >> 8]) + $sbox[0x300 | $x1 & 0xff]) ^ $p[14]; - $x1 ^= self::safe_intval((self::safe_intval($sbox[($x0 & -16777216) >> 24 & 0xff] + $sbox[0x100 | ($x0 & 0xff0000) >> 16]) ^ $sbox[0x200 | ($x0 & 0xff00) >> 8]) + $sbox[0x300 | $x0 & 0xff]) ^ $p[15]; - $x0 ^= self::safe_intval((self::safe_intval($sbox[($x1 & -16777216) >> 24 & 0xff] + $sbox[0x100 | ($x1 & 0xff0000) >> 16]) ^ $sbox[0x200 | ($x1 & 0xff00) >> 8]) + $sbox[0x300 | $x1 & 0xff]) ^ $p[16]; + $x1 ^= self::safe_intval((self::safe_intval($sbox[(($x0 & -16777216) >> 24) & 0xFF] + $sbox[0x100 | (($x0 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x0 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x0 & 0xFF)]) ^ $p[1]; + $x0 ^= self::safe_intval((self::safe_intval($sbox[(($x1 & -16777216) >> 24) & 0xFF] + $sbox[0x100 | (($x1 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x1 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x1 & 0xFF)]) ^ $p[2]; + $x1 ^= self::safe_intval((self::safe_intval($sbox[(($x0 & -16777216) >> 24) & 0xFF] + $sbox[0x100 | (($x0 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x0 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x0 & 0xFF)]) ^ $p[3]; + $x0 ^= self::safe_intval((self::safe_intval($sbox[(($x1 & -16777216) >> 24) & 0xFF] + $sbox[0x100 | (($x1 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x1 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x1 & 0xFF)]) ^ $p[4]; + $x1 ^= self::safe_intval((self::safe_intval($sbox[(($x0 & -16777216) >> 24) & 0xFF] + $sbox[0x100 | (($x0 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x0 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x0 & 0xFF)]) ^ $p[5]; + $x0 ^= self::safe_intval((self::safe_intval($sbox[(($x1 & -16777216) >> 24) & 0xFF] + $sbox[0x100 | (($x1 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x1 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x1 & 0xFF)]) ^ $p[6]; + $x1 ^= self::safe_intval((self::safe_intval($sbox[(($x0 & -16777216) >> 24) & 0xFF] + $sbox[0x100 | (($x0 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x0 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x0 & 0xFF)]) ^ $p[7]; + $x0 ^= self::safe_intval((self::safe_intval($sbox[(($x1 & -16777216) >> 24) & 0xFF] + $sbox[0x100 | (($x1 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x1 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x1 & 0xFF)]) ^ $p[8]; + $x1 ^= self::safe_intval((self::safe_intval($sbox[(($x0 & -16777216) >> 24) & 0xFF] + $sbox[0x100 | (($x0 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x0 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x0 & 0xFF)]) ^ $p[9]; + $x0 ^= self::safe_intval((self::safe_intval($sbox[(($x1 & -16777216) >> 24) & 0xFF] + $sbox[0x100 | (($x1 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x1 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x1 & 0xFF)]) ^ $p[10]; + $x1 ^= self::safe_intval((self::safe_intval($sbox[(($x0 & -16777216) >> 24) & 0xFF] + $sbox[0x100 | (($x0 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x0 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x0 & 0xFF)]) ^ $p[11]; + $x0 ^= self::safe_intval((self::safe_intval($sbox[(($x1 & -16777216) >> 24) & 0xFF] + $sbox[0x100 | (($x1 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x1 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x1 & 0xFF)]) ^ $p[12]; + $x1 ^= self::safe_intval((self::safe_intval($sbox[(($x0 & -16777216) >> 24) & 0xFF] + $sbox[0x100 | (($x0 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x0 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x0 & 0xFF)]) ^ $p[13]; + $x0 ^= self::safe_intval((self::safe_intval($sbox[(($x1 & -16777216) >> 24) & 0xFF] + $sbox[0x100 | (($x1 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x1 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x1 & 0xFF)]) ^ $p[14]; + $x1 ^= self::safe_intval((self::safe_intval($sbox[(($x0 & -16777216) >> 24) & 0xFF] + $sbox[0x100 | (($x0 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x0 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x0 & 0xFF)]) ^ $p[15]; + $x0 ^= self::safe_intval((self::safe_intval($sbox[(($x1 & -16777216) >> 24) & 0xFF] + $sbox[0x100 | (($x1 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x1 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x1 & 0xFF)]) ^ $p[16]; + return [$x1 ^ $p[17], $x0]; } + /** * Decrypts a block * @@ -511,17 +733,25 @@ protected function decryptBlock($in) { $p = $this->bctx['p']; $sb = $this->bctx['sb']; - $in = \unpack('N*', $in); + + $in = unpack('N*', $in); $l = $in[1]; $r = $in[2]; + for ($i = 17; $i > 2; $i -= 2) { $l ^= $p[$i]; - $r ^= self::safe_intval((self::safe_intval($sb[$l >> 24 & 0xff] + $sb[0x100 + ($l >> 16 & 0xff)]) ^ $sb[0x200 + ($l >> 8 & 0xff)]) + $sb[0x300 + ($l & 0xff)]); + $r ^= self::safe_intval((self::safe_intval($sb[$l >> 24 & 0xff] + $sb[0x100 + ($l >> 16 & 0xff)]) ^ + $sb[0x200 + ($l >> 8 & 0xff)]) + + $sb[0x300 + ($l & 0xff)]); + $r ^= $p[$i - 1]; - $l ^= self::safe_intval((self::safe_intval($sb[$r >> 24 & 0xff] + $sb[0x100 + ($r >> 16 & 0xff)]) ^ $sb[0x200 + ($r >> 8 & 0xff)]) + $sb[0x300 + ($r & 0xff)]); + $l ^= self::safe_intval((self::safe_intval($sb[$r >> 24 & 0xff] + $sb[0x100 + ($r >> 16 & 0xff)]) ^ + $sb[0x200 + ($r >> 8 & 0xff)]) + + $sb[0x300 + ($r & 0xff)]); } - return \pack('N*', $r ^ $p[0], $l ^ $p[1]); + return pack('N*', $r ^ $p[0], $l ^ $p[1]); } + /** * Setup the performance-optimized function for de/encrypt() * @@ -536,7 +766,9 @@ protected function setupInlineCrypt() $sb = $this->bctx["sb"]; } '; + $safeint = self::safe_intval_inline(); + // Generating encrypt code: $encrypt_block = ' $in = unpack("N*", $in); @@ -546,12 +778,12 @@ protected function setupInlineCrypt() for ($i = 0; $i < 16; $i += 2) { $encrypt_block .= ' $l^= ' . $p[$i] . '; - $r^= ' . \sprintf($safeint, '(' . \sprintf($safeint, '$sb[$l >> 24 & 0xff] + $sb[0x100 + ($l >> 16 & 0xff)]') . ' ^ + $r^= ' . sprintf($safeint, '(' . sprintf($safeint, '$sb[$l >> 24 & 0xff] + $sb[0x100 + ($l >> 16 & 0xff)]') . ' ^ $sb[0x200 + ($l >> 8 & 0xff)]) + $sb[0x300 + ($l & 0xff)]') . '; $r^= ' . $p[$i + 1] . '; - $l^= ' . \sprintf($safeint, '(' . \sprintf($safeint, '$sb[$r >> 24 & 0xff] + $sb[0x100 + ($r >> 16 & 0xff)]') . ' ^ + $l^= ' . sprintf($safeint, '(' . sprintf($safeint, '$sb[$r >> 24 & 0xff] + $sb[0x100 + ($r >> 16 & 0xff)]') . ' ^ $sb[0x200 + ($r >> 8 & 0xff)]) + $sb[0x300 + ($r & 0xff)]') . '; '; @@ -562,31 +794,42 @@ protected function setupInlineCrypt() $l ^ ' . $p[16] . ' ); '; - // Generating decrypt code: + // Generating decrypt code: $decrypt_block = ' $in = unpack("N*", $in); $l = $in[1]; $r = $in[2]; '; + for ($i = 17; $i > 2; $i -= 2) { $decrypt_block .= ' $l^= ' . $p[$i] . '; - $r^= ' . \sprintf($safeint, '(' . \sprintf($safeint, '$sb[$l >> 24 & 0xff] + $sb[0x100 + ($l >> 16 & 0xff)]') . ' ^ + $r^= ' . sprintf($safeint, '(' . sprintf($safeint, '$sb[$l >> 24 & 0xff] + $sb[0x100 + ($l >> 16 & 0xff)]') . ' ^ $sb[0x200 + ($l >> 8 & 0xff)]) + $sb[0x300 + ($l & 0xff)]') . '; $r^= ' . $p[$i - 1] . '; - $l^= ' . \sprintf($safeint, '(' . \sprintf($safeint, '$sb[$r >> 24 & 0xff] + $sb[0x100 + ($r >> 16 & 0xff)]') . ' ^ + $l^= ' . sprintf($safeint, '(' . sprintf($safeint, '$sb[$r >> 24 & 0xff] + $sb[0x100 + ($r >> 16 & 0xff)]') . ' ^ $sb[0x200 + ($r >> 8 & 0xff)]) + $sb[0x300 + ($r & 0xff)]') . '; '; } + $decrypt_block .= ' $in = pack("N*", $r ^ ' . $p[0] . ', $l ^ ' . $p[1] . ' ); '; - $this->inline_crypt = $this->createInlineCryptFunction(['init_crypt' => $init_crypt, 'init_encrypt' => '', 'init_decrypt' => '', 'encrypt_block' => $encrypt_block, 'decrypt_block' => $decrypt_block]); + + $this->inline_crypt = $this->createInlineCryptFunction( + [ + 'init_crypt' => $init_crypt, + 'init_encrypt' => '', + 'init_decrypt' => '', + 'encrypt_block' => $encrypt_block, + 'decrypt_block' => $decrypt_block + ] + ); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/ChaCha20.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/ChaCha20.php index 680ebcd..9531656 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/ChaCha20.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/ChaCha20.php @@ -10,15 +10,16 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt; use OCA\Libresign\Vendor\phpseclib3\Exception\BadDecryptionException; use OCA\Libresign\Vendor\phpseclib3\Exception\InsufficientSetupException; + /** * Pure-PHP implementation of ChaCha20. * * @author Jim Wigginton - * @internal */ class ChaCha20 extends Salsa20 { @@ -28,6 +29,7 @@ class ChaCha20 extends Salsa20 * @var string */ protected $cipher_name_openssl = 'chacha20'; + /** * Test for engine validity * @@ -42,24 +44,32 @@ protected function isValidEngineHelper($engine) switch ($engine) { case self::ENGINE_LIBSODIUM: // PHP 7.2.0 (30 Nov 2017) added support for libsodium + // we could probably make it so that if $this->counter == 0 then the first block would be done with either OpenSSL // or PHP and then subsequent blocks would then be done with libsodium but idk - it's not a high priority atm + // we could also make it so that if $this->counter == 0 and $this->continuousBuffer then do the first string // with libsodium and subsequent strings with openssl or pure-PHP but again not a high priority - return \function_exists('sodium_crypto_aead_chacha20poly1305_ietf_encrypt') && $this->key_length == 32 && ($this->usePoly1305 && !isset($this->poly1305Key) && $this->counter == 0 || $this->counter == 1) && !$this->continuousBuffer; + return function_exists('sodium_crypto_aead_chacha20poly1305_ietf_encrypt') && + $this->key_length == 32 && + (($this->usePoly1305 && !isset($this->poly1305Key) && $this->counter == 0) || $this->counter == 1) && + !$this->continuousBuffer; case self::ENGINE_OPENSSL: // OpenSSL 1.1.0 (released 25 Aug 2016) added support for chacha20. // PHP didn't support OpenSSL 1.1.0 until 7.0.19 (11 May 2017) + // if you attempt to provide openssl with a 128 bit key (as opposed to a 256 bit key) openssl will null // pad the key to 256 bits and still use the expansion constant for 256-bit keys. the fact that // openssl treats the IV as both the counter and nonce, however, let's us use openssl in continuous mode // whereas libsodium does not if ($this->key_length != 32) { - return \false; + return false; } } + return parent::isValidEngineHelper($engine); } + /** * Encrypts a message. * @@ -71,11 +81,14 @@ protected function isValidEngineHelper($engine) public function encrypt($plaintext) { $this->setup(); + if ($this->engine == self::ENGINE_LIBSODIUM) { return $this->encrypt_with_libsodium($plaintext); } + return parent::encrypt($plaintext); } + /** * Decrypts a message. * @@ -90,11 +103,14 @@ public function encrypt($plaintext) public function decrypt($ciphertext) { $this->setup(); + if ($this->engine == self::ENGINE_LIBSODIUM) { return $this->decrypt_with_libsodium($ciphertext); } + return parent::decrypt($ciphertext); } + /** * Encrypts a message with libsodium * @@ -105,14 +121,22 @@ public function decrypt($ciphertext) private function encrypt_with_libsodium($plaintext) { $params = [$plaintext, $this->aad, $this->nonce, $this->key]; - $ciphertext = \strlen($this->nonce) == 8 ? \sodium_crypto_aead_chacha20poly1305_encrypt(...$params) : \sodium_crypto_aead_chacha20poly1305_ietf_encrypt(...$params); + $ciphertext = strlen($this->nonce) == 8 ? + sodium_crypto_aead_chacha20poly1305_encrypt(...$params) : + sodium_crypto_aead_chacha20poly1305_ietf_encrypt(...$params); if (!$this->usePoly1305) { - return \substr($ciphertext, 0, \strlen($plaintext)); + return substr($ciphertext, 0, strlen($plaintext)); } - $newciphertext = \substr($ciphertext, 0, \strlen($plaintext)); - $this->newtag = $this->usingGeneratedPoly1305Key && \strlen($this->nonce) == 12 ? \substr($ciphertext, \strlen($plaintext)) : $this->poly1305($newciphertext); + + $newciphertext = substr($ciphertext, 0, strlen($plaintext)); + + $this->newtag = $this->usingGeneratedPoly1305Key && strlen($this->nonce) == 12 ? + substr($ciphertext, strlen($plaintext)) : + $this->poly1305($newciphertext); + return $newciphertext; } + /** * Decrypts a message with libsodium * @@ -123,28 +147,34 @@ private function encrypt_with_libsodium($plaintext) private function decrypt_with_libsodium($ciphertext) { $params = [$ciphertext, $this->aad, $this->nonce, $this->key]; + if (isset($this->poly1305Key)) { - if ($this->oldtag === \false) { + if ($this->oldtag === false) { throw new InsufficientSetupException('Authentication Tag has not been set'); } - if ($this->usingGeneratedPoly1305Key && \strlen($this->nonce) == 12) { - $plaintext = \sodium_crypto_aead_chacha20poly1305_ietf_decrypt(...$params); - $this->oldtag = \false; - if ($plaintext === \false) { + if ($this->usingGeneratedPoly1305Key && strlen($this->nonce) == 12) { + $plaintext = sodium_crypto_aead_chacha20poly1305_ietf_decrypt(...$params); + $this->oldtag = false; + if ($plaintext === false) { throw new BadDecryptionException('Derived authentication tag and supplied authentication tag do not match'); } return $plaintext; } $newtag = $this->poly1305($ciphertext); - if ($this->oldtag != \substr($newtag, 0, \strlen($this->oldtag))) { - $this->oldtag = \false; + if ($this->oldtag != substr($newtag, 0, strlen($this->oldtag))) { + $this->oldtag = false; throw new BadDecryptionException('Derived authentication tag and supplied authentication tag do not match'); } - $this->oldtag = \false; + $this->oldtag = false; } - $plaintext = \strlen($this->nonce) == 8 ? \sodium_crypto_aead_chacha20poly1305_encrypt(...$params) : \sodium_crypto_aead_chacha20poly1305_ietf_encrypt(...$params); - return \substr($plaintext, 0, \strlen($ciphertext)); + + $plaintext = strlen($this->nonce) == 8 ? + sodium_crypto_aead_chacha20poly1305_encrypt(...$params) : + sodium_crypto_aead_chacha20poly1305_ietf_encrypt(...$params); + + return substr($plaintext, 0, strlen($ciphertext)); } + /** * Sets the nonce. * @@ -152,29 +182,30 @@ private function decrypt_with_libsodium($ciphertext) */ public function setNonce($nonce) { - if (!\is_string($nonce)) { + if (!is_string($nonce)) { throw new \UnexpectedValueException('The nonce should be a string'); } + /* - from https://tools.ietf.org/html/rfc7539#page-7 - - "Note also that the original ChaCha had a 64-bit nonce and 64-bit - block count. We have modified this here to be more consistent with - recommendations in Section 3.2 of [RFC5116]." - */ - switch (\strlen($nonce)) { - case 8: - // 64 bits - case 12: - // 96 bits + from https://tools.ietf.org/html/rfc7539#page-7 + + "Note also that the original ChaCha had a 64-bit nonce and 64-bit + block count. We have modified this here to be more consistent with + recommendations in Section 3.2 of [RFC5116]." + */ + switch (strlen($nonce)) { + case 8: // 64 bits + case 12: // 96 bits break; default: - throw new \LengthException('Nonce of size ' . \strlen($nonce) . ' not supported by this algorithm. Only 64-bit nonces or 96-bit nonces are supported'); + throw new \LengthException('Nonce of size ' . strlen($nonce) . ' not supported by this algorithm. Only 64-bit nonces or 96-bit nonces are supported'); } + $this->nonce = $nonce; - $this->changed = \true; + $this->changed = true; $this->setEngine(); } + /** * Setup the self::ENGINE_INTERNAL $engine * @@ -198,34 +229,42 @@ protected function setup() if (!$this->changed) { return; } + $this->enbuffer = $this->debuffer = ['ciphertext' => '', 'counter' => $this->counter]; - $this->changed = $this->nonIVChanged = \false; - if ($this->nonce === \false) { + + $this->changed = $this->nonIVChanged = false; + + if ($this->nonce === false) { throw new InsufficientSetupException('No nonce has been defined'); } - if ($this->key === \false) { + + if ($this->key === false) { throw new InsufficientSetupException('No key has been defined'); } + if ($this->usePoly1305 && !isset($this->poly1305Key)) { - $this->usingGeneratedPoly1305Key = \true; + $this->usingGeneratedPoly1305Key = true; if ($this->engine == self::ENGINE_LIBSODIUM) { return; } $this->createPoly1305Key(); } + $key = $this->key; - if (\strlen($key) == 16) { + if (strlen($key) == 16) { $constant = 'expand 16-byte k'; $key .= $key; } else { $constant = 'expand 32-byte k'; } + $this->p1 = $constant . $key; $this->p2 = $this->nonce; - if (\strlen($this->nonce) == 8) { - $this->p2 = "\x00\x00\x00\x00" . $this->p2; + if (strlen($this->nonce) == 8) { + $this->p2 = "\0\0\0\0" . $this->p2; } } + /** * The quarterround function * @@ -240,16 +279,13 @@ protected static function quarterRound(&$a, &$b, &$c, &$d) // xor'ing and rotation are all on the same line so i'm keeping it on the same // line here as well // @codingStandardsIgnoreStart - $a += $b; - $d = self::leftRotate(\intval($d) ^ \intval($a), 16); - $c += $d; - $b = self::leftRotate(\intval($b) ^ \intval($c), 12); - $a += $b; - $d = self::leftRotate(\intval($d) ^ \intval($a), 8); - $c += $d; - $b = self::leftRotate(\intval($b) ^ \intval($c), 7); + $a+= $b; $d = self::leftRotate(intval($d) ^ intval($a), 16); + $c+= $d; $b = self::leftRotate(intval($b) ^ intval($c), 12); + $a+= $b; $d = self::leftRotate(intval($d) ^ intval($a), 8); + $c+= $d; $b = self::leftRotate(intval($b) ^ intval($c), 7); // @codingStandardsIgnoreEnd } + /** * The doubleround function * @@ -283,6 +319,7 @@ protected static function doubleRound(&$x0, &$x1, &$x2, &$x3, &$x4, &$x5, &$x6, static::quarterRound($x2, $x7, $x8, $x13); static::quarterRound($x3, $x4, $x9, $x14); } + /** * The Salsa20 hash function function * @@ -300,7 +337,7 @@ protected static function doubleRound(&$x0, &$x1, &$x2, &$x3, &$x4, &$x5, &$x6, */ protected static function salsa20($x) { - list(, $x0, $x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8, $x9, $x10, $x11, $x12, $x13, $x14, $x15) = \unpack('V*', $x); + list(, $x0, $x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8, $x9, $x10, $x11, $x12, $x13, $x14, $x15) = unpack('V*', $x); $z0 = $x0; $z1 = $x1; $z2 = $x2; @@ -317,668 +354,429 @@ protected static function salsa20($x) $z13 = $x13; $z14 = $x14; $z15 = $x15; + // @codingStandardsIgnoreStart // columnRound - $x0 += $x4; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x0), 16); - $x8 += $x12; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x8), 12); - $x0 += $x4; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x0), 8); - $x8 += $x12; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x8), 7); - $x1 += $x5; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x1), 16); - $x9 += $x13; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x9), 12); - $x1 += $x5; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x1), 8); - $x9 += $x13; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x9), 7); - $x2 += $x6; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x2), 16); - $x10 += $x14; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x10), 12); - $x2 += $x6; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x2), 8); - $x10 += $x14; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x10), 7); - $x3 += $x7; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x3), 16); - $x11 += $x15; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x11), 12); - $x3 += $x7; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x3), 8); - $x11 += $x15; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x11), 7); + $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 16); + $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 12); + $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 8); + $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 7); + + $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 16); + $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 12); + $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 8); + $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 7); + + $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 16); + $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 12); + $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 8); + $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 7); + + $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 16); + $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 12); + $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 8); + $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 7); + // rowRound - $x0 += $x5; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x0), 16); - $x10 += $x15; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x10), 12); - $x0 += $x5; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x0), 8); - $x10 += $x15; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x10), 7); - $x1 += $x6; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x1), 16); - $x11 += $x12; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x11), 12); - $x1 += $x6; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x1), 8); - $x11 += $x12; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x11), 7); - $x2 += $x7; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x2), 16); - $x8 += $x13; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x8), 12); - $x2 += $x7; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x2), 8); - $x8 += $x13; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x8), 7); - $x3 += $x4; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x3), 16); - $x9 += $x14; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x9), 12); - $x3 += $x4; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x3), 8); - $x9 += $x14; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x9), 7); + $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 16); + $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 12); + $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 8); + $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 7); + + $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 16); + $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 12); + $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 8); + $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 7); + + $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 16); + $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 12); + $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 8); + $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 7); + + $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 16); + $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 12); + $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 8); + $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 7); + // columnRound - $x0 += $x4; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x0), 16); - $x8 += $x12; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x8), 12); - $x0 += $x4; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x0), 8); - $x8 += $x12; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x8), 7); - $x1 += $x5; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x1), 16); - $x9 += $x13; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x9), 12); - $x1 += $x5; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x1), 8); - $x9 += $x13; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x9), 7); - $x2 += $x6; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x2), 16); - $x10 += $x14; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x10), 12); - $x2 += $x6; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x2), 8); - $x10 += $x14; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x10), 7); - $x3 += $x7; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x3), 16); - $x11 += $x15; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x11), 12); - $x3 += $x7; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x3), 8); - $x11 += $x15; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x11), 7); + $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 16); + $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 12); + $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 8); + $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 7); + + $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 16); + $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 12); + $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 8); + $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 7); + + $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 16); + $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 12); + $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 8); + $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 7); + + $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 16); + $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 12); + $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 8); + $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 7); + // rowRound - $x0 += $x5; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x0), 16); - $x10 += $x15; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x10), 12); - $x0 += $x5; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x0), 8); - $x10 += $x15; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x10), 7); - $x1 += $x6; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x1), 16); - $x11 += $x12; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x11), 12); - $x1 += $x6; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x1), 8); - $x11 += $x12; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x11), 7); - $x2 += $x7; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x2), 16); - $x8 += $x13; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x8), 12); - $x2 += $x7; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x2), 8); - $x8 += $x13; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x8), 7); - $x3 += $x4; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x3), 16); - $x9 += $x14; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x9), 12); - $x3 += $x4; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x3), 8); - $x9 += $x14; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x9), 7); + $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 16); + $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 12); + $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 8); + $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 7); + + $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 16); + $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 12); + $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 8); + $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 7); + + $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 16); + $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 12); + $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 8); + $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 7); + + $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 16); + $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 12); + $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 8); + $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 7); + // columnRound - $x0 += $x4; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x0), 16); - $x8 += $x12; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x8), 12); - $x0 += $x4; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x0), 8); - $x8 += $x12; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x8), 7); - $x1 += $x5; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x1), 16); - $x9 += $x13; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x9), 12); - $x1 += $x5; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x1), 8); - $x9 += $x13; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x9), 7); - $x2 += $x6; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x2), 16); - $x10 += $x14; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x10), 12); - $x2 += $x6; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x2), 8); - $x10 += $x14; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x10), 7); - $x3 += $x7; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x3), 16); - $x11 += $x15; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x11), 12); - $x3 += $x7; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x3), 8); - $x11 += $x15; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x11), 7); + $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 16); + $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 12); + $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 8); + $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 7); + + $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 16); + $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 12); + $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 8); + $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 7); + + $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 16); + $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 12); + $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 8); + $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 7); + + $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 16); + $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 12); + $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 8); + $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 7); + // rowRound - $x0 += $x5; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x0), 16); - $x10 += $x15; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x10), 12); - $x0 += $x5; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x0), 8); - $x10 += $x15; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x10), 7); - $x1 += $x6; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x1), 16); - $x11 += $x12; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x11), 12); - $x1 += $x6; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x1), 8); - $x11 += $x12; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x11), 7); - $x2 += $x7; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x2), 16); - $x8 += $x13; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x8), 12); - $x2 += $x7; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x2), 8); - $x8 += $x13; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x8), 7); - $x3 += $x4; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x3), 16); - $x9 += $x14; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x9), 12); - $x3 += $x4; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x3), 8); - $x9 += $x14; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x9), 7); + $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 16); + $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 12); + $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 8); + $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 7); + + $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 16); + $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 12); + $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 8); + $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 7); + + $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 16); + $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 12); + $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 8); + $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 7); + + $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 16); + $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 12); + $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 8); + $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 7); + // columnRound - $x0 += $x4; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x0), 16); - $x8 += $x12; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x8), 12); - $x0 += $x4; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x0), 8); - $x8 += $x12; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x8), 7); - $x1 += $x5; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x1), 16); - $x9 += $x13; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x9), 12); - $x1 += $x5; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x1), 8); - $x9 += $x13; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x9), 7); - $x2 += $x6; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x2), 16); - $x10 += $x14; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x10), 12); - $x2 += $x6; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x2), 8); - $x10 += $x14; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x10), 7); - $x3 += $x7; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x3), 16); - $x11 += $x15; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x11), 12); - $x3 += $x7; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x3), 8); - $x11 += $x15; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x11), 7); + $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 16); + $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 12); + $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 8); + $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 7); + + $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 16); + $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 12); + $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 8); + $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 7); + + $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 16); + $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 12); + $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 8); + $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 7); + + $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 16); + $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 12); + $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 8); + $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 7); + // rowRound - $x0 += $x5; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x0), 16); - $x10 += $x15; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x10), 12); - $x0 += $x5; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x0), 8); - $x10 += $x15; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x10), 7); - $x1 += $x6; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x1), 16); - $x11 += $x12; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x11), 12); - $x1 += $x6; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x1), 8); - $x11 += $x12; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x11), 7); - $x2 += $x7; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x2), 16); - $x8 += $x13; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x8), 12); - $x2 += $x7; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x2), 8); - $x8 += $x13; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x8), 7); - $x3 += $x4; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x3), 16); - $x9 += $x14; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x9), 12); - $x3 += $x4; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x3), 8); - $x9 += $x14; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x9), 7); + $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 16); + $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 12); + $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 8); + $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 7); + + $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 16); + $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 12); + $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 8); + $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 7); + + $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 16); + $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 12); + $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 8); + $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 7); + + $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 16); + $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 12); + $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 8); + $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 7); + // columnRound - $x0 += $x4; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x0), 16); - $x8 += $x12; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x8), 12); - $x0 += $x4; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x0), 8); - $x8 += $x12; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x8), 7); - $x1 += $x5; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x1), 16); - $x9 += $x13; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x9), 12); - $x1 += $x5; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x1), 8); - $x9 += $x13; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x9), 7); - $x2 += $x6; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x2), 16); - $x10 += $x14; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x10), 12); - $x2 += $x6; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x2), 8); - $x10 += $x14; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x10), 7); - $x3 += $x7; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x3), 16); - $x11 += $x15; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x11), 12); - $x3 += $x7; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x3), 8); - $x11 += $x15; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x11), 7); + $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 16); + $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 12); + $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 8); + $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 7); + + $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 16); + $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 12); + $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 8); + $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 7); + + $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 16); + $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 12); + $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 8); + $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 7); + + $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 16); + $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 12); + $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 8); + $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 7); + // rowRound - $x0 += $x5; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x0), 16); - $x10 += $x15; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x10), 12); - $x0 += $x5; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x0), 8); - $x10 += $x15; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x10), 7); - $x1 += $x6; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x1), 16); - $x11 += $x12; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x11), 12); - $x1 += $x6; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x1), 8); - $x11 += $x12; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x11), 7); - $x2 += $x7; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x2), 16); - $x8 += $x13; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x8), 12); - $x2 += $x7; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x2), 8); - $x8 += $x13; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x8), 7); - $x3 += $x4; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x3), 16); - $x9 += $x14; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x9), 12); - $x3 += $x4; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x3), 8); - $x9 += $x14; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x9), 7); + $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 16); + $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 12); + $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 8); + $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 7); + + $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 16); + $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 12); + $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 8); + $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 7); + + $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 16); + $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 12); + $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 8); + $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 7); + + $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 16); + $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 12); + $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 8); + $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 7); + // columnRound - $x0 += $x4; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x0), 16); - $x8 += $x12; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x8), 12); - $x0 += $x4; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x0), 8); - $x8 += $x12; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x8), 7); - $x1 += $x5; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x1), 16); - $x9 += $x13; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x9), 12); - $x1 += $x5; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x1), 8); - $x9 += $x13; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x9), 7); - $x2 += $x6; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x2), 16); - $x10 += $x14; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x10), 12); - $x2 += $x6; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x2), 8); - $x10 += $x14; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x10), 7); - $x3 += $x7; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x3), 16); - $x11 += $x15; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x11), 12); - $x3 += $x7; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x3), 8); - $x11 += $x15; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x11), 7); + $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 16); + $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 12); + $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 8); + $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 7); + + $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 16); + $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 12); + $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 8); + $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 7); + + $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 16); + $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 12); + $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 8); + $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 7); + + $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 16); + $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 12); + $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 8); + $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 7); + // rowRound - $x0 += $x5; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x0), 16); - $x10 += $x15; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x10), 12); - $x0 += $x5; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x0), 8); - $x10 += $x15; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x10), 7); - $x1 += $x6; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x1), 16); - $x11 += $x12; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x11), 12); - $x1 += $x6; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x1), 8); - $x11 += $x12; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x11), 7); - $x2 += $x7; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x2), 16); - $x8 += $x13; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x8), 12); - $x2 += $x7; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x2), 8); - $x8 += $x13; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x8), 7); - $x3 += $x4; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x3), 16); - $x9 += $x14; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x9), 12); - $x3 += $x4; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x3), 8); - $x9 += $x14; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x9), 7); + $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 16); + $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 12); + $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 8); + $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 7); + + $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 16); + $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 12); + $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 8); + $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 7); + + $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 16); + $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 12); + $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 8); + $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 7); + + $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 16); + $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 12); + $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 8); + $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 7); + // columnRound - $x0 += $x4; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x0), 16); - $x8 += $x12; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x8), 12); - $x0 += $x4; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x0), 8); - $x8 += $x12; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x8), 7); - $x1 += $x5; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x1), 16); - $x9 += $x13; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x9), 12); - $x1 += $x5; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x1), 8); - $x9 += $x13; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x9), 7); - $x2 += $x6; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x2), 16); - $x10 += $x14; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x10), 12); - $x2 += $x6; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x2), 8); - $x10 += $x14; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x10), 7); - $x3 += $x7; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x3), 16); - $x11 += $x15; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x11), 12); - $x3 += $x7; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x3), 8); - $x11 += $x15; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x11), 7); + $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 16); + $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 12); + $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 8); + $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 7); + + $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 16); + $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 12); + $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 8); + $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 7); + + $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 16); + $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 12); + $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 8); + $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 7); + + $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 16); + $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 12); + $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 8); + $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 7); + // rowRound - $x0 += $x5; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x0), 16); - $x10 += $x15; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x10), 12); - $x0 += $x5; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x0), 8); - $x10 += $x15; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x10), 7); - $x1 += $x6; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x1), 16); - $x11 += $x12; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x11), 12); - $x1 += $x6; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x1), 8); - $x11 += $x12; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x11), 7); - $x2 += $x7; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x2), 16); - $x8 += $x13; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x8), 12); - $x2 += $x7; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x2), 8); - $x8 += $x13; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x8), 7); - $x3 += $x4; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x3), 16); - $x9 += $x14; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x9), 12); - $x3 += $x4; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x3), 8); - $x9 += $x14; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x9), 7); + $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 16); + $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 12); + $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 8); + $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 7); + + $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 16); + $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 12); + $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 8); + $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 7); + + $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 16); + $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 12); + $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 8); + $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 7); + + $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 16); + $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 12); + $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 8); + $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 7); + // columnRound - $x0 += $x4; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x0), 16); - $x8 += $x12; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x8), 12); - $x0 += $x4; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x0), 8); - $x8 += $x12; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x8), 7); - $x1 += $x5; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x1), 16); - $x9 += $x13; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x9), 12); - $x1 += $x5; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x1), 8); - $x9 += $x13; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x9), 7); - $x2 += $x6; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x2), 16); - $x10 += $x14; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x10), 12); - $x2 += $x6; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x2), 8); - $x10 += $x14; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x10), 7); - $x3 += $x7; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x3), 16); - $x11 += $x15; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x11), 12); - $x3 += $x7; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x3), 8); - $x11 += $x15; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x11), 7); + $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 16); + $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 12); + $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 8); + $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 7); + + $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 16); + $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 12); + $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 8); + $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 7); + + $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 16); + $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 12); + $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 8); + $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 7); + + $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 16); + $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 12); + $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 8); + $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 7); + // rowRound - $x0 += $x5; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x0), 16); - $x10 += $x15; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x10), 12); - $x0 += $x5; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x0), 8); - $x10 += $x15; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x10), 7); - $x1 += $x6; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x1), 16); - $x11 += $x12; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x11), 12); - $x1 += $x6; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x1), 8); - $x11 += $x12; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x11), 7); - $x2 += $x7; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x2), 16); - $x8 += $x13; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x8), 12); - $x2 += $x7; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x2), 8); - $x8 += $x13; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x8), 7); - $x3 += $x4; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x3), 16); - $x9 += $x14; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x9), 12); - $x3 += $x4; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x3), 8); - $x9 += $x14; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x9), 7); + $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 16); + $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 12); + $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 8); + $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 7); + + $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 16); + $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 12); + $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 8); + $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 7); + + $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 16); + $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 12); + $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 8); + $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 7); + + $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 16); + $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 12); + $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 8); + $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 7); + // columnRound - $x0 += $x4; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x0), 16); - $x8 += $x12; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x8), 12); - $x0 += $x4; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x0), 8); - $x8 += $x12; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x8), 7); - $x1 += $x5; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x1), 16); - $x9 += $x13; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x9), 12); - $x1 += $x5; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x1), 8); - $x9 += $x13; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x9), 7); - $x2 += $x6; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x2), 16); - $x10 += $x14; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x10), 12); - $x2 += $x6; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x2), 8); - $x10 += $x14; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x10), 7); - $x3 += $x7; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x3), 16); - $x11 += $x15; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x11), 12); - $x3 += $x7; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x3), 8); - $x11 += $x15; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x11), 7); + $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 16); + $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 12); + $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 8); + $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 7); + + $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 16); + $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 12); + $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 8); + $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 7); + + $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 16); + $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 12); + $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 8); + $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 7); + + $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 16); + $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 12); + $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 8); + $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 7); + // rowRound - $x0 += $x5; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x0), 16); - $x10 += $x15; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x10), 12); - $x0 += $x5; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x0), 8); - $x10 += $x15; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x10), 7); - $x1 += $x6; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x1), 16); - $x11 += $x12; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x11), 12); - $x1 += $x6; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x1), 8); - $x11 += $x12; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x11), 7); - $x2 += $x7; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x2), 16); - $x8 += $x13; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x8), 12); - $x2 += $x7; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x2), 8); - $x8 += $x13; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x8), 7); - $x3 += $x4; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x3), 16); - $x9 += $x14; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x9), 12); - $x3 += $x4; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x3), 8); - $x9 += $x14; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x9), 7); + $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 16); + $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 12); + $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 8); + $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 7); + + $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 16); + $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 12); + $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 8); + $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 7); + + $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 16); + $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 12); + $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 8); + $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 7); + + $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 16); + $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 12); + $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 8); + $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 7); + // columnRound - $x0 += $x4; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x0), 16); - $x8 += $x12; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x8), 12); - $x0 += $x4; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x0), 8); - $x8 += $x12; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x8), 7); - $x1 += $x5; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x1), 16); - $x9 += $x13; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x9), 12); - $x1 += $x5; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x1), 8); - $x9 += $x13; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x9), 7); - $x2 += $x6; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x2), 16); - $x10 += $x14; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x10), 12); - $x2 += $x6; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x2), 8); - $x10 += $x14; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x10), 7); - $x3 += $x7; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x3), 16); - $x11 += $x15; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x11), 12); - $x3 += $x7; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x3), 8); - $x11 += $x15; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x11), 7); + $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 16); + $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 12); + $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 8); + $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 7); + + $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 16); + $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 12); + $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 8); + $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 7); + + $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 16); + $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 12); + $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 8); + $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 7); + + $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 16); + $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 12); + $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 8); + $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 7); + // rowRound - $x0 += $x5; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x0), 16); - $x10 += $x15; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x10), 12); - $x0 += $x5; - $x15 = self::leftRotate(\intval($x15) ^ \intval($x0), 8); - $x10 += $x15; - $x5 = self::leftRotate(\intval($x5) ^ \intval($x10), 7); - $x1 += $x6; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x1), 16); - $x11 += $x12; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x11), 12); - $x1 += $x6; - $x12 = self::leftRotate(\intval($x12) ^ \intval($x1), 8); - $x11 += $x12; - $x6 = self::leftRotate(\intval($x6) ^ \intval($x11), 7); - $x2 += $x7; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x2), 16); - $x8 += $x13; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x8), 12); - $x2 += $x7; - $x13 = self::leftRotate(\intval($x13) ^ \intval($x2), 8); - $x8 += $x13; - $x7 = self::leftRotate(\intval($x7) ^ \intval($x8), 7); - $x3 += $x4; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x3), 16); - $x9 += $x14; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x9), 12); - $x3 += $x4; - $x14 = self::leftRotate(\intval($x14) ^ \intval($x3), 8); - $x9 += $x14; - $x4 = self::leftRotate(\intval($x4) ^ \intval($x9), 7); + $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 16); + $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 12); + $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 8); + $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 7); + + $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 16); + $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 12); + $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 8); + $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 7); + + $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 16); + $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 12); + $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 8); + $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 7); + + $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 16); + $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 12); + $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 8); + $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 7); // @codingStandardsIgnoreEnd + $x0 += $z0; $x1 += $z1; $x2 += $z2; @@ -995,6 +793,7 @@ protected static function salsa20($x) $x13 += $z13; $x14 += $z14; $x15 += $z15; - return \pack('V*', $x0, $x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8, $x9, $x10, $x11, $x12, $x13, $x14, $x15); + + return pack('V*', $x0, $x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8, $x9, $x10, $x11, $x12, $x13, $x14, $x15); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/AsymmetricKey.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/AsymmetricKey.php index 4148ff5..359b4f6 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/AsymmetricKey.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/AsymmetricKey.php @@ -10,6 +10,7 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\Common; use OCA\Libresign\Vendor\phpseclib3\Crypt\DSA; @@ -18,11 +19,11 @@ use OCA\Libresign\Vendor\phpseclib3\Exception\NoKeyLoadedException; use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedFormatException; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * Base Class for all asymmetric cipher classes * * @author Jim Wigginton - * @internal */ abstract class AsymmetricKey { @@ -32,30 +33,35 @@ abstract class AsymmetricKey * @var BigInteger */ protected static $zero; + /** * Precomputed One * * @var BigInteger */ protected static $one; + /** * Format of the loaded key * * @var string */ protected $format; + /** * Hash function * * @var Hash */ protected $hash; + /** * HMAC function * * @var Hash */ private $hmac; + /** * Supported plugins (lower case) * @@ -63,6 +69,7 @@ abstract class AsymmetricKey * @var array */ private static $plugins = []; + /** * Invisible plugins * @@ -70,32 +77,38 @@ abstract class AsymmetricKey * @var array */ private static $invisiblePlugins = []; + /** * Available Engines * * @var boolean[] */ protected static $engines = []; + /** * Key Comment * * @var null|string */ private $comment; + /** * @param string $type * @return array|string */ - public abstract function toString($type, array $options = []); + abstract public function toString($type, array $options = []); + /** * The constructor */ protected function __construct() { self::initialize_static_variables(); + $this->hash = new Hash('sha256'); $this->hmac = new Hash('sha256'); } + /** * Initialize static variables */ @@ -105,11 +118,13 @@ protected static function initialize_static_variables() self::$zero = new BigInteger(0); self::$one = new BigInteger(1); } + self::loadPlugins('Keys'); if (static::ALGORITHM != 'RSA' && static::ALGORITHM != 'DH') { self::loadPlugins('Signature'); } } + /** * Load the key * @@ -117,38 +132,45 @@ protected static function initialize_static_variables() * @param string $password optional * @return PublicKey|PrivateKey */ - public static function load($key, $password = \false) + public static function load($key, $password = false) { self::initialize_static_variables(); + $class = new \ReflectionClass(static::class); if ($class->isFinal()) { throw new \RuntimeException('load() should not be called from final classes (' . static::class . ')'); } - $components = \false; + + $components = false; foreach (self::$plugins[static::ALGORITHM]['Keys'] as $format) { - if (isset(self::$invisiblePlugins[static::ALGORITHM]) && \in_array($format, self::$invisiblePlugins[static::ALGORITHM])) { + if (isset(self::$invisiblePlugins[static::ALGORITHM]) && in_array($format, self::$invisiblePlugins[static::ALGORITHM])) { continue; } try { $components = $format::load($key, $password); } catch (\Exception $e) { - $components = \false; + $components = false; } - if ($components !== \false) { + if ($components !== false) { break; } } - if ($components === \false) { + + if ($components === false) { throw new NoKeyLoadedException('Unable to read key'); } + $components['format'] = $format; $components['secret'] = isset($components['secret']) ? $components['secret'] : ''; $comment = isset($components['comment']) ? $components['comment'] : null; $new = static::onLoad($components); $new->format = $format; $new->comment = $comment; - return $new instanceof PrivateKey ? $new->withPassword($password) : $new; + return $new instanceof PrivateKey ? + $new->withPassword($password) : + $new; } + /** * Loads a private key * @@ -164,6 +186,7 @@ public static function loadPrivateKey($key, $password = '') } return $key; } + /** * Loads a public key * @@ -178,6 +201,7 @@ public static function loadPublicKey($key) } return $key; } + /** * Loads parameters * @@ -192,6 +216,7 @@ public static function loadParameters($key) } return $key; } + /** * Load the key, assuming a specific format * @@ -200,24 +225,31 @@ public static function loadParameters($key) * @param string $password optional * @return static */ - public static function loadFormat($type, $key, $password = \false) + public static function loadFormat($type, $key, $password = false) { self::initialize_static_variables(); - $components = \false; - $format = \strtolower($type); + + $components = false; + $format = strtolower($type); if (isset(self::$plugins[static::ALGORITHM]['Keys'][$format])) { $format = self::$plugins[static::ALGORITHM]['Keys'][$format]; $components = $format::load($key, $password); } - if ($components === \false) { + + if ($components === false) { throw new NoKeyLoadedException('Unable to read key'); } + $components['format'] = $format; $components['secret'] = isset($components['secret']) ? $components['secret'] : ''; + $new = static::onLoad($components); $new->format = $format; - return $new instanceof PrivateKey ? $new->withPassword($password) : $new; + return $new instanceof PrivateKey ? + $new->withPassword($password) : + $new; } + /** * Loads a private key * @@ -226,7 +258,7 @@ public static function loadFormat($type, $key, $password = \false) * @param string $key * @param string $password optional */ - public static function loadPrivateKeyFormat($type, $key, $password = \false) + public static function loadPrivateKeyFormat($type, $key, $password = false) { $key = self::loadFormat($type, $key, $password); if (!$key instanceof PrivateKey) { @@ -234,6 +266,7 @@ public static function loadPrivateKeyFormat($type, $key, $password = \false) } return $key; } + /** * Loads a public key * @@ -249,6 +282,7 @@ public static function loadPublicKeyFormat($type, $key) } return $key; } + /** * Loads parameters * @@ -264,6 +298,7 @@ public static function loadParametersFormat($type, $key) } return $key; } + /** * Validate Plugin * @@ -274,16 +309,18 @@ public static function loadParametersFormat($type, $key) */ protected static function validatePlugin($format, $type, $method = null) { - $type = \strtolower($type); + $type = strtolower($type); if (!isset(self::$plugins[static::ALGORITHM][$format][$type])) { - throw new UnsupportedFormatException("{$type} is not a supported format"); + throw new UnsupportedFormatException("$type is not a supported format"); } $type = self::$plugins[static::ALGORITHM][$format][$type]; - if (isset($method) && !\method_exists($type, $method)) { - throw new UnsupportedFormatException("{$type} does not implement {$method}"); + if (isset($method) && !method_exists($type, $method)) { + throw new UnsupportedFormatException("$type does not implement $method"); } + return $type; } + /** * Load Plugins * @@ -301,18 +338,19 @@ private static function loadPlugins($format) if ($name[0] == '.') { continue; } - $type = '\\OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\' . static::ALGORITHM . '\\Formats\\' . $format . '\\' . $name; + $type = '\OCA\Libresign\Vendor\phpseclib3\Crypt\\' . static::ALGORITHM . '\\Formats\\' . $format . '\\' . $name; $reflect = new \ReflectionClass($type); if ($reflect->isTrait()) { continue; } - self::$plugins[static::ALGORITHM][$format][\strtolower($name)] = $type; + self::$plugins[static::ALGORITHM][$format][strtolower($name)] = $type; if ($reflect->hasConstant('IS_INVISIBLE')) { self::$invisiblePlugins[static::ALGORITHM][] = $type; } } } } + /** * Returns a list of supported formats. * @@ -321,8 +359,10 @@ private static function loadPlugins($format) public static function getSupportedKeyFormats() { self::initialize_static_variables(); + return self::$plugins[static::ALGORITHM]['Keys']; } + /** * Add a fileformat plugin * @@ -336,15 +376,17 @@ public static function getSupportedKeyFormats() public static function addFileFormat($fullname) { self::initialize_static_variables(); - if (\class_exists($fullname)) { + + if (class_exists($fullname)) { $meta = new \ReflectionClass($fullname); $shortname = $meta->getShortName(); - self::$plugins[static::ALGORITHM]['Keys'][\strtolower($shortname)] = $fullname; + self::$plugins[static::ALGORITHM]['Keys'][strtolower($shortname)] = $fullname; if ($meta->hasConstant('IS_INVISIBLE')) { - self::$invisiblePlugins[static::ALGORITHM][] = \strtolower($shortname); + self::$invisiblePlugins[static::ALGORITHM][] = strtolower($shortname); } } } + /** * Returns the format of the loaded key. * @@ -359,9 +401,11 @@ public function getLoadedFormat() if (empty($this->format)) { throw new NoKeyLoadedException('This key was created with createKey - it was not loaded with load. Therefore there is no "loaded format"'); } + $meta = new \ReflectionClass($this->format); return $meta->getShortName(); } + /** * Returns the key's comment * @@ -373,6 +417,7 @@ public function getComment() { return $this->comment; } + /** * Tests engine validity * @@ -380,23 +425,30 @@ public function getComment() public static function useBestEngine() { static::$engines = [ - 'PHP' => \true, - 'OpenSSL' => \extension_loaded('openssl'), + 'PHP' => true, + 'OpenSSL' => extension_loaded('openssl'), // this test can be satisfied by either of the following: // http://php.net/manual/en/book.sodium.php // https://github.com/paragonie/sodium_compat - 'libsodium' => \function_exists('sodium_crypto_sign_keypair'), + 'libsodium' => function_exists('sodium_crypto_sign_keypair') ]; + return static::$engines; } + /** * Flag to use internal engine only (useful for unit testing) * */ public static function useInternalEngine() { - static::$engines = ['PHP' => \true, 'OpenSSL' => \false, 'libsodium' => \false]; + static::$engines = [ + 'PHP' => true, + 'OpenSSL' => false, + 'libsodium' => false + ]; } + /** * __toString() magic method * @@ -406,6 +458,7 @@ public function __toString() { return $this->toString('PKCS8'); } + /** * Determines which hashing function should be used * @@ -414,10 +467,13 @@ public function __toString() public function withHash($hash) { $new = clone $this; + $new->hash = new Hash($hash); $new->hmac = new Hash($hash); + return $new; } + /** * Returns the hash algorithm currently being used * @@ -426,6 +482,7 @@ public function getHash() { return clone $this->hash; } + /** * Compute the pseudorandom k for signature generation, * using the process specified for deterministic DSA. @@ -435,34 +492,42 @@ public function getHash() */ protected function computek($h1) { - $v = \str_repeat("\x01", \strlen($h1)); - $k = \str_repeat("\x00", \strlen($h1)); + $v = str_repeat("\1", strlen($h1)); + + $k = str_repeat("\0", strlen($h1)); + $x = $this->int2octets($this->x); $h1 = $this->bits2octets($h1); + $this->hmac->setKey($k); - $k = $this->hmac->hash($v . "\x00" . $x . $h1); + $k = $this->hmac->hash($v . "\0" . $x . $h1); $this->hmac->setKey($k); $v = $this->hmac->hash($v); - $k = $this->hmac->hash($v . "\x01" . $x . $h1); + $k = $this->hmac->hash($v . "\1" . $x . $h1); $this->hmac->setKey($k); $v = $this->hmac->hash($v); + $qlen = $this->q->getLengthInBytes(); - while (\true) { + + while (true) { $t = ''; - while (\strlen($t) < $qlen) { + while (strlen($t) < $qlen) { $v = $this->hmac->hash($v); $t = $t . $v; } $k = $this->bits2int($t); + if (!$k->equals(self::$zero) && $k->compare($this->q) < 0) { break; } - $k = $this->hmac->hash($v . "\x00"); + $k = $this->hmac->hash($v . "\0"); $this->hmac->setKey($k); $v = $this->hmac->hash($v); } + return $k; } + /** * Integer to Octet String * @@ -473,14 +538,15 @@ private function int2octets($v) { $out = $v->toBytes(); $rolen = $this->q->getLengthInBytes(); - if (\strlen($out) < $rolen) { - return \str_pad($out, $rolen, "\x00", \STR_PAD_LEFT); - } elseif (\strlen($out) > $rolen) { - return \substr($out, -$rolen); + if (strlen($out) < $rolen) { + return str_pad($out, $rolen, "\0", STR_PAD_LEFT); + } elseif (strlen($out) > $rolen) { + return substr($out, -$rolen); } else { return $out; } } + /** * Bit String to Integer * @@ -490,13 +556,14 @@ private function int2octets($v) protected function bits2int($in) { $v = new BigInteger($in, 256); - $vlen = \strlen($in) << 3; + $vlen = strlen($in) << 3; $qlen = $this->q->getLength(); if ($vlen > $qlen) { return $v->bitwise_rightShift($vlen - $qlen); } return $v; } + /** * Bit String to Octet String * @@ -507,6 +574,8 @@ private function bits2octets($in) { $z1 = $this->bits2int($in); $z2 = $z1->subtract($this->q); - return $z2->compare(self::$zero) < 0 ? $this->int2octets($z1) : $this->int2octets($z2); + return $z2->compare(self::$zero) < 0 ? + $this->int2octets($z1) : + $this->int2octets($z2); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/BlockCipher.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/BlockCipher.php index 99fda5b..100cac7 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/BlockCipher.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/BlockCipher.php @@ -11,13 +11,13 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\Common; /** * Base Class for all block cipher classes * * @author Jim Wigginton - * @internal */ abstract class BlockCipher extends SymmetricKey { diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/JWK.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/JWK.php index 468a268..0273fe9 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/JWK.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/JWK.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Keys; use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; + /** * JSON Web Key Formatted Key Handler * * @author Jim Wigginton - * @internal */ abstract class JWK { @@ -31,32 +32,39 @@ abstract class JWK public static function load($key, $password = '') { if (!Strings::is_stringable($key)) { - throw new \UnexpectedValueException('Key should be a string - not a ' . \gettype($key)); + throw new \UnexpectedValueException('Key should be a string - not a ' . gettype($key)); } - $key = \preg_replace('#\\s#', '', $key); - // remove whitespace - if (\PHP_VERSION_ID >= 73000) { - $key = \json_decode($key, null, 512, \JSON_THROW_ON_ERROR); + + $key = preg_replace('#\s#', '', $key); // remove whitespace + + if (PHP_VERSION_ID >= 73000) { + $key = json_decode($key, null, 512, JSON_THROW_ON_ERROR); } else { - $key = \json_decode($key); + $key = json_decode($key); if (!$key) { throw new \RuntimeException('Unable to decode JSON'); } } + if (isset($key->kty)) { return $key; } - if (!\is_object($key)) { + + if (!is_object($key)) { throw new \RuntimeException('invalid JWK: not an object'); } + if (!isset($key->keys)) { throw new \RuntimeException('invalid JWK: object has no property "keys"'); } - if (\count($key->keys) != 1) { + + if (count($key->keys) != 1) { throw new \RuntimeException('Although the JWK key format supports multiple keys phpseclib does not'); } + return $key->keys[0]; } + /** * Wrap a key appropriately * @@ -64,6 +72,6 @@ public static function load($key, $password = '') */ protected static function wrapKey(array $key, array $options) { - return \json_encode(['keys' => [$key + $options]]); + return json_encode(['keys' => [$key + $options]]); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/OpenSSH.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/OpenSSH.php index 094a194..ddf20a9 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/OpenSSH.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/OpenSSH.php @@ -12,17 +12,18 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Keys; use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; use OCA\Libresign\Vendor\phpseclib3\Crypt\AES; use OCA\Libresign\Vendor\phpseclib3\Crypt\Random; use OCA\Libresign\Vendor\phpseclib3\Exception\BadDecryptionException; + /** * OpenSSH Formatted RSA Key Handler * * @author Jim Wigginton - * @internal */ abstract class OpenSSH { @@ -32,12 +33,14 @@ abstract class OpenSSH * @var string */ protected static $comment = 'phpseclib-generated-key'; + /** * Binary key flag * * @var bool */ - protected static $binary = \false; + protected static $binary = false; + /** * Sets the default comment * @@ -45,8 +48,9 @@ abstract class OpenSSH */ public static function setComment($comment) { - self::$comment = \str_replace(["\r", "\n"], '', $comment); + self::$comment = str_replace(["\r", "\n"], '', $comment); } + /** * Break a public or private key down into its constituent components * @@ -59,15 +63,17 @@ public static function setComment($comment) public static function load($key, $password = '') { if (!Strings::is_stringable($key)) { - throw new \UnexpectedValueException('Key should be a string - not a ' . \gettype($key)); + throw new \UnexpectedValueException('Key should be a string - not a ' . gettype($key)); } + // key format is described here: // https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/ssh/PROTOCOL.key?annotate=HEAD - if (\strpos($key, 'BEGIN OPENSSH PRIVATE KEY') !== \false) { - $key = \preg_replace('#(?:^-.*?-[\\r\\n]*$)|\\s#ms', '', $key); + + if (strpos($key, 'BEGIN OPENSSH PRIVATE KEY') !== false) { + $key = preg_replace('#(?:^-.*?-[\r\n]*$)|\s#ms', '', $key); $key = Strings::base64_decode($key); $magic = Strings::shift($key, 15); - if ($magic != "openssh-key-v1\x00") { + if ($magic != "openssh-key-v1\0") { throw new \RuntimeException('Expected openssh-key-v1'); } list($ciphername, $kdfname, $kdfoptions, $numKeys) = Strings::unpackSSH2('sssN', $key); @@ -93,6 +99,7 @@ public static function load($key, $password = '') default: throw new \RuntimeException('The only supported ciphers are: none, aes256-ctr (' . $ciphername . ' is being used)'); } + list($publicKey, $paddedKey) = Strings::unpackSSH2('ss', $key); list($type) = Strings::unpackSSH2('s', $publicKey); if (isset($crypto)) { @@ -104,35 +111,42 @@ public static function load($key, $password = '') if (isset($crypto)) { throw new BadDecryptionException('Unable to decrypt key - please verify the password you are using'); } - throw new \RuntimeException("The two checkints do not match ({$checkint1} vs. {$checkint2})"); + throw new \RuntimeException("The two checkints do not match ($checkint1 vs. $checkint2)"); } self::checkType($type); - return \compact('type', 'publicKey', 'paddedKey'); + + return compact('type', 'publicKey', 'paddedKey'); } - $parts = \explode(' ', $key, 3); + + $parts = explode(' ', $key, 3); + if (!isset($parts[1])) { - $key = \base64_decode($parts[0]); - $comment = \false; + $key = base64_decode($parts[0]); + $comment = false; } else { $asciiType = $parts[0]; self::checkType($parts[0]); - $key = \base64_decode($parts[1]); - $comment = isset($parts[2]) ? $parts[2] : \false; + $key = base64_decode($parts[1]); + $comment = isset($parts[2]) ? $parts[2] : false; } - if ($key === \false) { - throw new \UnexpectedValueException('Key should be a string - not a ' . \gettype($key)); + if ($key === false) { + throw new \UnexpectedValueException('Key should be a string - not a ' . gettype($key)); } + list($type) = Strings::unpackSSH2('s', $key); self::checkType($type); if (isset($asciiType) && $asciiType != $type) { throw new \RuntimeException('Two different types of keys are claimed: ' . $asciiType . ' and ' . $type); } - if (\strlen($key) <= 4) { + if (strlen($key) <= 4) { throw new \UnexpectedValueException('Key appears to be malformed'); } + $publicKey = $key; - return \compact('type', 'publicKey', 'comment'); + + return compact('type', 'publicKey', 'comment'); } + /** * Toggle between binary and printable keys * @@ -145,6 +159,7 @@ public static function setBinaryOutput($enabled) { self::$binary = $enabled; } + /** * Checks to see if the type is valid * @@ -152,10 +167,11 @@ public static function setBinaryOutput($enabled) */ private static function checkType($candidate) { - if (!\in_array($candidate, static::$types)) { - throw new \RuntimeException("The key type ({$candidate}) is not equal to: " . \implode(',', static::$types)); + if (!in_array($candidate, static::$types)) { + throw new \RuntimeException("The key type ($candidate) is not equal to: " . implode(',', static::$types)); } } + /** * Wrap a private key appropriately * @@ -167,21 +183,26 @@ private static function checkType($candidate) */ protected static function wrapPrivateKey($publicKey, $privateKey, $password, $options) { - list(, $checkint) = \unpack('N', Random::string(4)); + list(, $checkint) = unpack('N', Random::string(4)); + $comment = isset($options['comment']) ? $options['comment'] : self::$comment; - $paddedKey = Strings::packSSH2('NN', $checkint, $checkint) . $privateKey . Strings::packSSH2('s', $comment); - $usesEncryption = !empty($password) && \is_string($password); + $paddedKey = Strings::packSSH2('NN', $checkint, $checkint) . + $privateKey . + Strings::packSSH2('s', $comment); + + $usesEncryption = !empty($password) && is_string($password); + /* - from http://tools.ietf.org/html/rfc4253#section-6 : - - Note that the length of the concatenation of 'packet_length', - 'padding_length', 'payload', and 'random padding' MUST be a multiple - of the cipher block size or 8, whichever is larger. - */ + from http://tools.ietf.org/html/rfc4253#section-6 : + + Note that the length of the concatenation of 'packet_length', + 'padding_length', 'payload', and 'random padding' MUST be a multiple + of the cipher block size or 8, whichever is larger. + */ $blockSize = $usesEncryption ? 16 : 8; - $paddingLength = ($blockSize - 1) * \strlen($paddedKey) % $blockSize; + $paddingLength = (($blockSize - 1) * strlen($paddedKey)) % $blockSize; for ($i = 1; $i <= $paddingLength; $i++) { - $paddedKey .= \chr($i); + $paddedKey .= chr($i); } if (!$usesEncryption) { $key = Strings::packSSH2('sssNss', 'none', 'none', '', 1, $publicKey, $paddedKey); @@ -194,7 +215,10 @@ protected static function wrapPrivateKey($publicKey, $privateKey, $password, $op $paddedKey = $crypto->encrypt($paddedKey); $key = Strings::packSSH2('sssNss', 'aes256-ctr', 'bcrypt', $kdfoptions, 1, $publicKey, $paddedKey); } - $key = "openssh-key-v1\x00{$key}"; - return "-----BEGIN OPENSSH PRIVATE KEY-----\n" . \chunk_split(Strings::base64_encode($key), 70, "\n") . "-----END OPENSSH PRIVATE KEY-----\n"; + $key = "openssh-key-v1\0$key"; + + return "-----BEGIN OPENSSH PRIVATE KEY-----\n" . + chunk_split(Strings::base64_encode($key), 70, "\n") . + "-----END OPENSSH PRIVATE KEY-----\n"; } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS.php index 1eab782..d142fad 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS.php @@ -10,13 +10,13 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Keys; /** * PKCS1 Formatted Key Handler * * @author Jim Wigginton - * @internal */ abstract class PKCS { @@ -33,12 +33,14 @@ abstract class PKCS */ const MODE_DER = 2; /**#@-*/ + /** * Is the key a base-64 encoded PEM, DER or should it be auto-detected? * * @var int */ protected static $format = self::MODE_ANY; + /** * Require base64-encoded PEM's be supplied * @@ -47,6 +49,7 @@ public static function requirePEM() { self::$format = self::MODE_PEM; } + /** * Require raw DER's be supplied * @@ -55,6 +58,7 @@ public static function requireDER() { self::$format = self::MODE_DER; } + /** * Accept any format and auto detect the format * diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS1.php index 1a39ac9..88a0b2a 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS1.php @@ -10,6 +10,7 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Keys; use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; @@ -19,11 +20,11 @@ use OCA\Libresign\Vendor\phpseclib3\Crypt\TripleDES; use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedAlgorithmException; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * PKCS1 Formatted Key Handler * * @author Jim Wigginton - * @internal */ abstract class PKCS1 extends PKCS { @@ -33,6 +34,7 @@ abstract class PKCS1 extends PKCS * @var string */ private static $defaultEncryptionAlgorithm = 'AES-128-CBC'; + /** * Sets the default encryption algorithm * @@ -42,6 +44,7 @@ public static function setEncryptionAlgorithm($algo) { self::$defaultEncryptionAlgorithm = $algo; } + /** * Returns the mode constant corresponding to the mode string * @@ -61,6 +64,7 @@ private static function getEncryptionMode($mode) } throw new \UnexpectedValueException('Unsupported block cipher mode of operation'); } + /** * Returns a cipher object corresponding to a string * @@ -71,19 +75,20 @@ private static function getEncryptionMode($mode) private static function getEncryptionObject($algo) { $modes = '(CBC|ECB|CFB|OFB|CTR)'; - switch (\true) { - case \preg_match("#^AES-(128|192|256)-{$modes}\$#", $algo, $matches): + switch (true) { + case preg_match("#^AES-(128|192|256)-$modes$#", $algo, $matches): $cipher = new AES(self::getEncryptionMode($matches[2])); $cipher->setKeyLength($matches[1]); return $cipher; - case \preg_match("#^DES-EDE3-{$modes}\$#", $algo, $matches): + case preg_match("#^DES-EDE3-$modes$#", $algo, $matches): return new TripleDES(self::getEncryptionMode($matches[1])); - case \preg_match("#^DES-{$modes}\$#", $algo, $matches): + case preg_match("#^DES-$modes$#", $algo, $matches): return new DES(self::getEncryptionMode($matches[1])); default: throw new UnsupportedAlgorithmException($algo . ' is not a supported algorithm'); } } + /** * Generate a symmetric key for PKCS#1 keys * @@ -95,12 +100,13 @@ private static function getEncryptionObject($algo) private static function generateSymmetricKey($password, $iv, $length) { $symkey = ''; - $iv = \substr($iv, 0, 8); - while (\strlen($symkey) < $length) { - $symkey .= \md5($symkey . $password . $iv, \true); + $iv = substr($iv, 0, 8); + while (strlen($symkey) < $length) { + $symkey .= md5($symkey . $password . $iv, true); } - return \substr($symkey, 0, $length); + return substr($symkey, 0, $length); } + /** * Break a public or private key down into its constituent components * @@ -111,29 +117,30 @@ private static function generateSymmetricKey($password, $iv, $length) protected static function load($key, $password) { if (!Strings::is_stringable($key)) { - throw new \UnexpectedValueException('Key should be a string - not a ' . \gettype($key)); + throw new \UnexpectedValueException('Key should be a string - not a ' . gettype($key)); } + /* Although PKCS#1 proposes a format that public and private keys can use, encrypting them is - "outside the scope" of PKCS#1. PKCS#1 then refers you to PKCS#12 and PKCS#15 if you're wanting to - protect private keys, however, that's not what OpenSSL* does. OpenSSL protects private keys by adding - two new "fields" to the key - DEK-Info and Proc-Type. These fields are discussed here: - - http://tools.ietf.org/html/rfc1421#section-4.6.1.1 - http://tools.ietf.org/html/rfc1421#section-4.6.1.3 - - DES-EDE3-CBC as an algorithm, however, is not discussed anywhere, near as I can tell. - DES-CBC and DES-EDE are discussed in RFC1423, however, DES-EDE3-CBC isn't, nor is its key derivation - function. As is, the definitive authority on this encoding scheme isn't the IETF but rather OpenSSL's - own implementation. ie. the implementation *is* the standard and any bugs that may exist in that - implementation are part of the standard, as well. - - * OpenSSL is the de facto standard. It's utilized by OpenSSH and other projects */ - if (\preg_match('#DEK-Info: (.+),(.+)#', $key, $matches)) { - $iv = Strings::hex2bin(\trim($matches[2])); + "outside the scope" of PKCS#1. PKCS#1 then refers you to PKCS#12 and PKCS#15 if you're wanting to + protect private keys, however, that's not what OpenSSL* does. OpenSSL protects private keys by adding + two new "fields" to the key - DEK-Info and Proc-Type. These fields are discussed here: + + http://tools.ietf.org/html/rfc1421#section-4.6.1.1 + http://tools.ietf.org/html/rfc1421#section-4.6.1.3 + + DES-EDE3-CBC as an algorithm, however, is not discussed anywhere, near as I can tell. + DES-CBC and DES-EDE are discussed in RFC1423, however, DES-EDE3-CBC isn't, nor is its key derivation + function. As is, the definitive authority on this encoding scheme isn't the IETF but rather OpenSSL's + own implementation. ie. the implementation *is* the standard and any bugs that may exist in that + implementation are part of the standard, as well. + + * OpenSSL is the de facto standard. It's utilized by OpenSSH and other projects */ + if (preg_match('#DEK-Info: (.+),(.+)#', $key, $matches)) { + $iv = Strings::hex2bin(trim($matches[2])); // remove the Proc-Type / DEK-Info sections as they're no longer needed - $key = \preg_replace('#^(?:Proc-Type|DEK-Info): .*#m', '', $key); + $key = preg_replace('#^(?:Proc-Type|DEK-Info): .*#m', '', $key); $ciphertext = ASN1::extractBER($key); - if ($ciphertext === \false) { + if ($ciphertext === false) { $ciphertext = $key; } $crypto = self::getEncryptionObject($matches[1]); @@ -143,15 +150,17 @@ function. As is, the definitive authority on this encoding scheme isn't the IET } else { if (self::$format != self::MODE_DER) { $decoded = ASN1::extractBER($key); - if ($decoded !== \false) { + if ($decoded !== false) { $key = $decoded; } elseif (self::$format == self::MODE_PEM) { throw new \UnexpectedValueException('Expected base64-encoded PEM format but was unable to decode base64 text'); } } } + return $key; } + /** * Wrap a private key appropriately * @@ -163,17 +172,27 @@ function. As is, the definitive authority on this encoding scheme isn't the IET */ protected static function wrapPrivateKey($key, $type, $password, array $options = []) { - if (empty($password) || !\is_string($password)) { - return "-----BEGIN {$type} PRIVATE KEY-----\r\n" . \chunk_split(Strings::base64_encode($key), 64) . "-----END {$type} PRIVATE KEY-----"; + if (empty($password) || !is_string($password)) { + return "-----BEGIN $type PRIVATE KEY-----\r\n" . + chunk_split(Strings::base64_encode($key), 64) . + "-----END $type PRIVATE KEY-----"; } + $encryptionAlgorithm = isset($options['encryptionAlgorithm']) ? $options['encryptionAlgorithm'] : self::$defaultEncryptionAlgorithm; + $cipher = self::getEncryptionObject($encryptionAlgorithm); $iv = Random::string($cipher->getBlockLength() >> 3); $cipher->setKey(self::generateSymmetricKey($password, $iv, $cipher->getKeyLength() >> 3)); $cipher->setIV($iv); - $iv = \strtoupper(Strings::bin2hex($iv)); - return "-----BEGIN {$type} PRIVATE KEY-----\r\n" . "Proc-Type: 4,ENCRYPTED\r\n" . "DEK-Info: " . $encryptionAlgorithm . ",{$iv}\r\n" . "\r\n" . \chunk_split(Strings::base64_encode($cipher->encrypt($key)), 64) . "-----END {$type} PRIVATE KEY-----"; + $iv = strtoupper(Strings::bin2hex($iv)); + return "-----BEGIN $type PRIVATE KEY-----\r\n" . + "Proc-Type: 4,ENCRYPTED\r\n" . + "DEK-Info: " . $encryptionAlgorithm . ",$iv\r\n" . + "\r\n" . + chunk_split(Strings::base64_encode($cipher->encrypt($key)), 64) . + "-----END $type PRIVATE KEY-----"; } + /** * Wrap a public key appropriately * @@ -183,6 +202,8 @@ protected static function wrapPrivateKey($key, $type, $password, array $options */ protected static function wrapPublicKey($key, $type) { - return "-----BEGIN {$type} PUBLIC KEY-----\r\n" . \chunk_split(Strings::base64_encode($key), 64) . "-----END {$type} PUBLIC KEY-----"; + return "-----BEGIN $type PUBLIC KEY-----\r\n" . + chunk_split(Strings::base64_encode($key), 64) . + "-----END $type PUBLIC KEY-----"; } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS8.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS8.php index dc70a78..dbcd023 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS8.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS8.php @@ -22,6 +22,7 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Keys; use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; @@ -35,11 +36,11 @@ use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedAlgorithmException; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; use OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; + /** * PKCS#8 Formatted Key Handler * * @author Jim Wigginton - * @internal */ abstract class PKCS8 extends PKCS { @@ -49,6 +50,7 @@ abstract class PKCS8 extends PKCS * @var string */ private static $defaultEncryptionAlgorithm = 'id-PBES2'; + /** * Default encryption scheme * @@ -57,6 +59,7 @@ abstract class PKCS8 extends PKCS * @var string */ private static $defaultEncryptionScheme = 'aes128-CBC-PAD'; + /** * Default PRF * @@ -65,24 +68,28 @@ abstract class PKCS8 extends PKCS * @var string */ private static $defaultPRF = 'id-hmacWithSHA256'; + /** * Default Iteration Count * * @var int */ private static $defaultIterationCount = 2048; + /** * OIDs loaded * * @var bool */ - private static $oidsLoaded = \false; + private static $oidsLoaded = false; + /** * Binary key flag * * @var bool */ - private static $binary = \false; + private static $binary = false; + /** * Sets the default encryption algorithm * @@ -92,6 +99,7 @@ public static function setEncryptionAlgorithm($algo) { self::$defaultEncryptionAlgorithm = $algo; } + /** * Sets the default encryption algorithm for PBES2 * @@ -101,6 +109,7 @@ public static function setEncryptionScheme($algo) { self::$defaultEncryptionScheme = $algo; } + /** * Sets the iteration count * @@ -110,6 +119,7 @@ public static function setIterationCount($count) { self::$defaultIterationCount = $count; } + /** * Sets the PRF for PBES2 * @@ -119,6 +129,7 @@ public static function setPRF($algo) { self::$defaultPRF = $algo; } + /** * Returns a SymmetricKey object based on a PBES1 $algo * @@ -127,8 +138,10 @@ public static function setPRF($algo) */ private static function getPBES1EncryptionObject($algo) { - $algo = \preg_match('#^pbeWith(?:MD2|MD5|SHA1|SHA)And(.*?)-CBC$#', $algo, $matches) ? $matches[1] : \substr($algo, 13); - // strlen('pbeWithSHAAnd') == 13 + $algo = preg_match('#^pbeWith(?:MD2|MD5|SHA1|SHA)And(.*?)-CBC$#', $algo, $matches) ? + $matches[1] : + substr($algo, 13); // strlen('pbeWithSHAAnd') == 13 + switch ($algo) { case 'DES': $cipher = new DES('cbc'); @@ -161,10 +174,12 @@ private static function getPBES1EncryptionObject($algo) $cipher->setKeyLength(40); break; default: - throw new UnsupportedAlgorithmException("{$algo} is not a supported algorithm"); + throw new UnsupportedAlgorithmException("$algo is not a supported algorithm"); } + return $cipher; } + /** * Returns a hash based on a PBES1 $algo * @@ -173,11 +188,13 @@ private static function getPBES1EncryptionObject($algo) */ private static function getPBES1Hash($algo) { - if (\preg_match('#^pbeWith(MD2|MD5|SHA1|SHA)And.*?-CBC$#', $algo, $matches)) { + if (preg_match('#^pbeWith(MD2|MD5|SHA1|SHA)And.*?-CBC$#', $algo, $matches)) { return $matches[1] == 'SHA' ? 'sha1' : $matches[1]; } + return 'sha1'; } + /** * Returns a KDF baesd on a PBES1 $algo * @@ -195,8 +212,10 @@ private static function getPBES1KDF($algo) case 'pbeWithSHA1AndRC2-CBC': return 'pbkdf1'; } + return 'pkcs12'; } + /** * Returns a SymmetricKey object baesd on a PBES2 $algo * @@ -223,13 +242,15 @@ private static function getPBES2EncryptionObject($algo) case 'aes192-CBC-PAD': case 'aes256-CBC-PAD': $cipher = new AES('cbc'); - $cipher->setKeyLength(\substr($algo, 3, 3)); + $cipher->setKeyLength(substr($algo, 3, 3)); break; default: - throw new UnsupportedAlgorithmException("{$algo} is not supported"); + throw new UnsupportedAlgorithmException("$algo is not supported"); } + return $cipher; } + /** * Initialize static variables * @@ -239,51 +260,60 @@ private static function initialize_static_variables() if (!isset(static::$childOIDsLoaded)) { throw new InsufficientSetupException('This class should not be called directly'); } + if (!static::$childOIDsLoaded) { - ASN1::loadOIDs(\is_array(static::OID_NAME) ? \array_combine(static::OID_NAME, static::OID_VALUE) : [static::OID_NAME => static::OID_VALUE]); - static::$childOIDsLoaded = \true; + ASN1::loadOIDs(is_array(static::OID_NAME) ? + array_combine(static::OID_NAME, static::OID_VALUE) : + [static::OID_NAME => static::OID_VALUE]); + static::$childOIDsLoaded = true; } if (!self::$oidsLoaded) { // from https://tools.ietf.org/html/rfc2898 ASN1::loadOIDs([ - // PBES1 encryption schemes - 'pbeWithMD2AndDES-CBC' => '1.2.840.113549.1.5.1', - 'pbeWithMD2AndRC2-CBC' => '1.2.840.113549.1.5.4', - 'pbeWithMD5AndDES-CBC' => '1.2.840.113549.1.5.3', - 'pbeWithMD5AndRC2-CBC' => '1.2.840.113549.1.5.6', - 'pbeWithSHA1AndDES-CBC' => '1.2.840.113549.1.5.10', - 'pbeWithSHA1AndRC2-CBC' => '1.2.840.113549.1.5.11', - // from PKCS#12: - // https://tools.ietf.org/html/rfc7292 - 'pbeWithSHAAnd128BitRC4' => '1.2.840.113549.1.12.1.1', - 'pbeWithSHAAnd40BitRC4' => '1.2.840.113549.1.12.1.2', - 'pbeWithSHAAnd3-KeyTripleDES-CBC' => '1.2.840.113549.1.12.1.3', - 'pbeWithSHAAnd2-KeyTripleDES-CBC' => '1.2.840.113549.1.12.1.4', - 'pbeWithSHAAnd128BitRC2-CBC' => '1.2.840.113549.1.12.1.5', - 'pbeWithSHAAnd40BitRC2-CBC' => '1.2.840.113549.1.12.1.6', - 'id-PBKDF2' => '1.2.840.113549.1.5.12', - 'id-PBES2' => '1.2.840.113549.1.5.13', - 'id-PBMAC1' => '1.2.840.113549.1.5.14', - // from PKCS#5 v2.1: - // http://www.rsa.com/rsalabs/pkcs/files/h11302-wp-pkcs5v2-1-password-based-cryptography-standard.pdf - 'id-hmacWithSHA1' => '1.2.840.113549.2.7', - 'id-hmacWithSHA224' => '1.2.840.113549.2.8', - 'id-hmacWithSHA256' => '1.2.840.113549.2.9', - 'id-hmacWithSHA384' => '1.2.840.113549.2.10', - 'id-hmacWithSHA512' => '1.2.840.113549.2.11', - 'id-hmacWithSHA512-224' => '1.2.840.113549.2.12', - 'id-hmacWithSHA512-256' => '1.2.840.113549.2.13', - 'desCBC' => '1.3.14.3.2.7', - 'des-EDE3-CBC' => '1.2.840.113549.3.7', - 'rc2CBC' => '1.2.840.113549.3.2', - 'rc5-CBC-PAD' => '1.2.840.113549.3.9', - 'aes128-CBC-PAD' => '2.16.840.1.101.3.4.1.2', - 'aes192-CBC-PAD' => '2.16.840.1.101.3.4.1.22', - 'aes256-CBC-PAD' => '2.16.840.1.101.3.4.1.42', + // PBES1 encryption schemes + 'pbeWithMD2AndDES-CBC' => '1.2.840.113549.1.5.1', + 'pbeWithMD2AndRC2-CBC' => '1.2.840.113549.1.5.4', + 'pbeWithMD5AndDES-CBC' => '1.2.840.113549.1.5.3', + 'pbeWithMD5AndRC2-CBC' => '1.2.840.113549.1.5.6', + 'pbeWithSHA1AndDES-CBC' => '1.2.840.113549.1.5.10', + 'pbeWithSHA1AndRC2-CBC' => '1.2.840.113549.1.5.11', + + // from PKCS#12: + // https://tools.ietf.org/html/rfc7292 + 'pbeWithSHAAnd128BitRC4' => '1.2.840.113549.1.12.1.1', + 'pbeWithSHAAnd40BitRC4' => '1.2.840.113549.1.12.1.2', + 'pbeWithSHAAnd3-KeyTripleDES-CBC' => '1.2.840.113549.1.12.1.3', + 'pbeWithSHAAnd2-KeyTripleDES-CBC' => '1.2.840.113549.1.12.1.4', + 'pbeWithSHAAnd128BitRC2-CBC' => '1.2.840.113549.1.12.1.5', + 'pbeWithSHAAnd40BitRC2-CBC' => '1.2.840.113549.1.12.1.6', + + 'id-PBKDF2' => '1.2.840.113549.1.5.12', + 'id-PBES2' => '1.2.840.113549.1.5.13', + 'id-PBMAC1' => '1.2.840.113549.1.5.14', + + // from PKCS#5 v2.1: + // http://www.rsa.com/rsalabs/pkcs/files/h11302-wp-pkcs5v2-1-password-based-cryptography-standard.pdf + 'id-hmacWithSHA1' => '1.2.840.113549.2.7', + 'id-hmacWithSHA224' => '1.2.840.113549.2.8', + 'id-hmacWithSHA256' => '1.2.840.113549.2.9', + 'id-hmacWithSHA384' => '1.2.840.113549.2.10', + 'id-hmacWithSHA512' => '1.2.840.113549.2.11', + 'id-hmacWithSHA512-224' => '1.2.840.113549.2.12', + 'id-hmacWithSHA512-256' => '1.2.840.113549.2.13', + + 'desCBC' => '1.3.14.3.2.7', + 'des-EDE3-CBC' => '1.2.840.113549.3.7', + 'rc2CBC' => '1.2.840.113549.3.2', + 'rc5-CBC-PAD' => '1.2.840.113549.3.9', + + 'aes128-CBC-PAD' => '2.16.840.1.101.3.4.1.2', + 'aes192-CBC-PAD' => '2.16.840.1.101.3.4.1.22', + 'aes256-CBC-PAD' => '2.16.840.1.101.3.4.1.42' ]); - self::$oidsLoaded = \true; + self::$oidsLoaded = true; } } + /** * Break a public or private key down into its constituent components * @@ -294,14 +324,18 @@ private static function initialize_static_variables() protected static function load($key, $password = '') { if (!Strings::is_stringable($key)) { - throw new \UnexpectedValueException('Key should be a string - not a ' . \gettype($key)); + throw new \UnexpectedValueException('Key should be a string - not a ' . gettype($key)); } - $isPublic = \strpos($key, 'PUBLIC') !== \false; - $isPrivate = \strpos($key, 'PRIVATE') !== \false; + + $isPublic = strpos($key, 'PUBLIC') !== false; + $isPrivate = strpos($key, 'PRIVATE') !== false; + $decoded = self::preParse($key); + $meta = []; + $decrypted = ASN1::asn1map($decoded[0], Maps\EncryptedPrivateKeyInfo::MAP); - if (\strlen($password) && \is_array($decrypted)) { + if (strlen($password) && is_array($decrypted)) { $algorithm = $decrypted['encryptionAlgorithm']['algorithm']; switch ($algorithm) { // PBES1 @@ -320,7 +354,9 @@ protected static function load($key, $password = '') $cipher = self::getPBES1EncryptionObject($algorithm); $hash = self::getPBES1Hash($algorithm); $kdf = self::getPBES1KDF($algorithm); + $meta['meta']['algorithm'] = $algorithm; + $temp = ASN1::decodeBER($decrypted['encryptionAlgorithm']['parameters']); if (!$temp) { throw new \RuntimeException('Unable to decode BER'); @@ -335,9 +371,11 @@ protected static function load($key, $password = '') if (!$decoded) { throw new \RuntimeException('Unable to decode BER 2'); } + break; case 'id-PBES2': $meta['meta']['algorithm'] = $algorithm; + $temp = ASN1::decodeBER($decrypted['encryptionAlgorithm']['parameters']); if (!$temp) { throw new \RuntimeException('Unable to decode BER'); @@ -345,8 +383,10 @@ protected static function load($key, $password = '') $temp = ASN1::asn1map($temp[0], Maps\PBES2params::MAP); $keyDerivationFunc = $temp['keyDerivationFunc']; $encryptionScheme = $temp['encryptionScheme']; + $cipher = self::getPBES2EncryptionObject($encryptionScheme['algorithm']); $meta['meta']['cipher'] = $encryptionScheme['algorithm']; + $temp = ASN1::decodeBER($decrypted['encryptionAlgorithm']['parameters']); if (!$temp) { throw new \RuntimeException('Unable to decode BER'); @@ -354,6 +394,7 @@ protected static function load($key, $password = '') $temp = ASN1::asn1map($temp[0], Maps\PBES2params::MAP); $keyDerivationFunc = $temp['keyDerivationFunc']; $encryptionScheme = $temp['encryptionScheme']; + if (!$cipher instanceof RC2) { $cipher->setIV($encryptionScheme['parameters']['octetString']); } else { @@ -375,10 +416,12 @@ protected static function load($key, $password = '') case 58: $effectiveKeyLength = 128; break; + //default: // should be >= 256 } $cipher->setIV($iv); $cipher->setKeyLength($effectiveKeyLength); } + $meta['meta']['keyDerivationFunc'] = $keyDerivationFunc['algorithm']; switch ($keyDerivationFunc['algorithm']) { case 'id-PBKDF2': @@ -394,8 +437,14 @@ protected static function load($key, $password = '') $iterationCount = $params['iterationCount']; $prf = $params['prf']; $meta['meta']['prf'] = $prf['algorithm']; - $hash = \str_replace('-', '/', \substr($prf['algorithm'], 11)); - $params = [$password, 'pbkdf2', $hash, $salt, (int) $iterationCount->toString()]; + $hash = str_replace('-', '/', substr($prf['algorithm'], 11)); + $params = [ + $password, + 'pbkdf2', + $hash, + $salt, + (int) $iterationCount->toString() + ]; if (isset($keyLength)) { $params[] = (int) $keyLength->toString(); } @@ -415,19 +464,22 @@ protected static function load($key, $password = '') //$value = ASN1::asn1map($temp[0], Maps\PBMAC1params::MAP); // since i can't find any implementation that does PBMAC1 it is unsupported throw new UnsupportedAlgorithmException('Only PBES1 and PBES2 PKCS#8 keys are supported.'); + // at this point we'll assume that the key conforms to PublicKeyInfo } } + $private = ASN1::asn1map($decoded[0], Maps\OneAsymmetricKey::MAP); - if (\is_array($private)) { + if (is_array($private)) { if ($isPublic) { throw new \UnexpectedValueException('Human readable string claims public key but DER encoded string claims private key'); } + if (isset($private['privateKeyAlgorithm']['parameters']) && !$private['privateKeyAlgorithm']['parameters'] instanceof ASN1\Element && isset($decoded[0]['content'][1]['content'][1])) { $temp = $decoded[0]['content'][1]['content'][1]; - $private['privateKeyAlgorithm']['parameters'] = new ASN1\Element(\substr($key, $temp['start'], $temp['length'])); + $private['privateKeyAlgorithm']['parameters'] = new ASN1\Element(substr($key, $temp['start'], $temp['length'])); } - if (\is_array(static::OID_NAME)) { - if (!\in_array($private['privateKeyAlgorithm']['algorithm'], static::OID_NAME)) { + if (is_array(static::OID_NAME)) { + if (!in_array($private['privateKeyAlgorithm']['algorithm'], static::OID_NAME)) { throw new UnsupportedAlgorithmException($private['privateKeyAlgorithm']['algorithm'] . ' is not a supported key type'); } } else { @@ -436,27 +488,30 @@ protected static function load($key, $password = '') } } if (isset($private['publicKey'])) { - if ($private['publicKey'][0] != "\x00") { - throw new \UnexpectedValueException('The first byte of the public key should be null - not ' . \bin2hex($private['publicKey'][0])); + if ($private['publicKey'][0] != "\0") { + throw new \UnexpectedValueException('The first byte of the public key should be null - not ' . bin2hex($private['publicKey'][0])); } - $private['publicKey'] = \substr($private['publicKey'], 1); + $private['publicKey'] = substr($private['publicKey'], 1); } return $private + $meta; } + // EncryptedPrivateKeyInfo and PublicKeyInfo have largely identical "signatures". the only difference // is that the former has an octet string and the later has a bit string. the first byte of a bit // string represents the number of bits in the last byte that are to be ignored but, currently, // bit strings wanting a non-zero amount of bits trimmed are not supported $public = ASN1::asn1map($decoded[0], Maps\PublicKeyInfo::MAP); - if (\is_array($public)) { + + if (is_array($public)) { if ($isPrivate) { throw new \UnexpectedValueException('Human readable string claims private key but DER encoded string claims public key'); } - if ($public['publicKey'][0] != "\x00") { - throw new \UnexpectedValueException('The first byte of the public key should be null - not ' . \bin2hex($public['publicKey'][0])); + + if ($public['publicKey'][0] != "\0") { + throw new \UnexpectedValueException('The first byte of the public key should be null - not ' . bin2hex($public['publicKey'][0])); } - if (\is_array(static::OID_NAME)) { - if (!\in_array($public['publicKeyAlgorithm']['algorithm'], static::OID_NAME)) { + if (is_array(static::OID_NAME)) { + if (!in_array($public['publicKeyAlgorithm']['algorithm'], static::OID_NAME)) { throw new UnsupportedAlgorithmException($public['publicKeyAlgorithm']['algorithm'] . ' is not a supported key type'); } } else { @@ -466,13 +521,15 @@ protected static function load($key, $password = '') } if (isset($public['publicKeyAlgorithm']['parameters']) && !$public['publicKeyAlgorithm']['parameters'] instanceof ASN1\Element && isset($decoded[0]['content'][0]['content'][1])) { $temp = $decoded[0]['content'][0]['content'][1]; - $public['publicKeyAlgorithm']['parameters'] = new ASN1\Element(\substr($key, $temp['start'], $temp['length'])); + $public['publicKeyAlgorithm']['parameters'] = new ASN1\Element(substr($key, $temp['start'], $temp['length'])); } - $public['publicKey'] = \substr($public['publicKey'], 1); + $public['publicKey'] = substr($public['publicKey'], 1); return $public; } + throw new \RuntimeException('Unable to parse using either OneAsymmetricKey or PublicKeyInfo ASN1 maps'); } + /** * Toggle between binary (DER) and printable (PEM) keys * @@ -484,6 +541,7 @@ public static function setBinaryOutput($enabled) { self::$binary = $enabled; } + /** * Wrap a private key appropriately * @@ -499,7 +557,14 @@ public static function setBinaryOutput($enabled) protected static function wrapPrivateKey($key, $attr, $params, $password, $oid = null, $publicKey = '', array $options = []) { self::initialize_static_variables(); - $key = ['version' => 'v1', 'privateKeyAlgorithm' => ['algorithm' => \is_string(static::OID_NAME) ? static::OID_NAME : $oid], 'privateKey' => $key]; + + $key = [ + 'version' => 'v1', + 'privateKeyAlgorithm' => [ + 'algorithm' => is_string(static::OID_NAME) ? static::OID_NAME : $oid + ], + 'privateKey' => $key + ]; if ($oid != 'id-Ed25519' && $oid != 'id-Ed448') { $key['privateKeyAlgorithm']['parameters'] = $params; } @@ -511,50 +576,93 @@ protected static function wrapPrivateKey($key, $attr, $params, $password, $oid = $key['publicKey'] = $publicKey; } $key = ASN1::encodeDER($key, Maps\OneAsymmetricKey::MAP); - if (!empty($password) && \is_string($password)) { + if (!empty($password) && is_string($password)) { $salt = Random::string(8); + $iterationCount = isset($options['iterationCount']) ? $options['iterationCount'] : self::$defaultIterationCount; $encryptionAlgorithm = isset($options['encryptionAlgorithm']) ? $options['encryptionAlgorithm'] : self::$defaultEncryptionAlgorithm; $encryptionScheme = isset($options['encryptionScheme']) ? $options['encryptionScheme'] : self::$defaultEncryptionScheme; $prf = isset($options['PRF']) ? $options['PRF'] : self::$defaultPRF; + if ($encryptionAlgorithm == 'id-PBES2') { $crypto = self::getPBES2EncryptionObject($encryptionScheme); - $hash = \str_replace('-', '/', \substr($prf, 11)); + $hash = str_replace('-', '/', substr($prf, 11)); $kdf = 'pbkdf2'; $iv = Random::string($crypto->getBlockLength() >> 3); - $PBKDF2params = ['salt' => $salt, 'iterationCount' => $iterationCount, 'prf' => ['algorithm' => $prf, 'parameters' => null]]; + + $PBKDF2params = [ + 'salt' => $salt, + 'iterationCount' => $iterationCount, + 'prf' => ['algorithm' => $prf, 'parameters' => null] + ]; $PBKDF2params = ASN1::encodeDER($PBKDF2params, Maps\PBKDF2params::MAP); + if (!$crypto instanceof RC2) { $params = ['octetString' => $iv]; } else { - $params = ['rc2ParametersVersion' => 58, 'iv' => $iv]; + $params = [ + 'rc2ParametersVersion' => 58, + 'iv' => $iv + ]; $params = ASN1::encodeDER($params, Maps\RC2CBCParameter::MAP); $params = new ASN1\Element($params); } - $params = ['keyDerivationFunc' => ['algorithm' => 'id-PBKDF2', 'parameters' => new ASN1\Element($PBKDF2params)], 'encryptionScheme' => ['algorithm' => $encryptionScheme, 'parameters' => $params]]; + + $params = [ + 'keyDerivationFunc' => [ + 'algorithm' => 'id-PBKDF2', + 'parameters' => new ASN1\Element($PBKDF2params) + ], + 'encryptionScheme' => [ + 'algorithm' => $encryptionScheme, + 'parameters' => $params + ] + ]; $params = ASN1::encodeDER($params, Maps\PBES2params::MAP); + $crypto->setIV($iv); } else { $crypto = self::getPBES1EncryptionObject($encryptionAlgorithm); $hash = self::getPBES1Hash($encryptionAlgorithm); $kdf = self::getPBES1KDF($encryptionAlgorithm); - $params = ['salt' => $salt, 'iterationCount' => $iterationCount]; + + $params = [ + 'salt' => $salt, + 'iterationCount' => $iterationCount + ]; $params = ASN1::encodeDER($params, Maps\PBEParameter::MAP); } $crypto->setPassword($password, $kdf, $hash, $salt, $iterationCount); $key = $crypto->encrypt($key); - $key = ['encryptionAlgorithm' => ['algorithm' => $encryptionAlgorithm, 'parameters' => new ASN1\Element($params)], 'encryptedData' => $key]; + + $key = [ + 'encryptionAlgorithm' => [ + 'algorithm' => $encryptionAlgorithm, + 'parameters' => new ASN1\Element($params) + ], + 'encryptedData' => $key + ]; + $key = ASN1::encodeDER($key, Maps\EncryptedPrivateKeyInfo::MAP); + if (isset($options['binary']) ? $options['binary'] : self::$binary) { return $key; } - return "-----BEGIN ENCRYPTED PRIVATE KEY-----\r\n" . \chunk_split(Strings::base64_encode($key), 64) . "-----END ENCRYPTED PRIVATE KEY-----"; + + return "-----BEGIN ENCRYPTED PRIVATE KEY-----\r\n" . + chunk_split(Strings::base64_encode($key), 64) . + "-----END ENCRYPTED PRIVATE KEY-----"; } + if (isset($options['binary']) ? $options['binary'] : self::$binary) { return $key; } - return "-----BEGIN PRIVATE KEY-----\r\n" . \chunk_split(Strings::base64_encode($key), 64) . "-----END PRIVATE KEY-----"; + + return "-----BEGIN PRIVATE KEY-----\r\n" . + chunk_split(Strings::base64_encode($key), 64) . + "-----END PRIVATE KEY-----"; } + /** * Wrap a public key appropriately * @@ -566,16 +674,29 @@ protected static function wrapPrivateKey($key, $attr, $params, $password, $oid = protected static function wrapPublicKey($key, $params, $oid = null, array $options = []) { self::initialize_static_variables(); - $key = ['publicKeyAlgorithm' => ['algorithm' => \is_string(static::OID_NAME) ? static::OID_NAME : $oid], 'publicKey' => "\x00" . $key]; + + $key = [ + 'publicKeyAlgorithm' => [ + 'algorithm' => is_string(static::OID_NAME) ? static::OID_NAME : $oid + ], + 'publicKey' => "\0" . $key + ]; + if ($oid != 'id-Ed25519' && $oid != 'id-Ed448') { $key['publicKeyAlgorithm']['parameters'] = $params; } + $key = ASN1::encodeDER($key, Maps\PublicKeyInfo::MAP); + if (isset($options['binary']) ? $options['binary'] : self::$binary) { return $key; } - return "-----BEGIN PUBLIC KEY-----\r\n" . \chunk_split(Strings::base64_encode($key), 64) . "-----END PUBLIC KEY-----"; + + return "-----BEGIN PUBLIC KEY-----\r\n" . + chunk_split(Strings::base64_encode($key), 64) . + "-----END PUBLIC KEY-----"; } + /** * Perform some preliminary parsing of the key * @@ -585,20 +706,24 @@ protected static function wrapPublicKey($key, $params, $oid = null, array $optio private static function preParse(&$key) { self::initialize_static_variables(); + if (self::$format != self::MODE_DER) { $decoded = ASN1::extractBER($key); - if ($decoded !== \false) { + if ($decoded !== false) { $key = $decoded; } elseif (self::$format == self::MODE_PEM) { throw new \UnexpectedValueException('Expected base64-encoded PEM format but was unable to decode base64 text'); } } + $decoded = ASN1::decodeBER($key); if (!$decoded) { throw new \RuntimeException('Unable to decode BER'); } + return $decoded; } + /** * Returns the encryption parameters used by the key * @@ -608,20 +733,24 @@ private static function preParse(&$key) public static function extractEncryptionAlgorithm($key) { if (!Strings::is_stringable($key)) { - throw new \UnexpectedValueException('Key should be a string - not a ' . \gettype($key)); + throw new \UnexpectedValueException('Key should be a string - not a ' . gettype($key)); } + $decoded = self::preParse($key); + $r = ASN1::asn1map($decoded[0], Maps\EncryptedPrivateKeyInfo::MAP); - if (!\is_array($r)) { + if (!is_array($r)) { throw new \RuntimeException('Unable to parse using EncryptedPrivateKeyInfo map'); } + if ($r['encryptionAlgorithm']['algorithm'] == 'id-PBES2') { $decoded = ASN1::decodeBER($r['encryptionAlgorithm']['parameters']->element); if (!$decoded) { throw new \RuntimeException('Unable to decode BER'); } $r['encryptionAlgorithm']['parameters'] = ASN1::asn1map($decoded[0], Maps\PBES2params::MAP); - $kdf =& $r['encryptionAlgorithm']['parameters']['keyDerivationFunc']; + + $kdf = &$r['encryptionAlgorithm']['parameters']['keyDerivationFunc']; switch ($kdf['algorithm']) { case 'id-PBKDF2': $decoded = ASN1::decodeBER($kdf['parameters']->element); @@ -631,6 +760,7 @@ public static function extractEncryptionAlgorithm($key) $kdf['parameters'] = ASN1::asn1map($decoded[0], Maps\PBKDF2params::MAP); } } + return $r['encryptionAlgorithm']; } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PuTTY.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PuTTY.php index 221c10b..2ac35a1 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PuTTY.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PuTTY.php @@ -12,6 +12,7 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Keys; use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; @@ -19,11 +20,11 @@ use OCA\Libresign\Vendor\phpseclib3\Crypt\Hash; use OCA\Libresign\Vendor\phpseclib3\Crypt\Random; use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedAlgorithmException; + /** * PuTTY Formatted Key Handler * * @author Jim Wigginton - * @internal */ abstract class PuTTY { @@ -33,12 +34,14 @@ abstract class PuTTY * @var string */ private static $comment = 'phpseclib-generated-key'; + /** * Default version * * @var int */ private static $version = 2; + /** * Sets the default comment * @@ -46,8 +49,9 @@ abstract class PuTTY */ public static function setComment($comment) { - self::$comment = \str_replace(["\r", "\n"], '', $comment); + self::$comment = str_replace(["\r", "\n"], '', $comment); } + /** * Sets the default version * @@ -60,6 +64,7 @@ public static function setVersion($version) } self::$version = $version; } + /** * Generate a symmetric key for PuTTY v2 keys * @@ -71,12 +76,13 @@ private static function generateV2Key($password, $length) { $symkey = ''; $sequence = 0; - while (\strlen($symkey) < $length) { - $temp = \pack('Na*', $sequence++, $password); - $symkey .= Strings::hex2bin(\sha1($temp)); + while (strlen($symkey) < $length) { + $temp = pack('Na*', $sequence++, $password); + $symkey .= Strings::hex2bin(sha1($temp)); } - return \substr($symkey, 0, $length); + return substr($symkey, 0, $length); } + /** * Generate a symmetric key for PuTTY v3 keys * @@ -89,27 +95,31 @@ private static function generateV2Key($password, $length) */ private static function generateV3Key($password, $flavour, $memory, $passes, $salt) { - if (!\function_exists('sodium_crypto_pwhash')) { + if (!function_exists('sodium_crypto_pwhash')) { throw new \RuntimeException('sodium_crypto_pwhash needs to exist for Argon2 password hasing'); } + switch ($flavour) { case 'Argon2i': - $flavour = \SODIUM_CRYPTO_PWHASH_ALG_ARGON2I13; + $flavour = SODIUM_CRYPTO_PWHASH_ALG_ARGON2I13; break; case 'Argon2id': - $flavour = \SODIUM_CRYPTO_PWHASH_ALG_ARGON2ID13; + $flavour = SODIUM_CRYPTO_PWHASH_ALG_ARGON2ID13; break; default: throw new UnsupportedAlgorithmException('Only Argon2i and Argon2id are supported'); } - $length = 80; - // keylen + ivlen + mac_keylen - $temp = \sodium_crypto_pwhash($length, $password, $salt, $passes, $memory << 10, $flavour); - $symkey = \substr($temp, 0, 32); - $symiv = \substr($temp, 32, 16); - $hashkey = \substr($temp, -32); - return \compact('symkey', 'symiv', 'hashkey'); + + $length = 80; // keylen + ivlen + mac_keylen + $temp = sodium_crypto_pwhash($length, $password, $salt, $passes, $memory << 10, $flavour); + + $symkey = substr($temp, 0, 32); + $symiv = substr($temp, 32, 16); + $hashkey = substr($temp, -32); + + return compact('symkey', 'symiv', 'hashkey'); } + /** * Break a public or private key down into its constituent components * @@ -120,72 +130,83 @@ private static function generateV3Key($password, $flavour, $memory, $passes, $sa public static function load($key, $password) { if (!Strings::is_stringable($key)) { - throw new \UnexpectedValueException('Key should be a string - not a ' . \gettype($key)); + throw new \UnexpectedValueException('Key should be a string - not a ' . gettype($key)); } - if (\strpos($key, 'BEGIN SSH2 PUBLIC KEY') !== \false) { - $lines = \preg_split('#[\\r\\n]+#', $key); - switch (\true) { + + if (strpos($key, 'BEGIN SSH2 PUBLIC KEY') !== false) { + $lines = preg_split('#[\r\n]+#', $key); + switch (true) { case $lines[0] != '---- BEGIN SSH2 PUBLIC KEY ----': throw new \UnexpectedValueException('Key doesn\'t start with ---- BEGIN SSH2 PUBLIC KEY ----'); - case $lines[\count($lines) - 1] != '---- END SSH2 PUBLIC KEY ----': + case $lines[count($lines) - 1] != '---- END SSH2 PUBLIC KEY ----': throw new \UnexpectedValueException('Key doesn\'t end with ---- END SSH2 PUBLIC KEY ----'); } - $lines = \array_splice($lines, 1, -1); - $lines = \array_map(function ($line) { - return \rtrim($line, "\r\n"); + $lines = array_splice($lines, 1, -1); + $lines = array_map(function ($line) { + return rtrim($line, "\r\n"); }, $lines); $data = $current = ''; $values = []; - $in_value = \false; + $in_value = false; foreach ($lines as $line) { - switch (\true) { - case \preg_match('#^(.*?): (.*)#', $line, $match): - $in_value = $line[\strlen($line) - 1] == '\\'; - $current = \strtolower($match[1]); - $values[$current] = $in_value ? \substr($match[2], 0, -1) : $match[2]; + switch (true) { + case preg_match('#^(.*?): (.*)#', $line, $match): + $in_value = $line[strlen($line) - 1] == '\\'; + $current = strtolower($match[1]); + $values[$current] = $in_value ? substr($match[2], 0, -1) : $match[2]; break; case $in_value: - $in_value = $line[\strlen($line) - 1] == '\\'; - $values[$current] .= $in_value ? \substr($line, 0, -1) : $line; + $in_value = $line[strlen($line) - 1] == '\\'; + $values[$current] .= $in_value ? substr($line, 0, -1) : $line; break; default: $data .= $line; } } - $components = \call_user_func([static::PUBLIC_HANDLER, 'load'], $data); - if ($components === \false) { + + $components = call_user_func([static::PUBLIC_HANDLER, 'load'], $data); + if ($components === false) { throw new \UnexpectedValueException('Unable to decode public key'); } $components += $values; - $components['comment'] = \str_replace(['\\\\', '\\"'], ['\\', '"'], $values['comment']); + $components['comment'] = str_replace(['\\\\', '\"'], ['\\', '"'], $values['comment']); + return $components; } + $components = []; - $key = \preg_split('#\\r\\n|\\r|\\n#', \trim($key)); - if (Strings::shift($key[0], \strlen('PuTTY-User-Key-File-')) != 'PuTTY-User-Key-File-') { - return \false; + + $key = preg_split('#\r\n|\r|\n#', trim($key)); + if (Strings::shift($key[0], strlen('PuTTY-User-Key-File-')) != 'PuTTY-User-Key-File-') { + return false; } - $version = (int) Strings::shift($key[0], 3); - // should be either "2: " or "3: 0" prior to int casting + $version = (int) Strings::shift($key[0], 3); // should be either "2: " or "3: 0" prior to int casting if ($version != 2 && $version != 3) { throw new \RuntimeException('Only v2 and v3 PuTTY private keys are supported'); } - $components['type'] = $type = \rtrim($key[0]); - if (!\in_array($type, static::$types)) { - $error = \count(static::$types) == 1 ? 'Only ' . static::$types[0] . ' keys are supported. ' : ''; + $components['type'] = $type = rtrim($key[0]); + if (!in_array($type, static::$types)) { + $error = count(static::$types) == 1 ? + 'Only ' . static::$types[0] . ' keys are supported. ' : + ''; throw new UnsupportedAlgorithmException($error . 'This is an unsupported ' . $type . ' key'); } - $encryption = \trim(\preg_replace('#Encryption: (.+)#', '$1', $key[1])); - $components['comment'] = \trim(\preg_replace('#Comment: (.+)#', '$1', $key[2])); - $publicLength = \trim(\preg_replace('#Public-Lines: (\\d+)#', '$1', $key[3])); - $public = Strings::base64_decode(\implode('', \array_map('trim', \array_slice($key, 4, $publicLength)))); + $encryption = trim(preg_replace('#Encryption: (.+)#', '$1', $key[1])); + $components['comment'] = trim(preg_replace('#Comment: (.+)#', '$1', $key[2])); + + $publicLength = trim(preg_replace('#Public-Lines: (\d+)#', '$1', $key[3])); + $public = Strings::base64_decode(implode('', array_map('trim', array_slice($key, 4, $publicLength)))); + $source = Strings::packSSH2('ssss', $type, $encryption, $components['comment'], $public); - $length = \unpack('Nlength', Strings::shift($public, 4))['length']; + + $length = unpack('Nlength', Strings::shift($public, 4))['length']; $newtype = Strings::shift($public, $length); if ($newtype != $type) { throw new \RuntimeException('The binary type does not match the human readable type field'); } + $components['public'] = $public; + switch ($version) { case 3: $hashkey = ''; @@ -193,28 +214,32 @@ public static function load($key, $password) case 2: $hashkey = 'putty-private-key-file-mac-key'; } + $offset = $publicLength + 4; switch ($encryption) { case 'aes256-cbc': $crypto = new AES('cbc'); switch ($version) { case 3: - $flavour = \trim(\preg_replace('#Key-Derivation: (.*)#', '$1', $key[$offset++])); - $memory = \trim(\preg_replace('#Argon2-Memory: (\\d+)#', '$1', $key[$offset++])); - $passes = \trim(\preg_replace('#Argon2-Passes: (\\d+)#', '$1', $key[$offset++])); - $parallelism = \trim(\preg_replace('#Argon2-Parallelism: (\\d+)#', '$1', $key[$offset++])); - $salt = Strings::hex2bin(\trim(\preg_replace('#Argon2-Salt: ([0-9a-f]+)#', '$1', $key[$offset++]))); + $flavour = trim(preg_replace('#Key-Derivation: (.*)#', '$1', $key[$offset++])); + $memory = trim(preg_replace('#Argon2-Memory: (\d+)#', '$1', $key[$offset++])); + $passes = trim(preg_replace('#Argon2-Passes: (\d+)#', '$1', $key[$offset++])); + $parallelism = trim(preg_replace('#Argon2-Parallelism: (\d+)#', '$1', $key[$offset++])); + $salt = Strings::hex2bin(trim(preg_replace('#Argon2-Salt: ([0-9a-f]+)#', '$1', $key[$offset++]))); + $v3key = self::generateV3Key($password, $flavour, $memory, $passes, $salt); $symkey = $v3key['symkey']; $symiv = $v3key['symiv']; $hashkey = $v3key['hashkey']; + break; case 2: $symkey = self::generateV2Key($password, 32); - $symiv = \str_repeat("\x00", $crypto->getBlockLength() >> 3); + $symiv = str_repeat("\0", $crypto->getBlockLength() >> 3); $hashkey .= $password; } } + switch ($version) { case 3: $hash = new Hash('sha256'); @@ -222,25 +247,33 @@ public static function load($key, $password) break; case 2: $hash = new Hash('sha1'); - $hash->setKey(\sha1($hashkey, \true)); + $hash->setKey(sha1($hashkey, true)); } - $privateLength = \trim(\preg_replace('#Private-Lines: (\\d+)#', '$1', $key[$offset++])); - $private = Strings::base64_decode(\implode('', \array_map('trim', \array_slice($key, $offset, $privateLength)))); + + $privateLength = trim(preg_replace('#Private-Lines: (\d+)#', '$1', $key[$offset++])); + $private = Strings::base64_decode(implode('', array_map('trim', array_slice($key, $offset, $privateLength)))); + if ($encryption != 'none') { $crypto->setKey($symkey); $crypto->setIV($symiv); $crypto->disablePadding(); $private = $crypto->decrypt($private); } + $source .= Strings::packSSH2('s', $private); - $hmac = \trim(\preg_replace('#Private-MAC: (.+)#', '$1', $key[$offset + $privateLength])); + + $hmac = trim(preg_replace('#Private-MAC: (.+)#', '$1', $key[$offset + $privateLength])); $hmac = Strings::hex2bin($hmac); - if (!\hash_equals($hash->hash($source), $hmac)) { + + if (!hash_equals($hash->hash($source), $hmac)) { throw new \UnexpectedValueException('MAC validation error'); } + $components['private'] = $private; + return $components; } + /** * Wrap a private key appropriately * @@ -253,18 +286,23 @@ public static function load($key, $password) */ protected static function wrapPrivateKey($public, $private, $type, $password, array $options = []) { - $encryption = !empty($password) || \is_string($password) ? 'aes256-cbc' : 'none'; + $encryption = (!empty($password) || is_string($password)) ? 'aes256-cbc' : 'none'; $comment = isset($options['comment']) ? $options['comment'] : self::$comment; $version = isset($options['version']) ? $options['version'] : self::$version; - $key = "PuTTY-User-Key-File-{$version}: {$type}\r\n"; - $key .= "Encryption: {$encryption}\r\n"; - $key .= "Comment: {$comment}\r\n"; + + $key = "PuTTY-User-Key-File-$version: $type\r\n"; + $key .= "Encryption: $encryption\r\n"; + $key .= "Comment: $comment\r\n"; + $public = Strings::packSSH2('s', $type) . $public; + $source = Strings::packSSH2('ssss', $type, $encryption, $comment, $public); + $public = Strings::base64_encode($public); - $key .= "Public-Lines: " . (\strlen($public) + 63 >> 6) . "\r\n"; - $key .= \chunk_split($public, 64); - if (empty($password) && !\is_string($password)) { + $key .= "Public-Lines: " . ((strlen($public) + 63) >> 6) . "\r\n"; + $key .= chunk_split($public, 64); + + if (empty($password) && !is_string($password)) { $source .= Strings::packSSH2('s', $private); switch ($version) { case 3: @@ -273,12 +311,13 @@ protected static function wrapPrivateKey($public, $private, $type, $password, ar break; case 2: $hash = new Hash('sha1'); - $hash->setKey(\sha1('putty-private-key-file-mac-key', \true)); + $hash->setKey(sha1('putty-private-key-file-mac-key', true)); } } else { - $private .= Random::string(16 - (\strlen($private) & 15)); + $private .= Random::string(16 - (strlen($private) & 15)); $source .= Strings::packSSH2('s', $private); $crypto = new AES('cbc'); + switch ($version) { case 3: $salt = Random::string(16); @@ -291,28 +330,35 @@ protected static function wrapPrivateKey($public, $private, $type, $password, ar $symkey = $v3key['symkey']; $symiv = $v3key['symiv']; $hashkey = $v3key['hashkey']; + $hash = new Hash('sha256'); $hash->setKey($hashkey); + break; case 2: $symkey = self::generateV2Key($password, 32); - $symiv = \str_repeat("\x00", $crypto->getBlockLength() >> 3); + $symiv = str_repeat("\0", $crypto->getBlockLength() >> 3); $hashkey = 'putty-private-key-file-mac-key' . $password; + $hash = new Hash('sha1'); - $hash->setKey(\sha1($hashkey, \true)); + $hash->setKey(sha1($hashkey, true)); } + $crypto->setKey($symkey); $crypto->setIV($symiv); $crypto->disablePadding(); $private = $crypto->encrypt($private); $mac = $hash->hash($source); } + $private = Strings::base64_encode($private); - $key .= 'Private-Lines: ' . (\strlen($private) + 63 >> 6) . "\r\n"; - $key .= \chunk_split($private, 64); + $key .= 'Private-Lines: ' . ((strlen($private) + 63) >> 6) . "\r\n"; + $key .= chunk_split($private, 64); $key .= 'Private-MAC: ' . Strings::bin2hex($hash->hash($source)) . "\r\n"; + return $key; } + /** * Wrap a public key appropriately * @@ -324,8 +370,11 @@ protected static function wrapPrivateKey($public, $private, $type, $password, ar */ protected static function wrapPublicKey($key, $type) { - $key = \pack('Na*a*', \strlen($type), $type, $key); - $key = "---- BEGIN SSH2 PUBLIC KEY ----\r\n" . 'Comment: "' . \str_replace(['\\', '"'], ['\\\\', '\\"'], self::$comment) . "\"\r\n" . \chunk_split(Strings::base64_encode($key), 64) . '---- END SSH2 PUBLIC KEY ----'; + $key = pack('Na*a*', strlen($type), $type, $key); + $key = "---- BEGIN SSH2 PUBLIC KEY ----\r\n" . + 'Comment: "' . str_replace(['\\', '"'], ['\\\\', '\"'], self::$comment) . "\"\r\n" . + chunk_split(Strings::base64_encode($key), 64) . + '---- END SSH2 PUBLIC KEY ----'; return $key; } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Signature/Raw.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Signature/Raw.php index 3090975..0c70e21 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Signature/Raw.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Signature/Raw.php @@ -12,14 +12,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Signature; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * Raw Signature Handler * * @author Jim Wigginton - * @internal */ abstract class Raw { @@ -31,15 +32,20 @@ abstract class Raw */ public static function load($sig) { - switch (\true) { - case !\is_array($sig): + switch (true) { + case !is_array($sig): case !isset($sig['r']) || !isset($sig['s']): case !$sig['r'] instanceof BigInteger: case !$sig['s'] instanceof BigInteger: - return \false; + return false; } - return ['r' => $sig['r'], 's' => $sig['s']]; + + return [ + 'r' => $sig['r'], + 's' => $sig['s'] + ]; } + /** * Returns a signature in the appropriate format * @@ -49,6 +55,6 @@ public static function load($sig) */ public static function save(BigInteger $r, BigInteger $s) { - return \compact('r', 's'); + return compact('r', 's'); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/PrivateKey.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/PrivateKey.php index c593d4f..5f7ebcb 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/PrivateKey.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/PrivateKey.php @@ -8,13 +8,13 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\Common; /** * PrivateKey interface * * @author Jim Wigginton - * @internal */ interface PrivateKey { @@ -22,9 +22,10 @@ public function sign($message); //public function decrypt($ciphertext); public function getPublicKey(); public function toString($type, array $options = []); + /** * @param string|false $password * @return mixed */ - public function withPassword($password = \false); + public function withPassword($password = false); } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/PublicKey.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/PublicKey.php index 2843020..36f6b99 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/PublicKey.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/PublicKey.php @@ -8,13 +8,13 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\Common; /** * PublicKey interface * * @author Jim Wigginton - * @internal */ interface PublicKey { diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/StreamCipher.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/StreamCipher.php index f47d36b..ad74a21 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/StreamCipher.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/StreamCipher.php @@ -11,13 +11,13 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\Common; /** * Base Class for all stream cipher classes * * @author Jim Wigginton - * @internal */ abstract class StreamCipher extends SymmetricKey { @@ -30,6 +30,7 @@ abstract class StreamCipher extends SymmetricKey * @var int */ protected $block_size = 0; + /** * Default Constructor. * @@ -40,6 +41,7 @@ public function __construct() { parent::__construct('stream'); } + /** * Stream ciphers not use an IV * @@ -47,6 +49,6 @@ public function __construct() */ public function usesIV() { - return \false; + return false; } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/SymmetricKey.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/SymmetricKey.php index 82889b4..12cda8d 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/SymmetricKey.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/SymmetricKey.php @@ -31,6 +31,7 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\Common; use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; @@ -44,12 +45,12 @@ use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; use OCA\Libresign\Vendor\phpseclib3\Math\BinaryField; use OCA\Libresign\Vendor\phpseclib3\Math\PrimeField; + /** * Base Class for all \phpseclib3\Crypt\* cipher classes * * @author Jim Wigginton * @author Hans-Juergen Petrich - * @internal */ abstract class SymmetricKey { @@ -124,12 +125,24 @@ abstract class SymmetricKey * @see \phpseclib3\Crypt\Common\SymmetricKey::decrypt() */ const MODE_STREAM = 6; + /** * Mode Map * * @see \phpseclib3\Crypt\Common\SymmetricKey::__construct() */ - const MODE_MAP = ['ctr' => self::MODE_CTR, 'ecb' => self::MODE_ECB, 'cbc' => self::MODE_CBC, 'cfb' => self::MODE_CFB, 'cfb8' => self::MODE_CFB8, 'ofb' => self::MODE_OFB, 'ofb8' => self::MODE_OFB8, 'gcm' => self::MODE_GCM, 'stream' => self::MODE_STREAM]; + const MODE_MAP = [ + 'ctr' => self::MODE_CTR, + 'ecb' => self::MODE_ECB, + 'cbc' => self::MODE_CBC, + 'cfb' => self::MODE_CFB, + 'cfb8' => self::MODE_CFB8, + 'ofb' => self::MODE_OFB, + 'ofb8' => self::MODE_OFB8, + 'gcm' => self::MODE_GCM, + 'stream' => self::MODE_STREAM + ]; + /** * Base value for the internal implementation $engine switch * @@ -166,12 +179,21 @@ abstract class SymmetricKey * @see \phpseclib3\Crypt\Common\SymmetricKey::__construct() */ const ENGINE_OPENSSL_GCM = 6; + /** * Engine Reverse Map * * @see \phpseclib3\Crypt\Common\SymmetricKey::getEngine() */ - const ENGINE_MAP = [self::ENGINE_INTERNAL => 'PHP', self::ENGINE_EVAL => 'Eval', self::ENGINE_MCRYPT => 'mcrypt', self::ENGINE_OPENSSL => 'OpenSSL', self::ENGINE_LIBSODIUM => 'libsodium', self::ENGINE_OPENSSL_GCM => 'OpenSSL (GCM)']; + const ENGINE_MAP = [ + self::ENGINE_INTERNAL => 'PHP', + self::ENGINE_EVAL => 'Eval', + self::ENGINE_MCRYPT => 'mcrypt', + self::ENGINE_OPENSSL => 'OpenSSL', + self::ENGINE_LIBSODIUM => 'libsodium', + self::ENGINE_OPENSSL_GCM => 'OpenSSL (GCM)' + ]; + /** * The Encryption Mode * @@ -179,33 +201,38 @@ abstract class SymmetricKey * @var int */ protected $mode; + /** * The Block Length of the block cipher * * @var int */ protected $block_size = 16; + /** * The Key * * @see self::setKey() * @var string */ - protected $key = \false; + protected $key = false; + /** * HMAC Key * * @see self::setupGCM() * @var ?string */ - protected $hKey = \false; + protected $hKey = false; + /** * The Initialization Vector * * @see self::setIV() * @var string */ - protected $iv = \false; + protected $iv = false; + /** * A "sliding" Initialization Vector * @@ -214,6 +241,7 @@ abstract class SymmetricKey * @var string */ protected $encryptIV; + /** * A "sliding" Initialization Vector * @@ -222,13 +250,15 @@ abstract class SymmetricKey * @var string */ protected $decryptIV; + /** * Continuous Buffer status * * @see self::enableContinuousBuffer() * @var bool */ - protected $continuousBuffer = \false; + protected $continuousBuffer = false; + /** * Encryption buffer for CTR, OFB and CFB modes * @@ -237,6 +267,7 @@ abstract class SymmetricKey * @var array */ protected $enbuffer; + /** * Decryption buffer for CTR, OFB and CFB modes * @@ -245,6 +276,7 @@ abstract class SymmetricKey * @var array */ protected $debuffer; + /** * mcrypt resource for encryption * @@ -255,6 +287,7 @@ abstract class SymmetricKey * @var resource */ private $enmcrypt; + /** * mcrypt resource for decryption * @@ -265,6 +298,7 @@ abstract class SymmetricKey * @var resource */ private $demcrypt; + /** * Does the enmcrypt resource need to be (re)initialized? * @@ -272,7 +306,8 @@ abstract class SymmetricKey * @see \phpseclib3\Crypt\Twofish::setIV() * @var bool */ - private $enchanged = \true; + private $enchanged = true; + /** * Does the demcrypt resource need to be (re)initialized? * @@ -280,7 +315,8 @@ abstract class SymmetricKey * @see \phpseclib3\Crypt\Twofish::setIV() * @var bool */ - private $dechanged = \true; + private $dechanged = true; + /** * mcrypt resource for CFB mode * @@ -298,6 +334,7 @@ abstract class SymmetricKey * @var resource */ private $ecb; + /** * Optimizing value while CFB-encrypting * @@ -318,6 +355,7 @@ abstract class SymmetricKey * @var int */ protected $cfb_init_len = 600; + /** * Does internal cipher state need to be (re)initialized? * @@ -326,28 +364,32 @@ abstract class SymmetricKey * @see self::disableContinuousBuffer() * @var bool */ - protected $changed = \true; + protected $changed = true; + /** * Does Eval engie need to be (re)initialized? * * @see self::setup() * @var bool */ - protected $nonIVChanged = \true; + protected $nonIVChanged = true; + /** * Padding status * * @see self::enablePadding() * @var bool */ - private $padding = \true; + private $padding = true; + /** * Is the mode one that is paddable? * * @see self::__construct() * @var bool */ - private $paddable = \false; + private $paddable = false; + /** * Holds which crypt engine internaly should be use, * which will be determined automatically on __construct() @@ -366,6 +408,7 @@ abstract class SymmetricKey * @var int */ protected $engine; + /** * Holds the preferred crypt engine * @@ -374,6 +417,7 @@ abstract class SymmetricKey * @var int */ private $preferredEngine; + /** * The mcrypt specific name of the cipher * @@ -385,6 +429,7 @@ abstract class SymmetricKey * @var string */ protected $cipher_name_mcrypt; + /** * The openssl specific name of the cipher * @@ -394,6 +439,7 @@ abstract class SymmetricKey * @var string */ protected $cipher_name_openssl; + /** * The openssl specific name of the cipher in ECB mode * @@ -404,6 +450,7 @@ abstract class SymmetricKey * @var string */ protected $cipher_name_openssl_ecb; + /** * The default salt used by setPassword() * @@ -411,6 +458,7 @@ abstract class SymmetricKey * @var string */ private $password_default_salt = 'phpseclib/salt'; + /** * The name of the performance-optimized callback function * @@ -423,27 +471,31 @@ abstract class SymmetricKey * @var Callback */ protected $inline_crypt; + /** * If OpenSSL can be used in ECB but not in CTR we can emulate CTR * * @see self::openssl_ctr_process() * @var bool */ - private $openssl_emulate_ctr = \false; + private $openssl_emulate_ctr = false; + /** * Don't truncate / null pad key * * @see self::clearBuffers() * @var bool */ - private $skip_key_adjustment = \false; + private $skip_key_adjustment = false; + /** * Has the key length explicitly been set or should it be derived from the key, itself? * * @see self::setKeyLength() * @var bool */ - protected $explicit_key_length = \false; + protected $explicit_key_length = false; + /** * Hash subkey for GHASH * @@ -452,24 +504,28 @@ abstract class SymmetricKey * @var BinaryField\Integer */ private $h; + /** * Additional authenticated data * * @var string */ protected $aad = ''; + /** * Authentication Tag produced after a round of encryption * * @var string */ - protected $newtag = \false; + protected $newtag = false; + /** * Authentication Tag to be verified during decryption * * @var string */ - protected $oldtag = \false; + protected $oldtag = false; + /** * GCM Binary Field * @@ -478,6 +534,7 @@ abstract class SymmetricKey * @var BinaryField */ private static $gcmField; + /** * Poly1305 Prime Field * @@ -486,6 +543,7 @@ abstract class SymmetricKey * @var PrimeField */ private static $poly1305Field; + /** * Flag for using regular vs "safe" intval * @@ -493,6 +551,7 @@ abstract class SymmetricKey * @var boolean */ protected static $use_reg_intval; + /** * Poly1305 Key * @@ -501,6 +560,7 @@ abstract class SymmetricKey * @var string */ protected $poly1305Key; + /** * Poly1305 Flag * @@ -508,7 +568,8 @@ abstract class SymmetricKey * @see self::enablePoly1305() * @var boolean */ - protected $usePoly1305 = \false; + protected $usePoly1305 = false; + /** * The Original Initialization Vector * @@ -518,7 +579,8 @@ abstract class SymmetricKey * @see self::setIV() * @var string */ - private $origIV = \false; + private $origIV = false; + /** * Nonce * @@ -528,7 +590,8 @@ abstract class SymmetricKey * @see self::setNonce() * @var string */ - protected $nonce = \false; + protected $nonce = false; + /** * Default Constructor. * @@ -555,18 +618,20 @@ abstract class SymmetricKey */ public function __construct($mode) { - $mode = \strtolower($mode); + $mode = strtolower($mode); // necessary because of 5.6 compatibility; we can't do isset(self::MODE_MAP[$mode]) in 5.6 $map = self::MODE_MAP; if (!isset($map[$mode])) { throw new BadModeException('No valid mode has been specified'); } + $mode = self::MODE_MAP[$mode]; + // $mode dependent settings switch ($mode) { case self::MODE_ECB: case self::MODE_CBC: - $this->paddable = \true; + $this->paddable = true; break; case self::MODE_CTR: case self::MODE_CFB: @@ -574,7 +639,7 @@ public function __construct($mode) case self::MODE_OFB: case self::MODE_OFB8: case self::MODE_STREAM: - $this->paddable = \false; + $this->paddable = false; break; case self::MODE_GCM: if ($this->block_size != 16) { @@ -583,50 +648,54 @@ public function __construct($mode) if (!isset(self::$gcmField)) { self::$gcmField = new BinaryField(128, 7, 2, 1, 0); } - $this->paddable = \false; + $this->paddable = false; break; default: throw new BadModeException('No valid mode has been specified'); } + $this->mode = $mode; + static::initialize_static_variables(); } + /** * Initialize static variables */ protected static function initialize_static_variables() { if (!isset(self::$use_reg_intval)) { - switch (\true) { + switch (true) { // PHP_OS & "\xDF\xDF\xDF" == strtoupper(substr(PHP_OS, 0, 3)), but a lot faster - case (\PHP_OS & "\xdf\xdf\xdf") === 'WIN': - case !\function_exists('php_uname'): - case !\is_string(\php_uname('m')): - case (\php_uname('m') & "\xdf\xdf\xdf") != 'ARM': - case \defined('PHP_INT_SIZE') && \PHP_INT_SIZE == 8: - self::$use_reg_intval = \true; + case (PHP_OS & "\xDF\xDF\xDF") === 'WIN': + case !function_exists('php_uname'): + case !is_string(php_uname('m')): + case (php_uname('m') & "\xDF\xDF\xDF") != 'ARM': + case defined('PHP_INT_SIZE') && PHP_INT_SIZE == 8: + self::$use_reg_intval = true; break; - case (\php_uname('m') & "\xdf\xdf\xdf") == 'ARM': - switch (\true) { + case (php_uname('m') & "\xDF\xDF\xDF") == 'ARM': + switch (true) { /* PHP 7.0.0 introduced a bug that affected 32-bit ARM processors: - - https://github.com/php/php-src/commit/716da71446ebbd40fa6cf2cea8a4b70f504cc3cd - - altho the changelogs make no mention of it, this bug was fixed with this commit: - - https://github.com/php/php-src/commit/c1729272b17a1fe893d1a54e423d3b71470f3ee8 - - affected versions of PHP are: 7.0.x, 7.1.0 - 7.1.23 and 7.2.0 - 7.2.11 */ - case \PHP_VERSION_ID >= 70000 && \PHP_VERSION_ID <= 70123: - case \PHP_VERSION_ID >= 70200 && \PHP_VERSION_ID <= 70211: - self::$use_reg_intval = \false; + + https://github.com/php/php-src/commit/716da71446ebbd40fa6cf2cea8a4b70f504cc3cd + + altho the changelogs make no mention of it, this bug was fixed with this commit: + + https://github.com/php/php-src/commit/c1729272b17a1fe893d1a54e423d3b71470f3ee8 + + affected versions of PHP are: 7.0.x, 7.1.0 - 7.1.23 and 7.2.0 - 7.2.11 */ + case PHP_VERSION_ID >= 70000 && PHP_VERSION_ID <= 70123: + case PHP_VERSION_ID >= 70200 && PHP_VERSION_ID <= 70211: + self::$use_reg_intval = false; break; default: - self::$use_reg_intval = \true; + self::$use_reg_intval = true; } } } } + /** * Sets the initialization vector. * @@ -643,18 +712,23 @@ public function setIV($iv) if ($this->mode == self::MODE_ECB) { throw new \BadMethodCallException('This mode does not require an IV.'); } + if ($this->mode == self::MODE_GCM) { throw new \BadMethodCallException('Use setNonce instead'); } + if (!$this->usesIV()) { throw new \BadMethodCallException('This algorithm does not use an IV.'); } - if (\strlen($iv) != $this->block_size) { - throw new \LengthException('Received initialization vector of size ' . \strlen($iv) . ', but size ' . $this->block_size . ' is required'); + + if (strlen($iv) != $this->block_size) { + throw new \LengthException('Received initialization vector of size ' . strlen($iv) . ', but size ' . $this->block_size . ' is required'); } + $this->iv = $this->origIV = $iv; - $this->changed = \true; + $this->changed = true; } + /** * Enables Poly1305 mode. * @@ -667,8 +741,10 @@ public function enablePoly1305() if ($this->mode == self::MODE_GCM) { throw new \BadMethodCallException('Poly1305 cannot be used in GCM mode'); } - $this->usePoly1305 = \true; + + $this->usePoly1305 = true; } + /** * Enables Poly1305 mode. * @@ -684,16 +760,20 @@ public function setPoly1305Key($key = null) if ($this->mode == self::MODE_GCM) { throw new \BadMethodCallException('Poly1305 cannot be used in GCM mode'); } - if (!\is_string($key) || \strlen($key) != 32) { + + if (!is_string($key) || strlen($key) != 32) { throw new \LengthException('The Poly1305 key must be 32 bytes long (256 bits)'); } + if (!isset(self::$poly1305Field)) { // 2^130-5 self::$poly1305Field = new PrimeField(new BigInteger('3fffffffffffffffffffffffffffffffb', 16)); } + $this->poly1305Key = $key; - $this->usePoly1305 = \true; + $this->usePoly1305 = true; } + /** * Sets the nonce. * @@ -707,9 +787,11 @@ public function setNonce($nonce) if ($this->mode != self::MODE_GCM) { throw new \BadMethodCallException('Nonces are only used in GCM mode.'); } + $this->nonce = $nonce; $this->setEngine(); } + /** * Sets additional authenticated data * @@ -723,8 +805,10 @@ public function setAAD($aad) if ($this->mode != self::MODE_GCM && !$this->usePoly1305) { throw new \BadMethodCallException('Additional authenticated data is only utilized in GCM mode or with Poly1305'); } + $this->aad = $aad; } + /** * Returns whether or not the algorithm uses an IV * @@ -734,6 +818,7 @@ public function usesIV() { return $this->mode != self::MODE_GCM && $this->mode != self::MODE_ECB; } + /** * Returns whether or not the algorithm uses a nonce * @@ -743,6 +828,7 @@ public function usesNonce() { return $this->mode == self::MODE_GCM; } + /** * Returns the current key length in bits * @@ -752,6 +838,7 @@ public function getKeyLength() { return $this->key_length << 3; } + /** * Returns the current block length in bits * @@ -761,6 +848,7 @@ public function getBlockLength() { return $this->block_size << 3; } + /** * Returns the current block length in bytes * @@ -770,6 +858,7 @@ public function getBlockLengthInBytes() { return $this->block_size; } + /** * Sets the key length. * @@ -780,11 +869,13 @@ public function getBlockLengthInBytes() public function setKeyLength($length) { $this->explicit_key_length = $length >> 3; - if (\is_string($this->key) && \strlen($this->key) != $this->explicit_key_length) { - $this->key = \false; + + if (is_string($this->key) && strlen($this->key) != $this->explicit_key_length) { + $this->key = false; throw new InconsistentSetupException('Key has already been set and is not ' . $this->explicit_key_length . ' bytes long'); } } + /** * Sets the key. * @@ -801,13 +892,15 @@ public function setKeyLength($length) */ public function setKey($key) { - if ($this->explicit_key_length !== \false && \strlen($key) != $this->explicit_key_length) { - throw new InconsistentSetupException('Key length has already been set to ' . $this->explicit_key_length . ' bytes and this key is ' . \strlen($key) . ' bytes'); + if ($this->explicit_key_length !== false && strlen($key) != $this->explicit_key_length) { + throw new InconsistentSetupException('Key length has already been set to ' . $this->explicit_key_length . ' bytes and this key is ' . strlen($key) . ' bytes'); } + $this->key = $key; - $this->key_length = \strlen($key); + $this->key_length = strlen($key); $this->setEngine(); } + /** * Sets the password. * @@ -834,32 +927,40 @@ public function setKey($key) public function setPassword($password, $method = 'pbkdf2', ...$func_args) { $key = ''; - $method = \strtolower($method); + + $method = strtolower($method); switch ($method) { case 'bcrypt': if (!isset($func_args[2])) { throw new \RuntimeException('A salt must be provided for bcrypt to work'); } + $salt = $func_args[0]; + $rounds = isset($func_args[1]) ? $func_args[1] : 16; $keylen = isset($func_args[2]) ? $func_args[2] : $this->key_length; + $key = Blowfish::bcrypt_pbkdf($password, $salt, $keylen + $this->block_size, $rounds); - $this->setKey(\substr($key, 0, $keylen)); - $this->setIV(\substr($key, $keylen)); - return \true; - case 'pkcs12': - // from https://tools.ietf.org/html/rfc7292#appendix-B.2 + + $this->setKey(substr($key, 0, $keylen)); + $this->setIV(substr($key, $keylen)); + + return true; + case 'pkcs12': // from https://tools.ietf.org/html/rfc7292#appendix-B.2 case 'pbkdf1': case 'pbkdf2': // Hash function - $hash = isset($func_args[0]) ? \strtolower($func_args[0]) : 'sha1'; + $hash = isset($func_args[0]) ? strtolower($func_args[0]) : 'sha1'; $hashObj = new Hash(); $hashObj->setHash($hash); + // WPA and WPA2 use the SSID as the salt $salt = isset($func_args[1]) ? $func_args[1] : $this->password_default_salt; + // RFC2898#section-4.2 uses 1,000 iterations by default // WPA and WPA2 use 4,096. $count = isset($func_args[2]) ? $func_args[2] : 1000; + // Keylength if (isset($func_args[3])) { if ($func_args[3] <= 0) { @@ -867,60 +968,66 @@ public function setPassword($password, $method = 'pbkdf2', ...$func_args) } $dkLen = $func_args[3]; } else { - $key_length = $this->explicit_key_length !== \false ? $this->explicit_key_length : $this->key_length; + $key_length = $this->explicit_key_length !== false ? $this->explicit_key_length : $this->key_length; $dkLen = $method == 'pbkdf1' ? 2 * $key_length : $key_length; } - switch (\true) { + + switch (true) { case $method == 'pkcs12': /* - In this specification, however, all passwords are created from - BMPStrings with a NULL terminator. This means that each character in - the original BMPString is encoded in 2 bytes in big-endian format - (most-significant byte first). There are no Unicode byte order - marks. The 2 bytes produced from the last character in the BMPString - are followed by 2 additional bytes with the value 0x00. - - -- https://tools.ietf.org/html/rfc7292#appendix-B.1 - */ - $password = "\x00" . \chunk_split($password, 1, "\x00") . "\x00"; + In this specification, however, all passwords are created from + BMPStrings with a NULL terminator. This means that each character in + the original BMPString is encoded in 2 bytes in big-endian format + (most-significant byte first). There are no Unicode byte order + marks. The 2 bytes produced from the last character in the BMPString + are followed by 2 additional bytes with the value 0x00. + + -- https://tools.ietf.org/html/rfc7292#appendix-B.1 + */ + $password = "\0" . chunk_split($password, 1, "\0") . "\0"; + /* - This standard specifies 3 different values for the ID byte mentioned - above: - - 1. If ID=1, then the pseudorandom bits being produced are to be used - as key material for performing encryption or decryption. - - 2. If ID=2, then the pseudorandom bits being produced are to be used - as an IV (Initial Value) for encryption or decryption. - - 3. If ID=3, then the pseudorandom bits being produced are to be used - as an integrity key for MACing. - */ + This standard specifies 3 different values for the ID byte mentioned + above: + + 1. If ID=1, then the pseudorandom bits being produced are to be used + as key material for performing encryption or decryption. + + 2. If ID=2, then the pseudorandom bits being produced are to be used + as an IV (Initial Value) for encryption or decryption. + + 3. If ID=3, then the pseudorandom bits being produced are to be used + as an integrity key for MACing. + */ // Construct a string, D (the "diversifier"), by concatenating v/8 // copies of ID. $blockLength = $hashObj->getBlockLengthInBytes(); - $d1 = \str_repeat(\chr(1), $blockLength); - $d2 = \str_repeat(\chr(2), $blockLength); + $d1 = str_repeat(chr(1), $blockLength); + $d2 = str_repeat(chr(2), $blockLength); $s = ''; - if (\strlen($salt)) { - while (\strlen($s) < $blockLength) { + if (strlen($salt)) { + while (strlen($s) < $blockLength) { $s .= $salt; } } - $s = \substr($s, 0, $blockLength); + $s = substr($s, 0, $blockLength); + $p = ''; - if (\strlen($password)) { - while (\strlen($p) < $blockLength) { + if (strlen($password)) { + while (strlen($p) < $blockLength) { $p .= $password; } } - $p = \substr($p, 0, $blockLength); + $p = substr($p, 0, $blockLength); + $i = $s . $p; + $this->setKey(self::pkcs12helper($dkLen, $hashObj, $i, $d1, $count)); if ($this->usesIV()) { $this->setIV(self::pkcs12helper($this->block_size, $hashObj, $i, $d2, $count)); } - return \true; + + return true; case $method == 'pbkdf1': if ($dkLen > $hashObj->getLengthInBytes()) { throw new \LengthException('Derived key length cannot be longer than the hash length'); @@ -929,35 +1036,40 @@ public function setPassword($password, $method = 'pbkdf2', ...$func_args) for ($i = 0; $i < $count; ++$i) { $t = $hashObj->hash($t); } - $key = \substr($t, 0, $dkLen); - $this->setKey(\substr($key, 0, $dkLen >> 1)); + $key = substr($t, 0, $dkLen); + + $this->setKey(substr($key, 0, $dkLen >> 1)); if ($this->usesIV()) { - $this->setIV(\substr($key, $dkLen >> 1)); + $this->setIV(substr($key, $dkLen >> 1)); } - return \true; - case !\in_array($hash, \hash_algos()): + + return true; + case !in_array($hash, hash_algos()): $i = 1; $hashObj->setKey($password); - while (\strlen($key) < $dkLen) { - $f = $u = $hashObj->hash($salt . \pack('N', $i++)); + while (strlen($key) < $dkLen) { + $f = $u = $hashObj->hash($salt . pack('N', $i++)); for ($j = 2; $j <= $count; ++$j) { $u = $hashObj->hash($u); $f ^= $u; } $key .= $f; } - $key = \substr($key, 0, $dkLen); + $key = substr($key, 0, $dkLen); break; default: - $key = \hash_pbkdf2($hash, $password, $salt, $count, $dkLen, \true); + $key = hash_pbkdf2($hash, $password, $salt, $count, $dkLen, true); } break; default: throw new UnsupportedAlgorithmException($method . ' is not a supported password hashing method'); } + $this->setKey($key); - return \true; + + return true; } + /** * PKCS#12 KDF Helper Function * @@ -979,8 +1091,10 @@ private static function pkcs12helper($n, $hashObj, $i, $d, $count) if (!isset($one)) { $one = new BigInteger(1); } + $blockLength = $hashObj->getBlockLength() >> 3; - $c = \ceil($n / $hashObj->getLengthInBytes()); + + $c = ceil($n / $hashObj->getLengthInBytes()); $a = ''; for ($j = 1; $j <= $c; $j++) { $ai = $d . $i; @@ -988,25 +1102,27 @@ private static function pkcs12helper($n, $hashObj, $i, $d, $count) $ai = $hashObj->hash($ai); } $b = ''; - while (\strlen($b) < $blockLength) { + while (strlen($b) < $blockLength) { $b .= $ai; } - $b = \substr($b, 0, $blockLength); + $b = substr($b, 0, $blockLength); $b = new BigInteger($b, 256); $newi = ''; - for ($k = 0; $k < \strlen($i); $k += $blockLength) { - $temp = \substr($i, $k, $blockLength); + for ($k = 0; $k < strlen($i); $k += $blockLength) { + $temp = substr($i, $k, $blockLength); $temp = new BigInteger($temp, 256); $temp->setPrecision($blockLength << 3); $temp = $temp->add($b); $temp = $temp->add($one); - $newi .= $temp->toBytes(\false); + $newi .= $temp->toBytes(false); } $i = $newi; $a .= $ai; } - return \substr($a, 0, $n); + + return substr($a, 0, $n); } + /** * Encrypts a message. * @@ -1032,7 +1148,9 @@ public function encrypt($plaintext) if ($this->paddable) { $plaintext = $this->pad($plaintext); } + $this->setup(); + if ($this->mode == self::MODE_GCM) { $oldIV = $this->iv; Strings::increment_str($this->iv); @@ -1040,29 +1158,37 @@ public function encrypt($plaintext) $cipher->setKey($this->key); $cipher->setIV($this->iv); $ciphertext = $cipher->encrypt($plaintext); - $s = $this->ghash(self::nullPad128($this->aad) . self::nullPad128($ciphertext) . self::len64($this->aad) . self::len64($ciphertext)); + + $s = $this->ghash( + self::nullPad128($this->aad) . + self::nullPad128($ciphertext) . + self::len64($this->aad) . + self::len64($ciphertext) + ); $cipher->encryptIV = $this->iv = $this->encryptIV = $this->decryptIV = $oldIV; $this->newtag = $cipher->encrypt($s); return $ciphertext; } + if (isset($this->poly1305Key)) { $cipher = clone $this; unset($cipher->poly1305Key); - $this->usePoly1305 = \false; + $this->usePoly1305 = false; $ciphertext = $cipher->encrypt($plaintext); $this->newtag = $this->poly1305($ciphertext); return $ciphertext; } + if ($this->engine === self::ENGINE_OPENSSL) { switch ($this->mode) { case self::MODE_STREAM: - return \openssl_encrypt($plaintext, $this->cipher_name_openssl, $this->key, \OPENSSL_RAW_DATA | \OPENSSL_ZERO_PADDING); + return openssl_encrypt($plaintext, $this->cipher_name_openssl, $this->key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING); case self::MODE_ECB: - return \openssl_encrypt($plaintext, $this->cipher_name_openssl, $this->key, \OPENSSL_RAW_DATA | \OPENSSL_ZERO_PADDING); + return openssl_encrypt($plaintext, $this->cipher_name_openssl, $this->key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING); case self::MODE_CBC: - $result = \openssl_encrypt($plaintext, $this->cipher_name_openssl, $this->key, \OPENSSL_RAW_DATA | \OPENSSL_ZERO_PADDING, $this->encryptIV); + $result = openssl_encrypt($plaintext, $this->cipher_name_openssl, $this->key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $this->encryptIV); if ($this->continuousBuffer) { - $this->encryptIV = \substr($result, -$this->block_size); + $this->encryptIV = substr($result, -$this->block_size); } return $result; case self::MODE_CTR: @@ -1072,13 +1198,13 @@ public function encrypt($plaintext) // {@link http://cvs.openssl.org/fileview?f=openssl/crypto/modes/cfb128.c&v=1.3.2.2.2.1} $ciphertext = ''; if ($this->continuousBuffer) { - $iv =& $this->encryptIV; - $pos =& $this->enbuffer['pos']; + $iv = &$this->encryptIV; + $pos = &$this->enbuffer['pos']; } else { $iv = $this->encryptIV; $pos = 0; } - $len = \strlen($plaintext); + $len = strlen($plaintext); $i = 0; if ($pos) { $orig_pos = $pos; @@ -1093,43 +1219,49 @@ public function encrypt($plaintext) $len = 0; } // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $blocksize - $ciphertext = \substr($iv, $orig_pos) ^ $plaintext; - $iv = \substr_replace($iv, $ciphertext, $orig_pos, $i); - $plaintext = \substr($plaintext, $i); + $ciphertext = substr($iv, $orig_pos) ^ $plaintext; + $iv = substr_replace($iv, $ciphertext, $orig_pos, $i); + $plaintext = substr($plaintext, $i); } + $overflow = $len % $this->block_size; + if ($overflow) { - $ciphertext .= \openssl_encrypt(\substr($plaintext, 0, -$overflow) . \str_repeat("\x00", $this->block_size), $this->cipher_name_openssl, $this->key, \OPENSSL_RAW_DATA | \OPENSSL_ZERO_PADDING, $iv); + $ciphertext .= openssl_encrypt(substr($plaintext, 0, -$overflow) . str_repeat("\0", $this->block_size), $this->cipher_name_openssl, $this->key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv); $iv = Strings::pop($ciphertext, $this->block_size); + $size = $len - $overflow; - $block = $iv ^ \substr($plaintext, -$overflow); - $iv = \substr_replace($iv, $block, 0, $overflow); + $block = $iv ^ substr($plaintext, -$overflow); + $iv = substr_replace($iv, $block, 0, $overflow); $ciphertext .= $block; $pos = $overflow; } elseif ($len) { - $ciphertext = \openssl_encrypt($plaintext, $this->cipher_name_openssl, $this->key, \OPENSSL_RAW_DATA | \OPENSSL_ZERO_PADDING, $iv); - $iv = \substr($ciphertext, -$this->block_size); + $ciphertext = openssl_encrypt($plaintext, $this->cipher_name_openssl, $this->key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv); + $iv = substr($ciphertext, -$this->block_size); } + return $ciphertext; case self::MODE_CFB8: - $ciphertext = \openssl_encrypt($plaintext, $this->cipher_name_openssl, $this->key, \OPENSSL_RAW_DATA | \OPENSSL_ZERO_PADDING, $this->encryptIV); + $ciphertext = openssl_encrypt($plaintext, $this->cipher_name_openssl, $this->key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $this->encryptIV); if ($this->continuousBuffer) { - if (($len = \strlen($ciphertext)) >= $this->block_size) { - $this->encryptIV = \substr($ciphertext, -$this->block_size); + if (($len = strlen($ciphertext)) >= $this->block_size) { + $this->encryptIV = substr($ciphertext, -$this->block_size); } else { - $this->encryptIV = \substr($this->encryptIV, $len - $this->block_size) . \substr($ciphertext, -$len); + $this->encryptIV = substr($this->encryptIV, $len - $this->block_size) . substr($ciphertext, -$len); } } return $ciphertext; case self::MODE_OFB8: $ciphertext = ''; - $len = \strlen($plaintext); + $len = strlen($plaintext); $iv = $this->encryptIV; + for ($i = 0; $i < $len; ++$i) { - $xor = \openssl_encrypt($iv, $this->cipher_name_openssl_ecb, $this->key, $this->openssl_options, $this->decryptIV); + $xor = openssl_encrypt($iv, $this->cipher_name_openssl_ecb, $this->key, $this->openssl_options, $this->decryptIV); $ciphertext .= $plaintext[$i] ^ $xor; - $iv = \substr($iv, 1) . $xor[0]; + $iv = substr($iv, 1) . $xor[0]; } + if ($this->continuousBuffer) { $this->encryptIV = $iv; } @@ -1138,21 +1270,23 @@ public function encrypt($plaintext) return $this->openssl_ofb_process($plaintext, $this->encryptIV, $this->enbuffer); } } + if ($this->engine === self::ENGINE_MCRYPT) { - \set_error_handler(function () { + set_error_handler(function () { }); if ($this->enchanged) { - \mcrypt_generic_init($this->enmcrypt, $this->key, $this->getIV($this->encryptIV)); - $this->enchanged = \false; + mcrypt_generic_init($this->enmcrypt, $this->key, $this->getIV($this->encryptIV)); + $this->enchanged = false; } + // re: {@link http://phpseclib.sourceforge.net/cfb-demo.phps} // using mcrypt's default handing of CFB the above would output two different things. using phpseclib's // rewritten CFB implementation the above outputs the same thing twice. if ($this->mode == self::MODE_CFB && $this->continuousBuffer) { $block_size = $this->block_size; - $iv =& $this->encryptIV; - $pos =& $this->enbuffer['pos']; - $len = \strlen($plaintext); + $iv = &$this->encryptIV; + $pos = &$this->enbuffer['pos']; + $len = strlen($plaintext); $ciphertext = ''; $i = 0; if ($pos) { @@ -1167,62 +1301,71 @@ public function encrypt($plaintext) $pos += $len; $len = 0; } - $ciphertext = \substr($iv, $orig_pos) ^ $plaintext; - $iv = \substr_replace($iv, $ciphertext, $orig_pos, $i); - $this->enbuffer['enmcrypt_init'] = \true; + $ciphertext = substr($iv, $orig_pos) ^ $plaintext; + $iv = substr_replace($iv, $ciphertext, $orig_pos, $i); + $this->enbuffer['enmcrypt_init'] = true; } if ($len >= $block_size) { - if ($this->enbuffer['enmcrypt_init'] === \false || $len > $this->cfb_init_len) { - if ($this->enbuffer['enmcrypt_init'] === \true) { - \mcrypt_generic_init($this->enmcrypt, $this->key, $iv); - $this->enbuffer['enmcrypt_init'] = \false; + if ($this->enbuffer['enmcrypt_init'] === false || $len > $this->cfb_init_len) { + if ($this->enbuffer['enmcrypt_init'] === true) { + mcrypt_generic_init($this->enmcrypt, $this->key, $iv); + $this->enbuffer['enmcrypt_init'] = false; } - $ciphertext .= \mcrypt_generic($this->enmcrypt, \substr($plaintext, $i, $len - $len % $block_size)); - $iv = \substr($ciphertext, -$block_size); + $ciphertext .= mcrypt_generic($this->enmcrypt, substr($plaintext, $i, $len - $len % $block_size)); + $iv = substr($ciphertext, -$block_size); $len %= $block_size; } else { while ($len >= $block_size) { - $iv = \mcrypt_generic($this->ecb, $iv) ^ \substr($plaintext, $i, $block_size); + $iv = mcrypt_generic($this->ecb, $iv) ^ substr($plaintext, $i, $block_size); $ciphertext .= $iv; $len -= $block_size; $i += $block_size; } } } + if ($len) { - $iv = \mcrypt_generic($this->ecb, $iv); - $block = $iv ^ \substr($plaintext, -$len); - $iv = \substr_replace($iv, $block, 0, $len); + $iv = mcrypt_generic($this->ecb, $iv); + $block = $iv ^ substr($plaintext, -$len); + $iv = substr_replace($iv, $block, 0, $len); $ciphertext .= $block; $pos = $len; } - \restore_error_handler(); + + restore_error_handler(); + return $ciphertext; } - $ciphertext = \mcrypt_generic($this->enmcrypt, $plaintext); + + $ciphertext = mcrypt_generic($this->enmcrypt, $plaintext); + if (!$this->continuousBuffer) { - \mcrypt_generic_init($this->enmcrypt, $this->key, $this->getIV($this->encryptIV)); + mcrypt_generic_init($this->enmcrypt, $this->key, $this->getIV($this->encryptIV)); } - \restore_error_handler(); + + restore_error_handler(); + return $ciphertext; } + if ($this->engine === self::ENGINE_EVAL) { $inline = $this->inline_crypt; return $inline('encrypt', $plaintext); } - $buffer =& $this->enbuffer; + + $buffer = &$this->enbuffer; $block_size = $this->block_size; $ciphertext = ''; switch ($this->mode) { case self::MODE_ECB: - for ($i = 0; $i < \strlen($plaintext); $i += $block_size) { - $ciphertext .= $this->encryptBlock(\substr($plaintext, $i, $block_size)); + for ($i = 0; $i < strlen($plaintext); $i += $block_size) { + $ciphertext .= $this->encryptBlock(substr($plaintext, $i, $block_size)); } break; case self::MODE_CBC: $xor = $this->encryptIV; - for ($i = 0; $i < \strlen($plaintext); $i += $block_size) { - $block = \substr($plaintext, $i, $block_size); + for ($i = 0; $i < strlen($plaintext); $i += $block_size) { + $block = substr($plaintext, $i, $block_size); $block = $this->encryptBlock($block ^ $xor); $xor = $block; $ciphertext .= $block; @@ -1233,10 +1376,10 @@ public function encrypt($plaintext) break; case self::MODE_CTR: $xor = $this->encryptIV; - if (\strlen($buffer['ciphertext'])) { - for ($i = 0; $i < \strlen($plaintext); $i += $block_size) { - $block = \substr($plaintext, $i, $block_size); - if (\strlen($block) > \strlen($buffer['ciphertext'])) { + if (strlen($buffer['ciphertext'])) { + for ($i = 0; $i < strlen($plaintext); $i += $block_size) { + $block = substr($plaintext, $i, $block_size); + if (strlen($block) > strlen($buffer['ciphertext'])) { $buffer['ciphertext'] .= $this->encryptBlock($xor); Strings::increment_str($xor); } @@ -1244,8 +1387,8 @@ public function encrypt($plaintext) $ciphertext .= $block ^ $key; } } else { - for ($i = 0; $i < \strlen($plaintext); $i += $block_size) { - $block = \substr($plaintext, $i, $block_size); + for ($i = 0; $i < strlen($plaintext); $i += $block_size) { + $block = substr($plaintext, $i, $block_size); $key = $this->encryptBlock($xor); Strings::increment_str($xor); $ciphertext .= $block ^ $key; @@ -1253,8 +1396,8 @@ public function encrypt($plaintext) } if ($this->continuousBuffer) { $this->encryptIV = $xor; - if ($start = \strlen($plaintext) % $block_size) { - $buffer['ciphertext'] = \substr($key, $start) . $buffer['ciphertext']; + if ($start = strlen($plaintext) % $block_size) { + $buffer['ciphertext'] = substr($key, $start) . $buffer['ciphertext']; } } break; @@ -1262,13 +1405,13 @@ public function encrypt($plaintext) // cfb loosely routines inspired by openssl's: // {@link http://cvs.openssl.org/fileview?f=openssl/crypto/modes/cfb128.c&v=1.3.2.2.2.1} if ($this->continuousBuffer) { - $iv =& $this->encryptIV; - $pos =& $buffer['pos']; + $iv = &$this->encryptIV; + $pos = &$buffer['pos']; } else { $iv = $this->encryptIV; $pos = 0; } - $len = \strlen($plaintext); + $len = strlen($plaintext); $i = 0; if ($pos) { $orig_pos = $pos; @@ -1283,58 +1426,62 @@ public function encrypt($plaintext) $len = 0; } // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $blocksize - $ciphertext = \substr($iv, $orig_pos) ^ $plaintext; - $iv = \substr_replace($iv, $ciphertext, $orig_pos, $i); + $ciphertext = substr($iv, $orig_pos) ^ $plaintext; + $iv = substr_replace($iv, $ciphertext, $orig_pos, $i); } while ($len >= $block_size) { - $iv = $this->encryptBlock($iv) ^ \substr($plaintext, $i, $block_size); + $iv = $this->encryptBlock($iv) ^ substr($plaintext, $i, $block_size); $ciphertext .= $iv; $len -= $block_size; $i += $block_size; } if ($len) { $iv = $this->encryptBlock($iv); - $block = $iv ^ \substr($plaintext, $i); - $iv = \substr_replace($iv, $block, 0, $len); + $block = $iv ^ substr($plaintext, $i); + $iv = substr_replace($iv, $block, 0, $len); $ciphertext .= $block; $pos = $len; } break; case self::MODE_CFB8: $ciphertext = ''; - $len = \strlen($plaintext); + $len = strlen($plaintext); $iv = $this->encryptIV; + for ($i = 0; $i < $len; ++$i) { - $ciphertext .= $c = $plaintext[$i] ^ $this->encryptBlock($iv); - $iv = \substr($iv, 1) . $c; + $ciphertext .= ($c = $plaintext[$i] ^ $this->encryptBlock($iv)); + $iv = substr($iv, 1) . $c; } + if ($this->continuousBuffer) { if ($len >= $block_size) { - $this->encryptIV = \substr($ciphertext, -$block_size); + $this->encryptIV = substr($ciphertext, -$block_size); } else { - $this->encryptIV = \substr($this->encryptIV, $len - $block_size) . \substr($ciphertext, -$len); + $this->encryptIV = substr($this->encryptIV, $len - $block_size) . substr($ciphertext, -$len); } } break; case self::MODE_OFB8: $ciphertext = ''; - $len = \strlen($plaintext); + $len = strlen($plaintext); $iv = $this->encryptIV; + for ($i = 0; $i < $len; ++$i) { $xor = $this->encryptBlock($iv); $ciphertext .= $plaintext[$i] ^ $xor; - $iv = \substr($iv, 1) . $xor[0]; + $iv = substr($iv, 1) . $xor[0]; } + if ($this->continuousBuffer) { $this->encryptIV = $iv; } break; case self::MODE_OFB: $xor = $this->encryptIV; - if (\strlen($buffer['xor'])) { - for ($i = 0; $i < \strlen($plaintext); $i += $block_size) { - $block = \substr($plaintext, $i, $block_size); - if (\strlen($block) > \strlen($buffer['xor'])) { + if (strlen($buffer['xor'])) { + for ($i = 0; $i < strlen($plaintext); $i += $block_size) { + $block = substr($plaintext, $i, $block_size); + if (strlen($block) > strlen($buffer['xor'])) { $xor = $this->encryptBlock($xor); $buffer['xor'] .= $xor; } @@ -1342,16 +1489,16 @@ public function encrypt($plaintext) $ciphertext .= $block ^ $key; } } else { - for ($i = 0; $i < \strlen($plaintext); $i += $block_size) { + for ($i = 0; $i < strlen($plaintext); $i += $block_size) { $xor = $this->encryptBlock($xor); - $ciphertext .= \substr($plaintext, $i, $block_size) ^ $xor; + $ciphertext .= substr($plaintext, $i, $block_size) ^ $xor; } $key = $xor; } if ($this->continuousBuffer) { $this->encryptIV = $xor; - if ($start = \strlen($plaintext) % $block_size) { - $buffer['xor'] = \substr($key, $start) . $buffer['xor']; + if ($start = strlen($plaintext) % $block_size) { + $buffer['xor'] = substr($key, $start) . $buffer['xor']; } } break; @@ -1359,8 +1506,10 @@ public function encrypt($plaintext) $ciphertext = $this->encryptBlock($plaintext); break; } + return $ciphertext; } + /** * Decrypts a message. * @@ -1376,14 +1525,16 @@ public function encrypt($plaintext) */ public function decrypt($ciphertext) { - if ($this->paddable && \strlen($ciphertext) % $this->block_size) { - throw new \LengthException('The ciphertext length (' . \strlen($ciphertext) . ') needs to be a multiple of the block size (' . $this->block_size . ')'); + if ($this->paddable && strlen($ciphertext) % $this->block_size) { + throw new \LengthException('The ciphertext length (' . strlen($ciphertext) . ') needs to be a multiple of the block size (' . $this->block_size . ')'); } $this->setup(); + if ($this->mode == self::MODE_GCM || isset($this->poly1305Key)) { - if ($this->oldtag === \false) { + if ($this->oldtag === false) { throw new InsufficientSetupException('Authentication Tag has not been set'); } + if (isset($this->poly1305Key)) { $newtag = $this->poly1305($ciphertext); } else { @@ -1393,34 +1544,41 @@ public function decrypt($ciphertext) $cipher->setKey($this->key); $cipher->setIV($this->iv); $plaintext = $cipher->decrypt($ciphertext); - $s = $this->ghash(self::nullPad128($this->aad) . self::nullPad128($ciphertext) . self::len64($this->aad) . self::len64($ciphertext)); + + $s = $this->ghash( + self::nullPad128($this->aad) . + self::nullPad128($ciphertext) . + self::len64($this->aad) . + self::len64($ciphertext) + ); $cipher->encryptIV = $this->iv = $this->encryptIV = $this->decryptIV = $oldIV; $newtag = $cipher->encrypt($s); } - if ($this->oldtag != \substr($newtag, 0, \strlen($newtag))) { + if ($this->oldtag != substr($newtag, 0, strlen($newtag))) { $cipher = clone $this; unset($cipher->poly1305Key); - $this->usePoly1305 = \false; + $this->usePoly1305 = false; $plaintext = $cipher->decrypt($ciphertext); - $this->oldtag = \false; + $this->oldtag = false; throw new BadDecryptionException('Derived authentication tag and supplied authentication tag do not match'); } - $this->oldtag = \false; + $this->oldtag = false; return $plaintext; } + if ($this->engine === self::ENGINE_OPENSSL) { switch ($this->mode) { case self::MODE_STREAM: - $plaintext = \openssl_decrypt($ciphertext, $this->cipher_name_openssl, $this->key, \OPENSSL_RAW_DATA | \OPENSSL_ZERO_PADDING); + $plaintext = openssl_decrypt($ciphertext, $this->cipher_name_openssl, $this->key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING); break; case self::MODE_ECB: - $plaintext = \openssl_decrypt($ciphertext, $this->cipher_name_openssl, $this->key, \OPENSSL_RAW_DATA | \OPENSSL_ZERO_PADDING); + $plaintext = openssl_decrypt($ciphertext, $this->cipher_name_openssl, $this->key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING); break; case self::MODE_CBC: $offset = $this->block_size; - $plaintext = \openssl_decrypt($ciphertext, $this->cipher_name_openssl, $this->key, \OPENSSL_RAW_DATA | \OPENSSL_ZERO_PADDING, $this->decryptIV); + $plaintext = openssl_decrypt($ciphertext, $this->cipher_name_openssl, $this->key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $this->decryptIV); if ($this->continuousBuffer) { - $this->decryptIV = \substr($ciphertext, -$offset, $this->block_size); + $this->decryptIV = substr($ciphertext, -$offset, $this->block_size); } break; case self::MODE_CTR: @@ -1431,13 +1589,13 @@ public function decrypt($ciphertext) // {@link http://cvs.openssl.org/fileview?f=openssl/crypto/modes/cfb128.c&v=1.3.2.2.2.1} $plaintext = ''; if ($this->continuousBuffer) { - $iv =& $this->decryptIV; - $pos =& $this->debuffer['pos']; + $iv = &$this->decryptIV; + $pos = &$this->debuffer['pos']; } else { $iv = $this->decryptIV; $pos = 0; } - $len = \strlen($ciphertext); + $len = strlen($ciphertext); $i = 0; if ($pos) { $orig_pos = $pos; @@ -1452,44 +1610,46 @@ public function decrypt($ciphertext) $len = 0; } // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $this->blocksize - $plaintext = \substr($iv, $orig_pos) ^ $ciphertext; - $iv = \substr_replace($iv, \substr($ciphertext, 0, $i), $orig_pos, $i); - $ciphertext = \substr($ciphertext, $i); + $plaintext = substr($iv, $orig_pos) ^ $ciphertext; + $iv = substr_replace($iv, substr($ciphertext, 0, $i), $orig_pos, $i); + $ciphertext = substr($ciphertext, $i); } $overflow = $len % $this->block_size; if ($overflow) { - $plaintext .= \openssl_decrypt(\substr($ciphertext, 0, -$overflow), $this->cipher_name_openssl, $this->key, \OPENSSL_RAW_DATA | \OPENSSL_ZERO_PADDING, $iv); + $plaintext .= openssl_decrypt(substr($ciphertext, 0, -$overflow), $this->cipher_name_openssl, $this->key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv); if ($len - $overflow) { - $iv = \substr($ciphertext, -$overflow - $this->block_size, -$overflow); + $iv = substr($ciphertext, -$overflow - $this->block_size, -$overflow); } - $iv = \openssl_encrypt(\str_repeat("\x00", $this->block_size), $this->cipher_name_openssl, $this->key, \OPENSSL_RAW_DATA | \OPENSSL_ZERO_PADDING, $iv); - $plaintext .= $iv ^ \substr($ciphertext, -$overflow); - $iv = \substr_replace($iv, \substr($ciphertext, -$overflow), 0, $overflow); + $iv = openssl_encrypt(str_repeat("\0", $this->block_size), $this->cipher_name_openssl, $this->key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv); + $plaintext .= $iv ^ substr($ciphertext, -$overflow); + $iv = substr_replace($iv, substr($ciphertext, -$overflow), 0, $overflow); $pos = $overflow; } elseif ($len) { - $plaintext .= \openssl_decrypt($ciphertext, $this->cipher_name_openssl, $this->key, \OPENSSL_RAW_DATA | \OPENSSL_ZERO_PADDING, $iv); - $iv = \substr($ciphertext, -$this->block_size); + $plaintext .= openssl_decrypt($ciphertext, $this->cipher_name_openssl, $this->key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv); + $iv = substr($ciphertext, -$this->block_size); } break; case self::MODE_CFB8: - $plaintext = \openssl_decrypt($ciphertext, $this->cipher_name_openssl, $this->key, \OPENSSL_RAW_DATA | \OPENSSL_ZERO_PADDING, $this->decryptIV); + $plaintext = openssl_decrypt($ciphertext, $this->cipher_name_openssl, $this->key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $this->decryptIV); if ($this->continuousBuffer) { - if (($len = \strlen($ciphertext)) >= $this->block_size) { - $this->decryptIV = \substr($ciphertext, -$this->block_size); + if (($len = strlen($ciphertext)) >= $this->block_size) { + $this->decryptIV = substr($ciphertext, -$this->block_size); } else { - $this->decryptIV = \substr($this->decryptIV, $len - $this->block_size) . \substr($ciphertext, -$len); + $this->decryptIV = substr($this->decryptIV, $len - $this->block_size) . substr($ciphertext, -$len); } } break; case self::MODE_OFB8: $plaintext = ''; - $len = \strlen($ciphertext); + $len = strlen($ciphertext); $iv = $this->decryptIV; + for ($i = 0; $i < $len; ++$i) { - $xor = \openssl_encrypt($iv, $this->cipher_name_openssl_ecb, $this->key, $this->openssl_options, $this->decryptIV); + $xor = openssl_encrypt($iv, $this->cipher_name_openssl_ecb, $this->key, $this->openssl_options, $this->decryptIV); $plaintext .= $ciphertext[$i] ^ $xor; - $iv = \substr($iv, 1) . $xor[0]; + $iv = substr($iv, 1) . $xor[0]; } + if ($this->continuousBuffer) { $this->decryptIV = $iv; } @@ -1497,20 +1657,23 @@ public function decrypt($ciphertext) case self::MODE_OFB: $plaintext = $this->openssl_ofb_process($ciphertext, $this->decryptIV, $this->debuffer); } + return $this->paddable ? $this->unpad($plaintext) : $plaintext; } + if ($this->engine === self::ENGINE_MCRYPT) { - \set_error_handler(function () { + set_error_handler(function () { }); $block_size = $this->block_size; if ($this->dechanged) { - \mcrypt_generic_init($this->demcrypt, $this->key, $this->getIV($this->decryptIV)); - $this->dechanged = \false; + mcrypt_generic_init($this->demcrypt, $this->key, $this->getIV($this->decryptIV)); + $this->dechanged = false; } + if ($this->mode == self::MODE_CFB && $this->continuousBuffer) { - $iv =& $this->decryptIV; - $pos =& $this->debuffer['pos']; - $len = \strlen($ciphertext); + $iv = &$this->decryptIV; + $pos = &$this->debuffer['pos']; + $len = strlen($ciphertext); $plaintext = ''; $i = 0; if ($pos) { @@ -1526,48 +1689,57 @@ public function decrypt($ciphertext) $len = 0; } // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $blocksize - $plaintext = \substr($iv, $orig_pos) ^ $ciphertext; - $iv = \substr_replace($iv, \substr($ciphertext, 0, $i), $orig_pos, $i); + $plaintext = substr($iv, $orig_pos) ^ $ciphertext; + $iv = substr_replace($iv, substr($ciphertext, 0, $i), $orig_pos, $i); } if ($len >= $block_size) { - $cb = \substr($ciphertext, $i, $len - $len % $block_size); - $plaintext .= \mcrypt_generic($this->ecb, $iv . $cb) ^ $cb; - $iv = \substr($cb, -$block_size); + $cb = substr($ciphertext, $i, $len - $len % $block_size); + $plaintext .= mcrypt_generic($this->ecb, $iv . $cb) ^ $cb; + $iv = substr($cb, -$block_size); $len %= $block_size; } if ($len) { - $iv = \mcrypt_generic($this->ecb, $iv); - $plaintext .= $iv ^ \substr($ciphertext, -$len); - $iv = \substr_replace($iv, \substr($ciphertext, -$len), 0, $len); + $iv = mcrypt_generic($this->ecb, $iv); + $plaintext .= $iv ^ substr($ciphertext, -$len); + $iv = substr_replace($iv, substr($ciphertext, -$len), 0, $len); $pos = $len; } - \restore_error_handler(); + + restore_error_handler(); + return $plaintext; } - $plaintext = \mdecrypt_generic($this->demcrypt, $ciphertext); + + $plaintext = mdecrypt_generic($this->demcrypt, $ciphertext); + if (!$this->continuousBuffer) { - \mcrypt_generic_init($this->demcrypt, $this->key, $this->getIV($this->decryptIV)); + mcrypt_generic_init($this->demcrypt, $this->key, $this->getIV($this->decryptIV)); } - \restore_error_handler(); + + restore_error_handler(); + return $this->paddable ? $this->unpad($plaintext) : $plaintext; } + if ($this->engine === self::ENGINE_EVAL) { $inline = $this->inline_crypt; return $inline('decrypt', $ciphertext); } + $block_size = $this->block_size; - $buffer =& $this->debuffer; + + $buffer = &$this->debuffer; $plaintext = ''; switch ($this->mode) { case self::MODE_ECB: - for ($i = 0; $i < \strlen($ciphertext); $i += $block_size) { - $plaintext .= $this->decryptBlock(\substr($ciphertext, $i, $block_size)); + for ($i = 0; $i < strlen($ciphertext); $i += $block_size) { + $plaintext .= $this->decryptBlock(substr($ciphertext, $i, $block_size)); } break; case self::MODE_CBC: $xor = $this->decryptIV; - for ($i = 0; $i < \strlen($ciphertext); $i += $block_size) { - $block = \substr($ciphertext, $i, $block_size); + for ($i = 0; $i < strlen($ciphertext); $i += $block_size) { + $block = substr($ciphertext, $i, $block_size); $plaintext .= $this->decryptBlock($block) ^ $xor; $xor = $block; } @@ -1577,10 +1749,10 @@ public function decrypt($ciphertext) break; case self::MODE_CTR: $xor = $this->decryptIV; - if (\strlen($buffer['ciphertext'])) { - for ($i = 0; $i < \strlen($ciphertext); $i += $block_size) { - $block = \substr($ciphertext, $i, $block_size); - if (\strlen($block) > \strlen($buffer['ciphertext'])) { + if (strlen($buffer['ciphertext'])) { + for ($i = 0; $i < strlen($ciphertext); $i += $block_size) { + $block = substr($ciphertext, $i, $block_size); + if (strlen($block) > strlen($buffer['ciphertext'])) { $buffer['ciphertext'] .= $this->encryptBlock($xor); Strings::increment_str($xor); } @@ -1588,8 +1760,8 @@ public function decrypt($ciphertext) $plaintext .= $block ^ $key; } } else { - for ($i = 0; $i < \strlen($ciphertext); $i += $block_size) { - $block = \substr($ciphertext, $i, $block_size); + for ($i = 0; $i < strlen($ciphertext); $i += $block_size) { + $block = substr($ciphertext, $i, $block_size); $key = $this->encryptBlock($xor); Strings::increment_str($xor); $plaintext .= $block ^ $key; @@ -1597,20 +1769,20 @@ public function decrypt($ciphertext) } if ($this->continuousBuffer) { $this->decryptIV = $xor; - if ($start = \strlen($ciphertext) % $block_size) { - $buffer['ciphertext'] = \substr($key, $start) . $buffer['ciphertext']; + if ($start = strlen($ciphertext) % $block_size) { + $buffer['ciphertext'] = substr($key, $start) . $buffer['ciphertext']; } } break; case self::MODE_CFB: if ($this->continuousBuffer) { - $iv =& $this->decryptIV; - $pos =& $buffer['pos']; + $iv = &$this->decryptIV; + $pos = &$buffer['pos']; } else { $iv = $this->decryptIV; $pos = 0; } - $len = \strlen($ciphertext); + $len = strlen($ciphertext); $i = 0; if ($pos) { $orig_pos = $pos; @@ -1625,12 +1797,12 @@ public function decrypt($ciphertext) $len = 0; } // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $blocksize - $plaintext = \substr($iv, $orig_pos) ^ $ciphertext; - $iv = \substr_replace($iv, \substr($ciphertext, 0, $i), $orig_pos, $i); + $plaintext = substr($iv, $orig_pos) ^ $ciphertext; + $iv = substr_replace($iv, substr($ciphertext, 0, $i), $orig_pos, $i); } while ($len >= $block_size) { $iv = $this->encryptBlock($iv); - $cb = \substr($ciphertext, $i, $block_size); + $cb = substr($ciphertext, $i, $block_size); $plaintext .= $iv ^ $cb; $iv = $cb; $len -= $block_size; @@ -1638,46 +1810,50 @@ public function decrypt($ciphertext) } if ($len) { $iv = $this->encryptBlock($iv); - $plaintext .= $iv ^ \substr($ciphertext, $i); - $iv = \substr_replace($iv, \substr($ciphertext, $i), 0, $len); + $plaintext .= $iv ^ substr($ciphertext, $i); + $iv = substr_replace($iv, substr($ciphertext, $i), 0, $len); $pos = $len; } break; case self::MODE_CFB8: $plaintext = ''; - $len = \strlen($ciphertext); + $len = strlen($ciphertext); $iv = $this->decryptIV; + for ($i = 0; $i < $len; ++$i) { $plaintext .= $ciphertext[$i] ^ $this->encryptBlock($iv); - $iv = \substr($iv, 1) . $ciphertext[$i]; + $iv = substr($iv, 1) . $ciphertext[$i]; } + if ($this->continuousBuffer) { if ($len >= $block_size) { - $this->decryptIV = \substr($ciphertext, -$block_size); + $this->decryptIV = substr($ciphertext, -$block_size); } else { - $this->decryptIV = \substr($this->decryptIV, $len - $block_size) . \substr($ciphertext, -$len); + $this->decryptIV = substr($this->decryptIV, $len - $block_size) . substr($ciphertext, -$len); } } break; case self::MODE_OFB8: $plaintext = ''; - $len = \strlen($ciphertext); + $len = strlen($ciphertext); $iv = $this->decryptIV; + for ($i = 0; $i < $len; ++$i) { $xor = $this->encryptBlock($iv); $plaintext .= $ciphertext[$i] ^ $xor; - $iv = \substr($iv, 1) . $xor[0]; + $iv = substr($iv, 1) . $xor[0]; } + if ($this->continuousBuffer) { $this->decryptIV = $iv; } break; case self::MODE_OFB: $xor = $this->decryptIV; - if (\strlen($buffer['xor'])) { - for ($i = 0; $i < \strlen($ciphertext); $i += $block_size) { - $block = \substr($ciphertext, $i, $block_size); - if (\strlen($block) > \strlen($buffer['xor'])) { + if (strlen($buffer['xor'])) { + for ($i = 0; $i < strlen($ciphertext); $i += $block_size) { + $block = substr($ciphertext, $i, $block_size); + if (strlen($block) > strlen($buffer['xor'])) { $xor = $this->encryptBlock($xor); $buffer['xor'] .= $xor; } @@ -1685,16 +1861,16 @@ public function decrypt($ciphertext) $plaintext .= $block ^ $key; } } else { - for ($i = 0; $i < \strlen($ciphertext); $i += $block_size) { + for ($i = 0; $i < strlen($ciphertext); $i += $block_size) { $xor = $this->encryptBlock($xor); - $plaintext .= \substr($ciphertext, $i, $block_size) ^ $xor; + $plaintext .= substr($ciphertext, $i, $block_size) ^ $xor; } $key = $xor; } if ($this->continuousBuffer) { $this->decryptIV = $xor; - if ($start = \strlen($ciphertext) % $block_size) { - $buffer['xor'] = \substr($key, $start) . $buffer['xor']; + if ($start = strlen($ciphertext) % $block_size) { + $buffer['xor'] = substr($key, $start) . $buffer['xor']; } } break; @@ -1704,6 +1880,7 @@ public function decrypt($ciphertext) } return $this->paddable ? $this->unpad($plaintext) : $plaintext; } + /** * Get the authentication tag * @@ -1720,9 +1897,11 @@ public function getTag($length = 16) if ($this->mode != self::MODE_GCM && !$this->usePoly1305) { throw new \BadMethodCallException('Authentication tags are only utilized in GCM mode or with Poly1305'); } - if ($this->newtag === \false) { + + if ($this->newtag === false) { throw new \BadMethodCallException('A tag can only be returned after a round of encryption has been performed'); } + // the tag is 128-bits. it can't be greater than 16 bytes because that's bigger than the tag is. if it // were 0 you might as well be doing CTR and less than 4 provides minimal security that could be trivially // easily brute forced. @@ -1731,8 +1910,12 @@ public function getTag($length = 16) if ($length < 4 || $length > 16) { throw new \LengthException('The authentication tag must be between 4 and 16 bytes long'); } - return $length == 16 ? $this->newtag : \substr($this->newtag, 0, $length); + + return $length == 16 ? + $this->newtag : + substr($this->newtag, 0, $length); } + /** * Sets the authentication tag * @@ -1745,18 +1928,21 @@ public function getTag($length = 16) */ public function setTag($tag) { - if ($this->usePoly1305 && !isset($this->poly1305Key) && \method_exists($this, 'createPoly1305Key')) { + if ($this->usePoly1305 && !isset($this->poly1305Key) && method_exists($this, 'createPoly1305Key')) { $this->createPoly1305Key(); } + if ($this->mode != self::MODE_GCM && !$this->usePoly1305) { throw new \BadMethodCallException('Authentication tags are only utilized in GCM mode or with Poly1305'); } - $length = \strlen($tag); + + $length = strlen($tag); if ($length < 4 || $length > 16) { throw new \LengthException('The authentication tag must be between 4 and 16 bytes long'); } $this->oldtag = $tag; } + /** * Get the IV * @@ -1769,8 +1955,9 @@ public function setTag($tag) */ protected function getIV($iv) { - return $this->mode == self::MODE_ECB ? \str_repeat("\x00", $this->block_size) : $iv; + return $this->mode == self::MODE_ECB ? str_repeat("\0", $this->block_size) : $iv; } + /** * OpenSSL CTR Processor * @@ -1789,69 +1976,76 @@ protected function getIV($iv) private function openssl_ctr_process($plaintext, &$encryptIV, &$buffer) { $ciphertext = ''; + $block_size = $this->block_size; $key = $this->key; + if ($this->openssl_emulate_ctr) { $xor = $encryptIV; - if (\strlen($buffer['ciphertext'])) { - for ($i = 0; $i < \strlen($plaintext); $i += $block_size) { - $block = \substr($plaintext, $i, $block_size); - if (\strlen($block) > \strlen($buffer['ciphertext'])) { - $buffer['ciphertext'] .= \openssl_encrypt($xor, $this->cipher_name_openssl_ecb, $key, \OPENSSL_RAW_DATA | \OPENSSL_ZERO_PADDING); + if (strlen($buffer['ciphertext'])) { + for ($i = 0; $i < strlen($plaintext); $i += $block_size) { + $block = substr($plaintext, $i, $block_size); + if (strlen($block) > strlen($buffer['ciphertext'])) { + $buffer['ciphertext'] .= openssl_encrypt($xor, $this->cipher_name_openssl_ecb, $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING); } Strings::increment_str($xor); $otp = Strings::shift($buffer['ciphertext'], $block_size); $ciphertext .= $block ^ $otp; } } else { - for ($i = 0; $i < \strlen($plaintext); $i += $block_size) { - $block = \substr($plaintext, $i, $block_size); - $otp = \openssl_encrypt($xor, $this->cipher_name_openssl_ecb, $key, \OPENSSL_RAW_DATA | \OPENSSL_ZERO_PADDING); + for ($i = 0; $i < strlen($plaintext); $i += $block_size) { + $block = substr($plaintext, $i, $block_size); + $otp = openssl_encrypt($xor, $this->cipher_name_openssl_ecb, $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING); Strings::increment_str($xor); $ciphertext .= $block ^ $otp; } } if ($this->continuousBuffer) { $encryptIV = $xor; - if ($start = \strlen($plaintext) % $block_size) { - $buffer['ciphertext'] = \substr($key, $start) . $buffer['ciphertext']; + if ($start = strlen($plaintext) % $block_size) { + $buffer['ciphertext'] = substr($key, $start) . $buffer['ciphertext']; } } + return $ciphertext; } - if (\strlen($buffer['ciphertext'])) { - $ciphertext = $plaintext ^ Strings::shift($buffer['ciphertext'], \strlen($plaintext)); - $plaintext = \substr($plaintext, \strlen($ciphertext)); - if (!\strlen($plaintext)) { + + if (strlen($buffer['ciphertext'])) { + $ciphertext = $plaintext ^ Strings::shift($buffer['ciphertext'], strlen($plaintext)); + $plaintext = substr($plaintext, strlen($ciphertext)); + + if (!strlen($plaintext)) { return $ciphertext; } } - $overflow = \strlen($plaintext) % $block_size; + + $overflow = strlen($plaintext) % $block_size; if ($overflow) { - $plaintext2 = Strings::pop($plaintext, $overflow); - // ie. trim $plaintext to a multiple of $block_size and put rest of $plaintext in $plaintext2 - $encrypted = \openssl_encrypt($plaintext . \str_repeat("\x00", $block_size), $this->cipher_name_openssl, $key, \OPENSSL_RAW_DATA | \OPENSSL_ZERO_PADDING, $encryptIV); + $plaintext2 = Strings::pop($plaintext, $overflow); // ie. trim $plaintext to a multiple of $block_size and put rest of $plaintext in $plaintext2 + $encrypted = openssl_encrypt($plaintext . str_repeat("\0", $block_size), $this->cipher_name_openssl, $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $encryptIV); $temp = Strings::pop($encrypted, $block_size); $ciphertext .= $encrypted . ($plaintext2 ^ $temp); if ($this->continuousBuffer) { - $buffer['ciphertext'] = \substr($temp, $overflow); + $buffer['ciphertext'] = substr($temp, $overflow); $encryptIV = $temp; } - } elseif (!\strlen($buffer['ciphertext'])) { - $ciphertext .= \openssl_encrypt($plaintext . \str_repeat("\x00", $block_size), $this->cipher_name_openssl, $key, \OPENSSL_RAW_DATA | \OPENSSL_ZERO_PADDING, $encryptIV); + } elseif (!strlen($buffer['ciphertext'])) { + $ciphertext .= openssl_encrypt($plaintext . str_repeat("\0", $block_size), $this->cipher_name_openssl, $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $encryptIV); $temp = Strings::pop($ciphertext, $block_size); if ($this->continuousBuffer) { $encryptIV = $temp; } } if ($this->continuousBuffer) { - $encryptIV = \openssl_decrypt($encryptIV, $this->cipher_name_openssl_ecb, $key, \OPENSSL_RAW_DATA | \OPENSSL_ZERO_PADDING); + $encryptIV = openssl_decrypt($encryptIV, $this->cipher_name_openssl_ecb, $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING); if ($overflow) { Strings::increment_str($encryptIV); } } + return $ciphertext; } + /** * OpenSSL OFB Processor * @@ -1868,37 +2062,42 @@ private function openssl_ctr_process($plaintext, &$encryptIV, &$buffer) */ private function openssl_ofb_process($plaintext, &$encryptIV, &$buffer) { - if (\strlen($buffer['xor'])) { + if (strlen($buffer['xor'])) { $ciphertext = $plaintext ^ $buffer['xor']; - $buffer['xor'] = \substr($buffer['xor'], \strlen($ciphertext)); - $plaintext = \substr($plaintext, \strlen($ciphertext)); + $buffer['xor'] = substr($buffer['xor'], strlen($ciphertext)); + $plaintext = substr($plaintext, strlen($ciphertext)); } else { $ciphertext = ''; } + $block_size = $this->block_size; - $len = \strlen($plaintext); + + $len = strlen($plaintext); $key = $this->key; $overflow = $len % $block_size; - if (\strlen($plaintext)) { + + if (strlen($plaintext)) { if ($overflow) { - $ciphertext .= \openssl_encrypt(\substr($plaintext, 0, -$overflow) . \str_repeat("\x00", $block_size), $this->cipher_name_openssl, $key, \OPENSSL_RAW_DATA | \OPENSSL_ZERO_PADDING, $encryptIV); + $ciphertext .= openssl_encrypt(substr($plaintext, 0, -$overflow) . str_repeat("\0", $block_size), $this->cipher_name_openssl, $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $encryptIV); $xor = Strings::pop($ciphertext, $block_size); if ($this->continuousBuffer) { $encryptIV = $xor; } - $ciphertext .= Strings::shift($xor, $overflow) ^ \substr($plaintext, -$overflow); + $ciphertext .= Strings::shift($xor, $overflow) ^ substr($plaintext, -$overflow); if ($this->continuousBuffer) { $buffer['xor'] = $xor; } } else { - $ciphertext = \openssl_encrypt($plaintext, $this->cipher_name_openssl, $key, \OPENSSL_RAW_DATA | \OPENSSL_ZERO_PADDING, $encryptIV); + $ciphertext = openssl_encrypt($plaintext, $this->cipher_name_openssl, $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $encryptIV); if ($this->continuousBuffer) { - $encryptIV = \substr($ciphertext, -$block_size) ^ \substr($plaintext, -$block_size); + $encryptIV = substr($ciphertext, -$block_size) ^ substr($plaintext, -$block_size); } } } + return $ciphertext; } + /** * phpseclib <-> OpenSSL Mode Mapper * @@ -1924,6 +2123,7 @@ protected function openssl_translate_mode() return 'ofb'; } } + /** * Pad "packets". * @@ -1940,8 +2140,9 @@ protected function openssl_translate_mode() */ public function enablePadding() { - $this->padding = \true; + $this->padding = true; } + /** * Do not pad packets. * @@ -1949,8 +2150,9 @@ public function enablePadding() */ public function disablePadding() { - $this->padding = \false; + $this->padding = false; } + /** * Treat consecutive "packets" as if they are a continuous buffer. * @@ -1994,12 +2196,16 @@ public function enableContinuousBuffer() if ($this->mode == self::MODE_ECB) { return; } + if ($this->mode == self::MODE_GCM) { throw new \BadMethodCallException('This mode does not run in continuous mode'); } - $this->continuousBuffer = \true; + + $this->continuousBuffer = true; + $this->setEngine(); } + /** * Treat consecutive packets as if they are a discontinuous buffer. * @@ -2017,9 +2223,12 @@ public function disableContinuousBuffer() if (!$this->continuousBuffer) { return; } - $this->continuousBuffer = \false; + + $this->continuousBuffer = false; + $this->setEngine(); } + /** * Test for engine validity * @@ -2031,38 +2240,44 @@ protected function isValidEngineHelper($engine) { switch ($engine) { case self::ENGINE_OPENSSL: - $this->openssl_emulate_ctr = \false; - $result = $this->cipher_name_openssl && \extension_loaded('openssl'); + $this->openssl_emulate_ctr = false; + $result = $this->cipher_name_openssl && + extension_loaded('openssl'); if (!$result) { - return \false; + return false; } - $methods = \openssl_get_cipher_methods(); - if (\in_array($this->cipher_name_openssl, $methods)) { - return \true; + + $methods = openssl_get_cipher_methods(); + if (in_array($this->cipher_name_openssl, $methods)) { + return true; } // not all of openssl's symmetric cipher's support ctr. for those // that don't we'll emulate it switch ($this->mode) { case self::MODE_CTR: - if (\in_array($this->cipher_name_openssl_ecb, $methods)) { - $this->openssl_emulate_ctr = \true; - return \true; + if (in_array($this->cipher_name_openssl_ecb, $methods)) { + $this->openssl_emulate_ctr = true; + return true; } } - return \false; + return false; case self::ENGINE_MCRYPT: - \set_error_handler(function () { + set_error_handler(function () { }); - $result = $this->cipher_name_mcrypt && \extension_loaded('mcrypt') && \in_array($this->cipher_name_mcrypt, \mcrypt_list_algorithms()); - \restore_error_handler(); + $result = $this->cipher_name_mcrypt && + extension_loaded('mcrypt') && + in_array($this->cipher_name_mcrypt, mcrypt_list_algorithms()); + restore_error_handler(); return $result; case self::ENGINE_EVAL: - return \method_exists($this, 'setupInlineCrypt'); + return method_exists($this, 'setupInlineCrypt'); case self::ENGINE_INTERNAL: - return \true; + return true; } - return \false; + + return false; } + /** * Test for engine validity * @@ -2074,15 +2289,17 @@ public function isValidEngine($engine) { static $reverseMap; if (!isset($reverseMap)) { - $reverseMap = \array_map('strtolower', self::ENGINE_MAP); - $reverseMap = \array_flip($reverseMap); + $reverseMap = array_map('strtolower', self::ENGINE_MAP); + $reverseMap = array_flip($reverseMap); } - $engine = \strtolower($engine); + $engine = strtolower($engine); if (!isset($reverseMap[$engine])) { - return \false; + return false; } + return $this->isValidEngineHelper($reverseMap[$engine]); } + /** * Sets the preferred crypt engine * @@ -2107,13 +2324,15 @@ public function setPreferredEngine($engine) { static $reverseMap; if (!isset($reverseMap)) { - $reverseMap = \array_map('strtolower', self::ENGINE_MAP); - $reverseMap = \array_flip($reverseMap); + $reverseMap = array_map('strtolower', self::ENGINE_MAP); + $reverseMap = array_flip($reverseMap); } - $engine = \is_string($engine) ? \strtolower($engine) : ''; + $engine = is_string($engine) ? strtolower($engine) : ''; $this->preferredEngine = isset($reverseMap[$engine]) ? $reverseMap[$engine] : self::ENGINE_LIBSODIUM; + $this->setEngine(); } + /** * Returns the engine currently being utilized * @@ -2123,6 +2342,7 @@ public function getEngine() { return self::ENGINE_MAP[$this->engine]; } + /** * Sets the engine as appropriate * @@ -2131,10 +2351,20 @@ public function getEngine() protected function setEngine() { $this->engine = null; - $candidateEngines = [self::ENGINE_LIBSODIUM, self::ENGINE_OPENSSL_GCM, self::ENGINE_OPENSSL, self::ENGINE_MCRYPT, self::ENGINE_EVAL]; + + $candidateEngines = [ + self::ENGINE_LIBSODIUM, + self::ENGINE_OPENSSL_GCM, + self::ENGINE_OPENSSL, + self::ENGINE_MCRYPT, + self::ENGINE_EVAL + ]; if (isset($this->preferredEngine)) { $temp = [$this->preferredEngine]; - $candidateEngines = \array_merge($temp, \array_diff($candidateEngines, $temp)); + $candidateEngines = array_merge( + $temp, + array_diff($candidateEngines, $temp) + ); } foreach ($candidateEngines as $engine) { if ($this->isValidEngineHelper($engine)) { @@ -2145,23 +2375,27 @@ protected function setEngine() if (!$this->engine) { $this->engine = self::ENGINE_INTERNAL; } + if ($this->engine != self::ENGINE_MCRYPT && $this->enmcrypt) { - \set_error_handler(function () { + set_error_handler(function () { }); // Closing the current mcrypt resource(s). _mcryptSetup() will, if needed, // (re)open them with the module named in $this->cipher_name_mcrypt - \mcrypt_module_close($this->enmcrypt); - \mcrypt_module_close($this->demcrypt); + mcrypt_module_close($this->enmcrypt); + mcrypt_module_close($this->demcrypt); $this->enmcrypt = null; $this->demcrypt = null; + if ($this->ecb) { - \mcrypt_module_close($this->ecb); + mcrypt_module_close($this->ecb); $this->ecb = null; } - \restore_error_handler(); + restore_error_handler(); } - $this->changed = $this->nonIVChanged = \true; + + $this->changed = $this->nonIVChanged = true; } + /** * Encrypts a block * @@ -2170,7 +2404,8 @@ protected function setEngine() * @param string $in * @return string */ - protected abstract function encryptBlock($in); + abstract protected function encryptBlock($in); + /** * Decrypts a block * @@ -2179,7 +2414,8 @@ protected abstract function encryptBlock($in); * @param string $in * @return string */ - protected abstract function decryptBlock($in); + abstract protected function decryptBlock($in); + /** * Setup the key (expansion) * @@ -2189,7 +2425,8 @@ protected abstract function decryptBlock($in); * * @see self::setup() */ - protected abstract function setupKey(); + abstract protected function setupKey(); + /** * Setup the self::ENGINE_INTERNAL $engine * @@ -2220,52 +2457,75 @@ protected function setup() if (!$this->changed) { return; } - $this->changed = \false; - if ($this->usePoly1305 && !isset($this->poly1305Key) && \method_exists($this, 'createPoly1305Key')) { + + $this->changed = false; + + if ($this->usePoly1305 && !isset($this->poly1305Key) && method_exists($this, 'createPoly1305Key')) { $this->createPoly1305Key(); } - $this->enbuffer = $this->debuffer = ['ciphertext' => '', 'xor' => '', 'pos' => 0, 'enmcrypt_init' => \true]; + + $this->enbuffer = $this->debuffer = ['ciphertext' => '', 'xor' => '', 'pos' => 0, 'enmcrypt_init' => true]; //$this->newtag = $this->oldtag = false; + if ($this->usesNonce()) { - if ($this->nonce === \false) { + if ($this->nonce === false) { throw new InsufficientSetupException('No nonce has been defined'); } - if ($this->mode == self::MODE_GCM && !\in_array($this->engine, [self::ENGINE_LIBSODIUM, self::ENGINE_OPENSSL_GCM])) { + if ($this->mode == self::MODE_GCM && !in_array($this->engine, [self::ENGINE_LIBSODIUM, self::ENGINE_OPENSSL_GCM])) { $this->setupGCM(); } } else { $this->iv = $this->origIV; } - if ($this->iv === \false && !\in_array($this->mode, [self::MODE_STREAM, self::MODE_ECB])) { - if ($this->mode != self::MODE_GCM || !\in_array($this->engine, [self::ENGINE_LIBSODIUM, self::ENGINE_OPENSSL_GCM])) { + + if ($this->iv === false && !in_array($this->mode, [self::MODE_STREAM, self::MODE_ECB])) { + if ($this->mode != self::MODE_GCM || !in_array($this->engine, [self::ENGINE_LIBSODIUM, self::ENGINE_OPENSSL_GCM])) { throw new InsufficientSetupException('No IV has been defined'); } } - if ($this->key === \false) { + + if ($this->key === false) { throw new InsufficientSetupException('No key has been defined'); } + $this->encryptIV = $this->decryptIV = $this->iv; + switch ($this->engine) { case self::ENGINE_MCRYPT: - $this->enchanged = $this->dechanged = \true; - \set_error_handler(function () { + $this->enchanged = $this->dechanged = true; + + set_error_handler(function () { }); + if (!isset($this->enmcrypt)) { - static $mcrypt_modes = [self::MODE_CTR => 'ctr', self::MODE_ECB => \MCRYPT_MODE_ECB, self::MODE_CBC => \MCRYPT_MODE_CBC, self::MODE_CFB => 'ncfb', self::MODE_CFB8 => \MCRYPT_MODE_CFB, self::MODE_OFB => \MCRYPT_MODE_NOFB, self::MODE_OFB8 => \MCRYPT_MODE_OFB, self::MODE_STREAM => \MCRYPT_MODE_STREAM]; - $this->demcrypt = \mcrypt_module_open($this->cipher_name_mcrypt, '', $mcrypt_modes[$this->mode], ''); - $this->enmcrypt = \mcrypt_module_open($this->cipher_name_mcrypt, '', $mcrypt_modes[$this->mode], ''); + static $mcrypt_modes = [ + self::MODE_CTR => 'ctr', + self::MODE_ECB => MCRYPT_MODE_ECB, + self::MODE_CBC => MCRYPT_MODE_CBC, + self::MODE_CFB => 'ncfb', + self::MODE_CFB8 => MCRYPT_MODE_CFB, + self::MODE_OFB => MCRYPT_MODE_NOFB, + self::MODE_OFB8 => MCRYPT_MODE_OFB, + self::MODE_STREAM => MCRYPT_MODE_STREAM, + ]; + + $this->demcrypt = mcrypt_module_open($this->cipher_name_mcrypt, '', $mcrypt_modes[$this->mode], ''); + $this->enmcrypt = mcrypt_module_open($this->cipher_name_mcrypt, '', $mcrypt_modes[$this->mode], ''); + // we need the $ecb mcrypt resource (only) in MODE_CFB with enableContinuousBuffer() // to workaround mcrypt's broken ncfb implementation in buffered mode // see: {@link http://phpseclib.sourceforge.net/cfb-demo.phps} if ($this->mode == self::MODE_CFB) { - $this->ecb = \mcrypt_module_open($this->cipher_name_mcrypt, '', \MCRYPT_MODE_ECB, ''); + $this->ecb = mcrypt_module_open($this->cipher_name_mcrypt, '', MCRYPT_MODE_ECB, ''); } - } - // else should mcrypt_generic_deinit be called? + } // else should mcrypt_generic_deinit be called? + if ($this->mode == self::MODE_CFB) { - \mcrypt_generic_init($this->ecb, $this->key, \str_repeat("\x00", $this->block_size)); + mcrypt_generic_init($this->ecb, $this->key, str_repeat("\0", $this->block_size)); } - \restore_error_handler(); + + restore_error_handler(); + break; case self::ENGINE_INTERNAL: $this->setupKey(); @@ -2276,8 +2536,10 @@ protected function setup() $this->setupInlineCrypt(); } } - $this->nonIVChanged = \false; + + $this->nonIVChanged = false; } + /** * Pads a string * @@ -2295,17 +2557,21 @@ protected function setup() */ protected function pad($text) { - $length = \strlen($text); + $length = strlen($text); + if (!$this->padding) { if ($length % $this->block_size == 0) { return $text; } else { - throw new \LengthException("The plaintext's length ({$length}) is not a multiple of the block size ({$this->block_size}). Try enabling padding."); + throw new \LengthException("The plaintext's length ($length) is not a multiple of the block size ({$this->block_size}). Try enabling padding."); } } - $pad = $this->block_size - $length % $this->block_size; - return \str_pad($text, $length + $pad, \chr($pad)); + + $pad = $this->block_size - ($length % $this->block_size); + + return str_pad($text, $length + $pad, chr($pad)); } + /** * Unpads a string. * @@ -2322,12 +2588,16 @@ protected function unpad($text) if (!$this->padding) { return $text; } - $length = \ord($text[\strlen($text) - 1]); + + $length = ord($text[strlen($text) - 1]); + if (!$length || $length > $this->block_size) { - throw new BadDecryptionException("The ciphertext has an invalid padding length ({$length}) compared to the block size ({$this->block_size})"); + throw new BadDecryptionException("The ciphertext has an invalid padding length ($length) compared to the block size ({$this->block_size})"); } - return \substr($text, 0, -$length); + + return substr($text, 0, -$length); } + /** * Setup the performance-optimized function for de/encrypt() * @@ -2386,6 +2656,7 @@ protected function unpad($text) * @see self::decrypt() */ //protected function setupInlineCrypt(); + /** * Creates the performance-optimized function for en/decrypt() * @@ -2499,13 +2770,15 @@ protected function unpad($text) protected function createInlineCryptFunction($cipher_code) { $block_size = $this->block_size; + // optional - $init_crypt = isset($cipher_code['init_crypt']) ? $cipher_code['init_crypt'] : ''; - $init_encrypt = isset($cipher_code['init_encrypt']) ? $cipher_code['init_encrypt'] : ''; - $init_decrypt = isset($cipher_code['init_decrypt']) ? $cipher_code['init_decrypt'] : ''; + $init_crypt = isset($cipher_code['init_crypt']) ? $cipher_code['init_crypt'] : ''; + $init_encrypt = isset($cipher_code['init_encrypt']) ? $cipher_code['init_encrypt'] : ''; + $init_decrypt = isset($cipher_code['init_decrypt']) ? $cipher_code['init_decrypt'] : ''; // required $encrypt_block = $cipher_code['encrypt_block']; $decrypt_block = $cipher_code['decrypt_block']; + // Generating mode of operation inline code, // merged with the $cipher_code algorithm // for encrypt- and decryption. @@ -2523,6 +2796,7 @@ protected function createInlineCryptFunction($cipher_code) return $_ciphertext; '; + $decrypt = $init_decrypt . ' $_plaintext = ""; $_text = str_pad($_text, strlen($_text) + (' . $block_size . ' - strlen($_text) % ' . $block_size . ') % ' . $block_size . ', chr(0)); @@ -2549,10 +2823,10 @@ protected function createInlineCryptFunction($cipher_code) if (strlen($_block) > strlen($_buffer["ciphertext"])) { $in = $_xor; ' . $encrypt_block . ' - \\phpseclib3\\Common\\Functions\\Strings::increment_str($_xor); + \phpseclib3\Common\Functions\Strings::increment_str($_xor); $_buffer["ciphertext"].= $in; } - $_key = \\phpseclib3\\Common\\Functions\\Strings::shift($_buffer["ciphertext"], ' . $block_size . '); + $_key = \phpseclib3\Common\Functions\Strings::shift($_buffer["ciphertext"], ' . $block_size . '); $_ciphertext.= $_block ^ $_key; } } else { @@ -2560,7 +2834,7 @@ protected function createInlineCryptFunction($cipher_code) $_block = substr($_text, $_i, ' . $block_size . '); $in = $_xor; ' . $encrypt_block . ' - \\phpseclib3\\Common\\Functions\\Strings::increment_str($_xor); + \phpseclib3\Common\Functions\Strings::increment_str($_xor); $_key = $in; $_ciphertext.= $_block ^ $_key; } @@ -2574,6 +2848,7 @@ protected function createInlineCryptFunction($cipher_code) return $_ciphertext; '; + $decrypt = $init_encrypt . ' $_plaintext = ""; $_ciphertext_len = strlen($_text); @@ -2586,10 +2861,10 @@ protected function createInlineCryptFunction($cipher_code) if (strlen($_block) > strlen($_buffer["ciphertext"])) { $in = $_xor; ' . $encrypt_block . ' - \\phpseclib3\\Common\\Functions\\Strings::increment_str($_xor); + \phpseclib3\Common\Functions\Strings::increment_str($_xor); $_buffer["ciphertext"].= $in; } - $_key = \\phpseclib3\\Common\\Functions\\Strings::shift($_buffer["ciphertext"], ' . $block_size . '); + $_key = \phpseclib3\Common\Functions\Strings::shift($_buffer["ciphertext"], ' . $block_size . '); $_plaintext.= $_block ^ $_key; } } else { @@ -2597,7 +2872,7 @@ protected function createInlineCryptFunction($cipher_code) $_block = substr($_text, $_i, ' . $block_size . '); $in = $_xor; ' . $encrypt_block . ' - \\phpseclib3\\Common\\Functions\\Strings::increment_str($_xor); + \phpseclib3\Common\Functions\Strings::increment_str($_xor); $_key = $in; $_plaintext.= $_block ^ $_key; } @@ -2660,6 +2935,7 @@ protected function createInlineCryptFunction($cipher_code) } return $_ciphertext; '; + $decrypt = $init_encrypt . ' $_plaintext = ""; $_buffer = &$this->debuffer; @@ -2810,7 +3086,7 @@ protected function createInlineCryptFunction($cipher_code) $_xor = $in; $_buffer["xor"].= $_xor; } - $_key = \\phpseclib3\\Common\\Functions\\Strings::shift($_buffer["xor"], ' . $block_size . '); + $_key = \phpseclib3\Common\Functions\Strings::shift($_buffer["xor"], ' . $block_size . '); $_ciphertext.= $_block ^ $_key; } } else { @@ -2830,6 +3106,7 @@ protected function createInlineCryptFunction($cipher_code) } return $_ciphertext; '; + $decrypt = $init_encrypt . ' $_plaintext = ""; $_ciphertext_len = strlen($_text); @@ -2845,7 +3122,7 @@ protected function createInlineCryptFunction($cipher_code) $_xor = $in; $_buffer["xor"].= $_xor; } - $_key = \\phpseclib3\\Common\\Functions\\Strings::shift($_buffer["xor"], ' . $block_size . '); + $_key = \phpseclib3\Common\Functions\Strings::shift($_buffer["xor"], ' . $block_size . '); $_plaintext.= $_block ^ $_key; } } else { @@ -2898,6 +3175,7 @@ protected function createInlineCryptFunction($cipher_code) return $_ciphertext; '; + $decrypt = $init_decrypt . ' $_plaintext = ""; $_text = str_pad($_text, strlen($_text) + (' . $block_size . ' - strlen($_text) % ' . $block_size . ') % ' . $block_size . ', chr(0)); @@ -2920,12 +3198,15 @@ protected function createInlineCryptFunction($cipher_code) '; break; } + // Before discrediting this, please read the following: // @see https://github.com/phpseclib/phpseclib/issues/1293 // @see https://github.com/phpseclib/phpseclib/pull/1143 eval('$func = function ($_action, $_text) { ' . $init_crypt . 'if ($_action == "encrypt") { ' . $encrypt . ' } else { ' . $decrypt . ' }};'); + return \Closure::bind($func, $this, static::class); } + /** * Convert float to int * @@ -2936,14 +3217,18 @@ protected function createInlineCryptFunction($cipher_code) */ protected static function safe_intval($x) { - if (\is_int($x)) { + if (is_int($x)) { return $x; } + if (self::$use_reg_intval) { - return \PHP_INT_SIZE == 4 && \PHP_VERSION_ID >= 80100 ? \intval($x) : $x; + return PHP_INT_SIZE == 4 && PHP_VERSION_ID >= 80100 ? intval($x) : $x; } - return \fmod($x, 0x80000000) & 0x7fffffff | (\fmod(\floor($x / 0x80000000), 2) & 1) << 31; + + return (fmod($x, 0x80000000) & 0x7FFFFFFF) | + ((fmod(floor($x / 0x80000000), 2) & 1) << 31); } + /** * eval()'able string for in-line float to int * @@ -2952,11 +3237,13 @@ protected static function safe_intval($x) protected static function safe_intval_inline() { if (self::$use_reg_intval) { - return \PHP_INT_SIZE == 4 && \PHP_VERSION_ID >= 80100 ? 'intval(%s)' : '%s'; + return PHP_INT_SIZE == 4 && PHP_VERSION_ID >= 80100 ? 'intval(%s)' : '%s'; } + $safeint = '(is_int($temp = %s) ? $temp : (fmod($temp, 0x80000000) & 0x7FFFFFFF) | '; return $safeint . '((fmod(floor($temp / 0x80000000), 2) & 1) << 31))'; } + /** * Sets up GCM parameters * @@ -2971,15 +3258,22 @@ private function setupGCM() $cipher = new static('ecb'); $cipher->setKey($this->key); $cipher->disablePadding(); - $this->h = self::$gcmField->newInteger(Strings::switchEndianness($cipher->encrypt("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"))); + + $this->h = self::$gcmField->newInteger( + Strings::switchEndianness($cipher->encrypt("\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0")) + ); $this->hKey = $this->key; } - if (\strlen($this->nonce) == 12) { - $this->iv = $this->nonce . "\x00\x00\x00\x01"; + + if (strlen($this->nonce) == 12) { + $this->iv = $this->nonce . "\0\0\0\1"; } else { - $this->iv = $this->ghash(self::nullPad128($this->nonce) . \str_repeat("\x00", 8) . self::len64($this->nonce)); + $this->iv = $this->ghash( + self::nullPad128($this->nonce) . str_repeat("\0", 8) . self::len64($this->nonce) + ); } } + /** * Performs GHASH operation * @@ -2994,13 +3288,14 @@ private function setupGCM() private function ghash($x) { $h = $this->h; - $y = ["\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"]; - $x = \str_split($x, 16); + $y = ["\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"]; + $x = str_split($x, 16); $n = 0; // the switchEndianness calls are necessary because the multiplication algorithm in BinaryField/Integer // interprets strings as polynomials in big endian order whereas in GCM they're interpreted in little // endian order per https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38d.pdf#page=19. // big endian order is what binary field elliptic curves use per http://www.secg.org/sec1-v2.pdf#page=18. + // we could switchEndianness here instead of in the while loop but doing so in the while loop seems like it // might be slightly more performant //$x = Strings::switchEndianness($x); @@ -3009,11 +3304,12 @@ private function ghash($x) $t = $y[$n] ^ $xn; $temp = self::$gcmField->newInteger($t); $y[++$n] = $temp->multiply($h)->toBytes(); - $y[$n] = \substr($y[$n], 1); + $y[$n] = substr($y[$n], 1); } $y[$n] = Strings::switchEndianness($y[$n]); return $y[$n]; } + /** * Returns the bit length of a string in a packed format * @@ -3025,8 +3321,9 @@ private function ghash($x) */ private static function len64($str) { - return "\x00\x00\x00\x00" . \pack('N', 8 * \strlen($str)); + return "\0\0\0\0" . pack('N', 8 * strlen($str)); } + /** * NULL pads a string to be a multiple of 128 * @@ -3038,9 +3335,10 @@ private static function len64($str) */ protected static function nullPad128($str) { - $len = \strlen($str); - return $str . \str_repeat("\x00", 16 * \ceil($len / 16) - $len); + $len = strlen($str); + return $str . str_repeat("\0", 16 * ceil($len / 16) - $len); } + /** * Calculates Poly1305 MAC * @@ -3054,26 +3352,28 @@ protected static function nullPad128($str) */ protected function poly1305($text) { - $s = $this->poly1305Key; - // strlen($this->poly1305Key) == 32 + $s = $this->poly1305Key; // strlen($this->poly1305Key) == 32 $r = Strings::shift($s, 16); - $r = \strrev($r); + $r = strrev($r); $r &= "\x0f\xff\xff\xfc\x0f\xff\xff\xfc\x0f\xff\xff\xfc\x0f\xff\xff\xff"; - $s = \strrev($s); + $s = strrev($s); + $r = self::$poly1305Field->newInteger(new BigInteger($r, 256)); $s = self::$poly1305Field->newInteger(new BigInteger($s, 256)); $a = self::$poly1305Field->newInteger(new BigInteger()); - $blocks = \str_split($text, 16); + + $blocks = str_split($text, 16); foreach ($blocks as $block) { - $n = \strrev($block . \chr(1)); + $n = strrev($block . chr(1)); $n = self::$poly1305Field->newInteger(new BigInteger($n, 256)); $a = $a->add($n); $a = $a->multiply($r); } $r = $a->toBigInteger()->add($s->toBigInteger()); - $mask = "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"; - return \strrev($r->toBytes()) & $mask; + $mask = "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"; + return strrev($r->toBytes()) & $mask; } + /** * Return the mode * @@ -3083,8 +3383,9 @@ protected function poly1305($text) */ public function getMode() { - return \array_flip(self::MODE_MAP)[$this->mode]; + return array_flip(self::MODE_MAP)[$this->mode]; } + /** * Is the continuous buffer enabled? * diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Traits/Fingerprint.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Traits/Fingerprint.php index 52ad463..f4cf071 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Traits/Fingerprint.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Traits/Fingerprint.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Traits; use OCA\Libresign\Vendor\phpseclib3\Crypt\Hash; + /** * Fingerprint Trait for Private Keys * * @author Jim Wigginton - * @internal */ trait Fingerprint { @@ -35,22 +36,22 @@ trait Fingerprint public function getFingerprint($algorithm = 'md5') { $type = self::validatePlugin('Keys', 'OpenSSH', 'savePublicKey'); - if ($type === \false) { - return \false; + if ($type === false) { + return false; } - $key = $this->toString('OpenSSH', ['binary' => \true]); - if ($key === \false) { - return \false; + $key = $this->toString('OpenSSH', ['binary' => true]); + if ($key === false) { + return false; } switch ($algorithm) { case 'sha256': $hash = new Hash('sha256'); - $base = \base64_encode($hash->hash($key)); - return \substr($base, 0, \strlen($base) - 1); + $base = base64_encode($hash->hash($key)); + return substr($base, 0, strlen($base) - 1); case 'md5': - return \substr(\chunk_split(\md5($key), 2, ':'), 0, -1); + return substr(chunk_split(md5($key), 2, ':'), 0, -1); default: - return \false; + return false; } } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Traits/PasswordProtected.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Traits/PasswordProtected.php index 7d6d283..f53b02a 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Traits/PasswordProtected.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Traits/PasswordProtected.php @@ -10,13 +10,13 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Traits; /** * Password Protected Trait for Private Keys * * @author Jim Wigginton - * @internal */ trait PasswordProtected { @@ -25,7 +25,8 @@ trait PasswordProtected * * @var string|bool */ - private $password = \false; + private $password = false; + /** * Sets the password * @@ -36,7 +37,7 @@ trait PasswordProtected * @see self::load() * @param string|bool $password */ - public function withPassword($password = \false) + public function withPassword($password = false) { $new = clone $this; $new->password = $password; diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/DES.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/DES.php index 53fef93..5ba761b 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/DES.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/DES.php @@ -37,15 +37,16 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt; use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\BlockCipher; use OCA\Libresign\Vendor\phpseclib3\Exception\BadModeException; + /** * Pure-PHP implementation of DES. * * @author Jim Wigginton - * @internal */ class DES extends BlockCipher { @@ -63,6 +64,7 @@ class DES extends BlockCipher * @see \phpseclib3\Crypt\DES::processBlock() */ const DECRYPT = 1; + /** * Block Length of the cipher * @@ -70,6 +72,7 @@ class DES extends BlockCipher * @var int */ protected $block_size = 8; + /** * Key Length (in bytes) * @@ -77,6 +80,7 @@ class DES extends BlockCipher * @var int */ protected $key_length = 8; + /** * The mcrypt specific name of the cipher * @@ -84,13 +88,21 @@ class DES extends BlockCipher * @var string */ protected $cipher_name_mcrypt = 'des'; + /** * The OpenSSL names of the cipher / modes * * @see Common\SymmetricKey::openssl_mode_names * @var array */ - protected $openssl_mode_names = [self::MODE_ECB => 'des-ecb', self::MODE_CBC => 'des-cbc', self::MODE_CFB => 'des-cfb', self::MODE_OFB => 'des-ofb']; + protected $openssl_mode_names = [ + self::MODE_ECB => 'des-ecb', + self::MODE_CBC => 'des-cbc', + self::MODE_CFB => 'des-cfb', + self::MODE_OFB => 'des-ofb' + // self::MODE_CTR is undefined for DES + ]; + /** * Optimizing value while CFB-encrypting * @@ -98,6 +110,7 @@ class DES extends BlockCipher * @var int */ protected $cfb_init_len = 500; + /** * Switch for DES/3DES encryption * @@ -108,6 +121,7 @@ class DES extends BlockCipher * @var int */ protected $des_rounds = 1; + /** * max possible size of $key * @@ -115,6 +129,7 @@ class DES extends BlockCipher * @var string */ protected $key_length_max = 8; + /** * The Key Schedule * @@ -122,6 +137,7 @@ class DES extends BlockCipher * @var array */ private $keys; + /** * Key Cache "key" * @@ -129,6 +145,7 @@ class DES extends BlockCipher * @var array */ private $kl; + /** * Shuffle table. * @@ -140,7 +157,137 @@ class DES extends BlockCipher * @see self::setupKey() * @var array */ - protected static $shuffle = ["\x00\x00\x00\x00\x00\x00\x00\x00", "\x00\x00\x00\x00\x00\x00\x00\xff", "\x00\x00\x00\x00\x00\x00\xff\x00", "\x00\x00\x00\x00\x00\x00\xff\xff", "\x00\x00\x00\x00\x00\xff\x00\x00", "\x00\x00\x00\x00\x00\xff\x00\xff", "\x00\x00\x00\x00\x00\xff\xff\x00", "\x00\x00\x00\x00\x00\xff\xff\xff", "\x00\x00\x00\x00\xff\x00\x00\x00", "\x00\x00\x00\x00\xff\x00\x00\xff", "\x00\x00\x00\x00\xff\x00\xff\x00", "\x00\x00\x00\x00\xff\x00\xff\xff", "\x00\x00\x00\x00\xff\xff\x00\x00", "\x00\x00\x00\x00\xff\xff\x00\xff", "\x00\x00\x00\x00\xff\xff\xff\x00", "\x00\x00\x00\x00\xff\xff\xff\xff", "\x00\x00\x00\xff\x00\x00\x00\x00", "\x00\x00\x00\xff\x00\x00\x00\xff", "\x00\x00\x00\xff\x00\x00\xff\x00", "\x00\x00\x00\xff\x00\x00\xff\xff", "\x00\x00\x00\xff\x00\xff\x00\x00", "\x00\x00\x00\xff\x00\xff\x00\xff", "\x00\x00\x00\xff\x00\xff\xff\x00", "\x00\x00\x00\xff\x00\xff\xff\xff", "\x00\x00\x00\xff\xff\x00\x00\x00", "\x00\x00\x00\xff\xff\x00\x00\xff", "\x00\x00\x00\xff\xff\x00\xff\x00", "\x00\x00\x00\xff\xff\x00\xff\xff", "\x00\x00\x00\xff\xff\xff\x00\x00", "\x00\x00\x00\xff\xff\xff\x00\xff", "\x00\x00\x00\xff\xff\xff\xff\x00", "\x00\x00\x00\xff\xff\xff\xff\xff", "\x00\x00\xff\x00\x00\x00\x00\x00", "\x00\x00\xff\x00\x00\x00\x00\xff", "\x00\x00\xff\x00\x00\x00\xff\x00", "\x00\x00\xff\x00\x00\x00\xff\xff", "\x00\x00\xff\x00\x00\xff\x00\x00", "\x00\x00\xff\x00\x00\xff\x00\xff", "\x00\x00\xff\x00\x00\xff\xff\x00", "\x00\x00\xff\x00\x00\xff\xff\xff", "\x00\x00\xff\x00\xff\x00\x00\x00", "\x00\x00\xff\x00\xff\x00\x00\xff", "\x00\x00\xff\x00\xff\x00\xff\x00", "\x00\x00\xff\x00\xff\x00\xff\xff", "\x00\x00\xff\x00\xff\xff\x00\x00", "\x00\x00\xff\x00\xff\xff\x00\xff", "\x00\x00\xff\x00\xff\xff\xff\x00", "\x00\x00\xff\x00\xff\xff\xff\xff", "\x00\x00\xff\xff\x00\x00\x00\x00", "\x00\x00\xff\xff\x00\x00\x00\xff", "\x00\x00\xff\xff\x00\x00\xff\x00", "\x00\x00\xff\xff\x00\x00\xff\xff", "\x00\x00\xff\xff\x00\xff\x00\x00", "\x00\x00\xff\xff\x00\xff\x00\xff", "\x00\x00\xff\xff\x00\xff\xff\x00", "\x00\x00\xff\xff\x00\xff\xff\xff", "\x00\x00\xff\xff\xff\x00\x00\x00", "\x00\x00\xff\xff\xff\x00\x00\xff", "\x00\x00\xff\xff\xff\x00\xff\x00", "\x00\x00\xff\xff\xff\x00\xff\xff", "\x00\x00\xff\xff\xff\xff\x00\x00", "\x00\x00\xff\xff\xff\xff\x00\xff", "\x00\x00\xff\xff\xff\xff\xff\x00", "\x00\x00\xff\xff\xff\xff\xff\xff", "\x00\xff\x00\x00\x00\x00\x00\x00", "\x00\xff\x00\x00\x00\x00\x00\xff", "\x00\xff\x00\x00\x00\x00\xff\x00", "\x00\xff\x00\x00\x00\x00\xff\xff", "\x00\xff\x00\x00\x00\xff\x00\x00", "\x00\xff\x00\x00\x00\xff\x00\xff", "\x00\xff\x00\x00\x00\xff\xff\x00", "\x00\xff\x00\x00\x00\xff\xff\xff", "\x00\xff\x00\x00\xff\x00\x00\x00", "\x00\xff\x00\x00\xff\x00\x00\xff", "\x00\xff\x00\x00\xff\x00\xff\x00", "\x00\xff\x00\x00\xff\x00\xff\xff", "\x00\xff\x00\x00\xff\xff\x00\x00", "\x00\xff\x00\x00\xff\xff\x00\xff", "\x00\xff\x00\x00\xff\xff\xff\x00", "\x00\xff\x00\x00\xff\xff\xff\xff", "\x00\xff\x00\xff\x00\x00\x00\x00", "\x00\xff\x00\xff\x00\x00\x00\xff", "\x00\xff\x00\xff\x00\x00\xff\x00", "\x00\xff\x00\xff\x00\x00\xff\xff", "\x00\xff\x00\xff\x00\xff\x00\x00", "\x00\xff\x00\xff\x00\xff\x00\xff", "\x00\xff\x00\xff\x00\xff\xff\x00", "\x00\xff\x00\xff\x00\xff\xff\xff", "\x00\xff\x00\xff\xff\x00\x00\x00", "\x00\xff\x00\xff\xff\x00\x00\xff", "\x00\xff\x00\xff\xff\x00\xff\x00", "\x00\xff\x00\xff\xff\x00\xff\xff", "\x00\xff\x00\xff\xff\xff\x00\x00", "\x00\xff\x00\xff\xff\xff\x00\xff", "\x00\xff\x00\xff\xff\xff\xff\x00", "\x00\xff\x00\xff\xff\xff\xff\xff", "\x00\xff\xff\x00\x00\x00\x00\x00", "\x00\xff\xff\x00\x00\x00\x00\xff", "\x00\xff\xff\x00\x00\x00\xff\x00", "\x00\xff\xff\x00\x00\x00\xff\xff", "\x00\xff\xff\x00\x00\xff\x00\x00", "\x00\xff\xff\x00\x00\xff\x00\xff", "\x00\xff\xff\x00\x00\xff\xff\x00", "\x00\xff\xff\x00\x00\xff\xff\xff", "\x00\xff\xff\x00\xff\x00\x00\x00", "\x00\xff\xff\x00\xff\x00\x00\xff", "\x00\xff\xff\x00\xff\x00\xff\x00", "\x00\xff\xff\x00\xff\x00\xff\xff", "\x00\xff\xff\x00\xff\xff\x00\x00", "\x00\xff\xff\x00\xff\xff\x00\xff", "\x00\xff\xff\x00\xff\xff\xff\x00", "\x00\xff\xff\x00\xff\xff\xff\xff", "\x00\xff\xff\xff\x00\x00\x00\x00", "\x00\xff\xff\xff\x00\x00\x00\xff", "\x00\xff\xff\xff\x00\x00\xff\x00", "\x00\xff\xff\xff\x00\x00\xff\xff", "\x00\xff\xff\xff\x00\xff\x00\x00", "\x00\xff\xff\xff\x00\xff\x00\xff", "\x00\xff\xff\xff\x00\xff\xff\x00", "\x00\xff\xff\xff\x00\xff\xff\xff", "\x00\xff\xff\xff\xff\x00\x00\x00", "\x00\xff\xff\xff\xff\x00\x00\xff", "\x00\xff\xff\xff\xff\x00\xff\x00", "\x00\xff\xff\xff\xff\x00\xff\xff", "\x00\xff\xff\xff\xff\xff\x00\x00", "\x00\xff\xff\xff\xff\xff\x00\xff", "\x00\xff\xff\xff\xff\xff\xff\x00", "\x00\xff\xff\xff\xff\xff\xff\xff", "\xff\x00\x00\x00\x00\x00\x00\x00", "\xff\x00\x00\x00\x00\x00\x00\xff", "\xff\x00\x00\x00\x00\x00\xff\x00", "\xff\x00\x00\x00\x00\x00\xff\xff", "\xff\x00\x00\x00\x00\xff\x00\x00", "\xff\x00\x00\x00\x00\xff\x00\xff", "\xff\x00\x00\x00\x00\xff\xff\x00", "\xff\x00\x00\x00\x00\xff\xff\xff", "\xff\x00\x00\x00\xff\x00\x00\x00", "\xff\x00\x00\x00\xff\x00\x00\xff", "\xff\x00\x00\x00\xff\x00\xff\x00", "\xff\x00\x00\x00\xff\x00\xff\xff", "\xff\x00\x00\x00\xff\xff\x00\x00", "\xff\x00\x00\x00\xff\xff\x00\xff", "\xff\x00\x00\x00\xff\xff\xff\x00", "\xff\x00\x00\x00\xff\xff\xff\xff", "\xff\x00\x00\xff\x00\x00\x00\x00", "\xff\x00\x00\xff\x00\x00\x00\xff", "\xff\x00\x00\xff\x00\x00\xff\x00", "\xff\x00\x00\xff\x00\x00\xff\xff", "\xff\x00\x00\xff\x00\xff\x00\x00", "\xff\x00\x00\xff\x00\xff\x00\xff", "\xff\x00\x00\xff\x00\xff\xff\x00", "\xff\x00\x00\xff\x00\xff\xff\xff", "\xff\x00\x00\xff\xff\x00\x00\x00", "\xff\x00\x00\xff\xff\x00\x00\xff", "\xff\x00\x00\xff\xff\x00\xff\x00", "\xff\x00\x00\xff\xff\x00\xff\xff", "\xff\x00\x00\xff\xff\xff\x00\x00", "\xff\x00\x00\xff\xff\xff\x00\xff", "\xff\x00\x00\xff\xff\xff\xff\x00", "\xff\x00\x00\xff\xff\xff\xff\xff", "\xff\x00\xff\x00\x00\x00\x00\x00", "\xff\x00\xff\x00\x00\x00\x00\xff", "\xff\x00\xff\x00\x00\x00\xff\x00", "\xff\x00\xff\x00\x00\x00\xff\xff", "\xff\x00\xff\x00\x00\xff\x00\x00", "\xff\x00\xff\x00\x00\xff\x00\xff", "\xff\x00\xff\x00\x00\xff\xff\x00", "\xff\x00\xff\x00\x00\xff\xff\xff", "\xff\x00\xff\x00\xff\x00\x00\x00", "\xff\x00\xff\x00\xff\x00\x00\xff", "\xff\x00\xff\x00\xff\x00\xff\x00", "\xff\x00\xff\x00\xff\x00\xff\xff", "\xff\x00\xff\x00\xff\xff\x00\x00", "\xff\x00\xff\x00\xff\xff\x00\xff", "\xff\x00\xff\x00\xff\xff\xff\x00", "\xff\x00\xff\x00\xff\xff\xff\xff", "\xff\x00\xff\xff\x00\x00\x00\x00", "\xff\x00\xff\xff\x00\x00\x00\xff", "\xff\x00\xff\xff\x00\x00\xff\x00", "\xff\x00\xff\xff\x00\x00\xff\xff", "\xff\x00\xff\xff\x00\xff\x00\x00", "\xff\x00\xff\xff\x00\xff\x00\xff", "\xff\x00\xff\xff\x00\xff\xff\x00", "\xff\x00\xff\xff\x00\xff\xff\xff", "\xff\x00\xff\xff\xff\x00\x00\x00", "\xff\x00\xff\xff\xff\x00\x00\xff", "\xff\x00\xff\xff\xff\x00\xff\x00", "\xff\x00\xff\xff\xff\x00\xff\xff", "\xff\x00\xff\xff\xff\xff\x00\x00", "\xff\x00\xff\xff\xff\xff\x00\xff", "\xff\x00\xff\xff\xff\xff\xff\x00", "\xff\x00\xff\xff\xff\xff\xff\xff", "\xff\xff\x00\x00\x00\x00\x00\x00", "\xff\xff\x00\x00\x00\x00\x00\xff", "\xff\xff\x00\x00\x00\x00\xff\x00", "\xff\xff\x00\x00\x00\x00\xff\xff", "\xff\xff\x00\x00\x00\xff\x00\x00", "\xff\xff\x00\x00\x00\xff\x00\xff", "\xff\xff\x00\x00\x00\xff\xff\x00", "\xff\xff\x00\x00\x00\xff\xff\xff", "\xff\xff\x00\x00\xff\x00\x00\x00", "\xff\xff\x00\x00\xff\x00\x00\xff", "\xff\xff\x00\x00\xff\x00\xff\x00", "\xff\xff\x00\x00\xff\x00\xff\xff", "\xff\xff\x00\x00\xff\xff\x00\x00", "\xff\xff\x00\x00\xff\xff\x00\xff", "\xff\xff\x00\x00\xff\xff\xff\x00", "\xff\xff\x00\x00\xff\xff\xff\xff", "\xff\xff\x00\xff\x00\x00\x00\x00", "\xff\xff\x00\xff\x00\x00\x00\xff", "\xff\xff\x00\xff\x00\x00\xff\x00", "\xff\xff\x00\xff\x00\x00\xff\xff", "\xff\xff\x00\xff\x00\xff\x00\x00", "\xff\xff\x00\xff\x00\xff\x00\xff", "\xff\xff\x00\xff\x00\xff\xff\x00", "\xff\xff\x00\xff\x00\xff\xff\xff", "\xff\xff\x00\xff\xff\x00\x00\x00", "\xff\xff\x00\xff\xff\x00\x00\xff", "\xff\xff\x00\xff\xff\x00\xff\x00", "\xff\xff\x00\xff\xff\x00\xff\xff", "\xff\xff\x00\xff\xff\xff\x00\x00", "\xff\xff\x00\xff\xff\xff\x00\xff", "\xff\xff\x00\xff\xff\xff\xff\x00", "\xff\xff\x00\xff\xff\xff\xff\xff", "\xff\xff\xff\x00\x00\x00\x00\x00", "\xff\xff\xff\x00\x00\x00\x00\xff", "\xff\xff\xff\x00\x00\x00\xff\x00", "\xff\xff\xff\x00\x00\x00\xff\xff", "\xff\xff\xff\x00\x00\xff\x00\x00", "\xff\xff\xff\x00\x00\xff\x00\xff", "\xff\xff\xff\x00\x00\xff\xff\x00", "\xff\xff\xff\x00\x00\xff\xff\xff", "\xff\xff\xff\x00\xff\x00\x00\x00", "\xff\xff\xff\x00\xff\x00\x00\xff", "\xff\xff\xff\x00\xff\x00\xff\x00", "\xff\xff\xff\x00\xff\x00\xff\xff", "\xff\xff\xff\x00\xff\xff\x00\x00", "\xff\xff\xff\x00\xff\xff\x00\xff", "\xff\xff\xff\x00\xff\xff\xff\x00", "\xff\xff\xff\x00\xff\xff\xff\xff", "\xff\xff\xff\xff\x00\x00\x00\x00", "\xff\xff\xff\xff\x00\x00\x00\xff", "\xff\xff\xff\xff\x00\x00\xff\x00", "\xff\xff\xff\xff\x00\x00\xff\xff", "\xff\xff\xff\xff\x00\xff\x00\x00", "\xff\xff\xff\xff\x00\xff\x00\xff", "\xff\xff\xff\xff\x00\xff\xff\x00", "\xff\xff\xff\xff\x00\xff\xff\xff", "\xff\xff\xff\xff\xff\x00\x00\x00", "\xff\xff\xff\xff\xff\x00\x00\xff", "\xff\xff\xff\xff\xff\x00\xff\x00", "\xff\xff\xff\xff\xff\x00\xff\xff", "\xff\xff\xff\xff\xff\xff\x00\x00", "\xff\xff\xff\xff\xff\xff\x00\xff", "\xff\xff\xff\xff\xff\xff\xff\x00", "\xff\xff\xff\xff\xff\xff\xff\xff"]; + protected static $shuffle = [ + "\x00\x00\x00\x00\x00\x00\x00\x00", "\x00\x00\x00\x00\x00\x00\x00\xFF", + "\x00\x00\x00\x00\x00\x00\xFF\x00", "\x00\x00\x00\x00\x00\x00\xFF\xFF", + "\x00\x00\x00\x00\x00\xFF\x00\x00", "\x00\x00\x00\x00\x00\xFF\x00\xFF", + "\x00\x00\x00\x00\x00\xFF\xFF\x00", "\x00\x00\x00\x00\x00\xFF\xFF\xFF", + "\x00\x00\x00\x00\xFF\x00\x00\x00", "\x00\x00\x00\x00\xFF\x00\x00\xFF", + "\x00\x00\x00\x00\xFF\x00\xFF\x00", "\x00\x00\x00\x00\xFF\x00\xFF\xFF", + "\x00\x00\x00\x00\xFF\xFF\x00\x00", "\x00\x00\x00\x00\xFF\xFF\x00\xFF", + "\x00\x00\x00\x00\xFF\xFF\xFF\x00", "\x00\x00\x00\x00\xFF\xFF\xFF\xFF", + "\x00\x00\x00\xFF\x00\x00\x00\x00", "\x00\x00\x00\xFF\x00\x00\x00\xFF", + "\x00\x00\x00\xFF\x00\x00\xFF\x00", "\x00\x00\x00\xFF\x00\x00\xFF\xFF", + "\x00\x00\x00\xFF\x00\xFF\x00\x00", "\x00\x00\x00\xFF\x00\xFF\x00\xFF", + "\x00\x00\x00\xFF\x00\xFF\xFF\x00", "\x00\x00\x00\xFF\x00\xFF\xFF\xFF", + "\x00\x00\x00\xFF\xFF\x00\x00\x00", "\x00\x00\x00\xFF\xFF\x00\x00\xFF", + "\x00\x00\x00\xFF\xFF\x00\xFF\x00", "\x00\x00\x00\xFF\xFF\x00\xFF\xFF", + "\x00\x00\x00\xFF\xFF\xFF\x00\x00", "\x00\x00\x00\xFF\xFF\xFF\x00\xFF", + "\x00\x00\x00\xFF\xFF\xFF\xFF\x00", "\x00\x00\x00\xFF\xFF\xFF\xFF\xFF", + "\x00\x00\xFF\x00\x00\x00\x00\x00", "\x00\x00\xFF\x00\x00\x00\x00\xFF", + "\x00\x00\xFF\x00\x00\x00\xFF\x00", "\x00\x00\xFF\x00\x00\x00\xFF\xFF", + "\x00\x00\xFF\x00\x00\xFF\x00\x00", "\x00\x00\xFF\x00\x00\xFF\x00\xFF", + "\x00\x00\xFF\x00\x00\xFF\xFF\x00", "\x00\x00\xFF\x00\x00\xFF\xFF\xFF", + "\x00\x00\xFF\x00\xFF\x00\x00\x00", "\x00\x00\xFF\x00\xFF\x00\x00\xFF", + "\x00\x00\xFF\x00\xFF\x00\xFF\x00", "\x00\x00\xFF\x00\xFF\x00\xFF\xFF", + "\x00\x00\xFF\x00\xFF\xFF\x00\x00", "\x00\x00\xFF\x00\xFF\xFF\x00\xFF", + "\x00\x00\xFF\x00\xFF\xFF\xFF\x00", "\x00\x00\xFF\x00\xFF\xFF\xFF\xFF", + "\x00\x00\xFF\xFF\x00\x00\x00\x00", "\x00\x00\xFF\xFF\x00\x00\x00\xFF", + "\x00\x00\xFF\xFF\x00\x00\xFF\x00", "\x00\x00\xFF\xFF\x00\x00\xFF\xFF", + "\x00\x00\xFF\xFF\x00\xFF\x00\x00", "\x00\x00\xFF\xFF\x00\xFF\x00\xFF", + "\x00\x00\xFF\xFF\x00\xFF\xFF\x00", "\x00\x00\xFF\xFF\x00\xFF\xFF\xFF", + "\x00\x00\xFF\xFF\xFF\x00\x00\x00", "\x00\x00\xFF\xFF\xFF\x00\x00\xFF", + "\x00\x00\xFF\xFF\xFF\x00\xFF\x00", "\x00\x00\xFF\xFF\xFF\x00\xFF\xFF", + "\x00\x00\xFF\xFF\xFF\xFF\x00\x00", "\x00\x00\xFF\xFF\xFF\xFF\x00\xFF", + "\x00\x00\xFF\xFF\xFF\xFF\xFF\x00", "\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF", + "\x00\xFF\x00\x00\x00\x00\x00\x00", "\x00\xFF\x00\x00\x00\x00\x00\xFF", + "\x00\xFF\x00\x00\x00\x00\xFF\x00", "\x00\xFF\x00\x00\x00\x00\xFF\xFF", + "\x00\xFF\x00\x00\x00\xFF\x00\x00", "\x00\xFF\x00\x00\x00\xFF\x00\xFF", + "\x00\xFF\x00\x00\x00\xFF\xFF\x00", "\x00\xFF\x00\x00\x00\xFF\xFF\xFF", + "\x00\xFF\x00\x00\xFF\x00\x00\x00", "\x00\xFF\x00\x00\xFF\x00\x00\xFF", + "\x00\xFF\x00\x00\xFF\x00\xFF\x00", "\x00\xFF\x00\x00\xFF\x00\xFF\xFF", + "\x00\xFF\x00\x00\xFF\xFF\x00\x00", "\x00\xFF\x00\x00\xFF\xFF\x00\xFF", + "\x00\xFF\x00\x00\xFF\xFF\xFF\x00", "\x00\xFF\x00\x00\xFF\xFF\xFF\xFF", + "\x00\xFF\x00\xFF\x00\x00\x00\x00", "\x00\xFF\x00\xFF\x00\x00\x00\xFF", + "\x00\xFF\x00\xFF\x00\x00\xFF\x00", "\x00\xFF\x00\xFF\x00\x00\xFF\xFF", + "\x00\xFF\x00\xFF\x00\xFF\x00\x00", "\x00\xFF\x00\xFF\x00\xFF\x00\xFF", + "\x00\xFF\x00\xFF\x00\xFF\xFF\x00", "\x00\xFF\x00\xFF\x00\xFF\xFF\xFF", + "\x00\xFF\x00\xFF\xFF\x00\x00\x00", "\x00\xFF\x00\xFF\xFF\x00\x00\xFF", + "\x00\xFF\x00\xFF\xFF\x00\xFF\x00", "\x00\xFF\x00\xFF\xFF\x00\xFF\xFF", + "\x00\xFF\x00\xFF\xFF\xFF\x00\x00", "\x00\xFF\x00\xFF\xFF\xFF\x00\xFF", + "\x00\xFF\x00\xFF\xFF\xFF\xFF\x00", "\x00\xFF\x00\xFF\xFF\xFF\xFF\xFF", + "\x00\xFF\xFF\x00\x00\x00\x00\x00", "\x00\xFF\xFF\x00\x00\x00\x00\xFF", + "\x00\xFF\xFF\x00\x00\x00\xFF\x00", "\x00\xFF\xFF\x00\x00\x00\xFF\xFF", + "\x00\xFF\xFF\x00\x00\xFF\x00\x00", "\x00\xFF\xFF\x00\x00\xFF\x00\xFF", + "\x00\xFF\xFF\x00\x00\xFF\xFF\x00", "\x00\xFF\xFF\x00\x00\xFF\xFF\xFF", + "\x00\xFF\xFF\x00\xFF\x00\x00\x00", "\x00\xFF\xFF\x00\xFF\x00\x00\xFF", + "\x00\xFF\xFF\x00\xFF\x00\xFF\x00", "\x00\xFF\xFF\x00\xFF\x00\xFF\xFF", + "\x00\xFF\xFF\x00\xFF\xFF\x00\x00", "\x00\xFF\xFF\x00\xFF\xFF\x00\xFF", + "\x00\xFF\xFF\x00\xFF\xFF\xFF\x00", "\x00\xFF\xFF\x00\xFF\xFF\xFF\xFF", + "\x00\xFF\xFF\xFF\x00\x00\x00\x00", "\x00\xFF\xFF\xFF\x00\x00\x00\xFF", + "\x00\xFF\xFF\xFF\x00\x00\xFF\x00", "\x00\xFF\xFF\xFF\x00\x00\xFF\xFF", + "\x00\xFF\xFF\xFF\x00\xFF\x00\x00", "\x00\xFF\xFF\xFF\x00\xFF\x00\xFF", + "\x00\xFF\xFF\xFF\x00\xFF\xFF\x00", "\x00\xFF\xFF\xFF\x00\xFF\xFF\xFF", + "\x00\xFF\xFF\xFF\xFF\x00\x00\x00", "\x00\xFF\xFF\xFF\xFF\x00\x00\xFF", + "\x00\xFF\xFF\xFF\xFF\x00\xFF\x00", "\x00\xFF\xFF\xFF\xFF\x00\xFF\xFF", + "\x00\xFF\xFF\xFF\xFF\xFF\x00\x00", "\x00\xFF\xFF\xFF\xFF\xFF\x00\xFF", + "\x00\xFF\xFF\xFF\xFF\xFF\xFF\x00", "\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF", + "\xFF\x00\x00\x00\x00\x00\x00\x00", "\xFF\x00\x00\x00\x00\x00\x00\xFF", + "\xFF\x00\x00\x00\x00\x00\xFF\x00", "\xFF\x00\x00\x00\x00\x00\xFF\xFF", + "\xFF\x00\x00\x00\x00\xFF\x00\x00", "\xFF\x00\x00\x00\x00\xFF\x00\xFF", + "\xFF\x00\x00\x00\x00\xFF\xFF\x00", "\xFF\x00\x00\x00\x00\xFF\xFF\xFF", + "\xFF\x00\x00\x00\xFF\x00\x00\x00", "\xFF\x00\x00\x00\xFF\x00\x00\xFF", + "\xFF\x00\x00\x00\xFF\x00\xFF\x00", "\xFF\x00\x00\x00\xFF\x00\xFF\xFF", + "\xFF\x00\x00\x00\xFF\xFF\x00\x00", "\xFF\x00\x00\x00\xFF\xFF\x00\xFF", + "\xFF\x00\x00\x00\xFF\xFF\xFF\x00", "\xFF\x00\x00\x00\xFF\xFF\xFF\xFF", + "\xFF\x00\x00\xFF\x00\x00\x00\x00", "\xFF\x00\x00\xFF\x00\x00\x00\xFF", + "\xFF\x00\x00\xFF\x00\x00\xFF\x00", "\xFF\x00\x00\xFF\x00\x00\xFF\xFF", + "\xFF\x00\x00\xFF\x00\xFF\x00\x00", "\xFF\x00\x00\xFF\x00\xFF\x00\xFF", + "\xFF\x00\x00\xFF\x00\xFF\xFF\x00", "\xFF\x00\x00\xFF\x00\xFF\xFF\xFF", + "\xFF\x00\x00\xFF\xFF\x00\x00\x00", "\xFF\x00\x00\xFF\xFF\x00\x00\xFF", + "\xFF\x00\x00\xFF\xFF\x00\xFF\x00", "\xFF\x00\x00\xFF\xFF\x00\xFF\xFF", + "\xFF\x00\x00\xFF\xFF\xFF\x00\x00", "\xFF\x00\x00\xFF\xFF\xFF\x00\xFF", + "\xFF\x00\x00\xFF\xFF\xFF\xFF\x00", "\xFF\x00\x00\xFF\xFF\xFF\xFF\xFF", + "\xFF\x00\xFF\x00\x00\x00\x00\x00", "\xFF\x00\xFF\x00\x00\x00\x00\xFF", + "\xFF\x00\xFF\x00\x00\x00\xFF\x00", "\xFF\x00\xFF\x00\x00\x00\xFF\xFF", + "\xFF\x00\xFF\x00\x00\xFF\x00\x00", "\xFF\x00\xFF\x00\x00\xFF\x00\xFF", + "\xFF\x00\xFF\x00\x00\xFF\xFF\x00", "\xFF\x00\xFF\x00\x00\xFF\xFF\xFF", + "\xFF\x00\xFF\x00\xFF\x00\x00\x00", "\xFF\x00\xFF\x00\xFF\x00\x00\xFF", + "\xFF\x00\xFF\x00\xFF\x00\xFF\x00", "\xFF\x00\xFF\x00\xFF\x00\xFF\xFF", + "\xFF\x00\xFF\x00\xFF\xFF\x00\x00", "\xFF\x00\xFF\x00\xFF\xFF\x00\xFF", + "\xFF\x00\xFF\x00\xFF\xFF\xFF\x00", "\xFF\x00\xFF\x00\xFF\xFF\xFF\xFF", + "\xFF\x00\xFF\xFF\x00\x00\x00\x00", "\xFF\x00\xFF\xFF\x00\x00\x00\xFF", + "\xFF\x00\xFF\xFF\x00\x00\xFF\x00", "\xFF\x00\xFF\xFF\x00\x00\xFF\xFF", + "\xFF\x00\xFF\xFF\x00\xFF\x00\x00", "\xFF\x00\xFF\xFF\x00\xFF\x00\xFF", + "\xFF\x00\xFF\xFF\x00\xFF\xFF\x00", "\xFF\x00\xFF\xFF\x00\xFF\xFF\xFF", + "\xFF\x00\xFF\xFF\xFF\x00\x00\x00", "\xFF\x00\xFF\xFF\xFF\x00\x00\xFF", + "\xFF\x00\xFF\xFF\xFF\x00\xFF\x00", "\xFF\x00\xFF\xFF\xFF\x00\xFF\xFF", + "\xFF\x00\xFF\xFF\xFF\xFF\x00\x00", "\xFF\x00\xFF\xFF\xFF\xFF\x00\xFF", + "\xFF\x00\xFF\xFF\xFF\xFF\xFF\x00", "\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF", + "\xFF\xFF\x00\x00\x00\x00\x00\x00", "\xFF\xFF\x00\x00\x00\x00\x00\xFF", + "\xFF\xFF\x00\x00\x00\x00\xFF\x00", "\xFF\xFF\x00\x00\x00\x00\xFF\xFF", + "\xFF\xFF\x00\x00\x00\xFF\x00\x00", "\xFF\xFF\x00\x00\x00\xFF\x00\xFF", + "\xFF\xFF\x00\x00\x00\xFF\xFF\x00", "\xFF\xFF\x00\x00\x00\xFF\xFF\xFF", + "\xFF\xFF\x00\x00\xFF\x00\x00\x00", "\xFF\xFF\x00\x00\xFF\x00\x00\xFF", + "\xFF\xFF\x00\x00\xFF\x00\xFF\x00", "\xFF\xFF\x00\x00\xFF\x00\xFF\xFF", + "\xFF\xFF\x00\x00\xFF\xFF\x00\x00", "\xFF\xFF\x00\x00\xFF\xFF\x00\xFF", + "\xFF\xFF\x00\x00\xFF\xFF\xFF\x00", "\xFF\xFF\x00\x00\xFF\xFF\xFF\xFF", + "\xFF\xFF\x00\xFF\x00\x00\x00\x00", "\xFF\xFF\x00\xFF\x00\x00\x00\xFF", + "\xFF\xFF\x00\xFF\x00\x00\xFF\x00", "\xFF\xFF\x00\xFF\x00\x00\xFF\xFF", + "\xFF\xFF\x00\xFF\x00\xFF\x00\x00", "\xFF\xFF\x00\xFF\x00\xFF\x00\xFF", + "\xFF\xFF\x00\xFF\x00\xFF\xFF\x00", "\xFF\xFF\x00\xFF\x00\xFF\xFF\xFF", + "\xFF\xFF\x00\xFF\xFF\x00\x00\x00", "\xFF\xFF\x00\xFF\xFF\x00\x00\xFF", + "\xFF\xFF\x00\xFF\xFF\x00\xFF\x00", "\xFF\xFF\x00\xFF\xFF\x00\xFF\xFF", + "\xFF\xFF\x00\xFF\xFF\xFF\x00\x00", "\xFF\xFF\x00\xFF\xFF\xFF\x00\xFF", + "\xFF\xFF\x00\xFF\xFF\xFF\xFF\x00", "\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF", + "\xFF\xFF\xFF\x00\x00\x00\x00\x00", "\xFF\xFF\xFF\x00\x00\x00\x00\xFF", + "\xFF\xFF\xFF\x00\x00\x00\xFF\x00", "\xFF\xFF\xFF\x00\x00\x00\xFF\xFF", + "\xFF\xFF\xFF\x00\x00\xFF\x00\x00", "\xFF\xFF\xFF\x00\x00\xFF\x00\xFF", + "\xFF\xFF\xFF\x00\x00\xFF\xFF\x00", "\xFF\xFF\xFF\x00\x00\xFF\xFF\xFF", + "\xFF\xFF\xFF\x00\xFF\x00\x00\x00", "\xFF\xFF\xFF\x00\xFF\x00\x00\xFF", + "\xFF\xFF\xFF\x00\xFF\x00\xFF\x00", "\xFF\xFF\xFF\x00\xFF\x00\xFF\xFF", + "\xFF\xFF\xFF\x00\xFF\xFF\x00\x00", "\xFF\xFF\xFF\x00\xFF\xFF\x00\xFF", + "\xFF\xFF\xFF\x00\xFF\xFF\xFF\x00", "\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF", + "\xFF\xFF\xFF\xFF\x00\x00\x00\x00", "\xFF\xFF\xFF\xFF\x00\x00\x00\xFF", + "\xFF\xFF\xFF\xFF\x00\x00\xFF\x00", "\xFF\xFF\xFF\xFF\x00\x00\xFF\xFF", + "\xFF\xFF\xFF\xFF\x00\xFF\x00\x00", "\xFF\xFF\xFF\xFF\x00\xFF\x00\xFF", + "\xFF\xFF\xFF\xFF\x00\xFF\xFF\x00", "\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF", + "\xFF\xFF\xFF\xFF\xFF\x00\x00\x00", "\xFF\xFF\xFF\xFF\xFF\x00\x00\xFF", + "\xFF\xFF\xFF\xFF\xFF\x00\xFF\x00", "\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF", + "\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00", "\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF", + "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00", "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" + ]; + /** * IP mapping helper table. * @@ -148,14 +295,82 @@ class DES extends BlockCipher * * @var array */ - protected static $ipmap = [0x0, 0x10, 0x1, 0x11, 0x20, 0x30, 0x21, 0x31, 0x2, 0x12, 0x3, 0x13, 0x22, 0x32, 0x23, 0x33, 0x40, 0x50, 0x41, 0x51, 0x60, 0x70, 0x61, 0x71, 0x42, 0x52, 0x43, 0x53, 0x62, 0x72, 0x63, 0x73, 0x4, 0x14, 0x5, 0x15, 0x24, 0x34, 0x25, 0x35, 0x6, 0x16, 0x7, 0x17, 0x26, 0x36, 0x27, 0x37, 0x44, 0x54, 0x45, 0x55, 0x64, 0x74, 0x65, 0x75, 0x46, 0x56, 0x47, 0x57, 0x66, 0x76, 0x67, 0x77, 0x80, 0x90, 0x81, 0x91, 0xa0, 0xb0, 0xa1, 0xb1, 0x82, 0x92, 0x83, 0x93, 0xa2, 0xb2, 0xa3, 0xb3, 0xc0, 0xd0, 0xc1, 0xd1, 0xe0, 0xf0, 0xe1, 0xf1, 0xc2, 0xd2, 0xc3, 0xd3, 0xe2, 0xf2, 0xe3, 0xf3, 0x84, 0x94, 0x85, 0x95, 0xa4, 0xb4, 0xa5, 0xb5, 0x86, 0x96, 0x87, 0x97, 0xa6, 0xb6, 0xa7, 0xb7, 0xc4, 0xd4, 0xc5, 0xd5, 0xe4, 0xf4, 0xe5, 0xf5, 0xc6, 0xd6, 0xc7, 0xd7, 0xe6, 0xf6, 0xe7, 0xf7, 0x8, 0x18, 0x9, 0x19, 0x28, 0x38, 0x29, 0x39, 0xa, 0x1a, 0xb, 0x1b, 0x2a, 0x3a, 0x2b, 0x3b, 0x48, 0x58, 0x49, 0x59, 0x68, 0x78, 0x69, 0x79, 0x4a, 0x5a, 0x4b, 0x5b, 0x6a, 0x7a, 0x6b, 0x7b, 0xc, 0x1c, 0xd, 0x1d, 0x2c, 0x3c, 0x2d, 0x3d, 0xe, 0x1e, 0xf, 0x1f, 0x2e, 0x3e, 0x2f, 0x3f, 0x4c, 0x5c, 0x4d, 0x5d, 0x6c, 0x7c, 0x6d, 0x7d, 0x4e, 0x5e, 0x4f, 0x5f, 0x6e, 0x7e, 0x6f, 0x7f, 0x88, 0x98, 0x89, 0x99, 0xa8, 0xb8, 0xa9, 0xb9, 0x8a, 0x9a, 0x8b, 0x9b, 0xaa, 0xba, 0xab, 0xbb, 0xc8, 0xd8, 0xc9, 0xd9, 0xe8, 0xf8, 0xe9, 0xf9, 0xca, 0xda, 0xcb, 0xdb, 0xea, 0xfa, 0xeb, 0xfb, 0x8c, 0x9c, 0x8d, 0x9d, 0xac, 0xbc, 0xad, 0xbd, 0x8e, 0x9e, 0x8f, 0x9f, 0xae, 0xbe, 0xaf, 0xbf, 0xcc, 0xdc, 0xcd, 0xdd, 0xec, 0xfc, 0xed, 0xfd, 0xce, 0xde, 0xcf, 0xdf, 0xee, 0xfe, 0xef, 0xff]; + protected static $ipmap = [ + 0x00, 0x10, 0x01, 0x11, 0x20, 0x30, 0x21, 0x31, + 0x02, 0x12, 0x03, 0x13, 0x22, 0x32, 0x23, 0x33, + 0x40, 0x50, 0x41, 0x51, 0x60, 0x70, 0x61, 0x71, + 0x42, 0x52, 0x43, 0x53, 0x62, 0x72, 0x63, 0x73, + 0x04, 0x14, 0x05, 0x15, 0x24, 0x34, 0x25, 0x35, + 0x06, 0x16, 0x07, 0x17, 0x26, 0x36, 0x27, 0x37, + 0x44, 0x54, 0x45, 0x55, 0x64, 0x74, 0x65, 0x75, + 0x46, 0x56, 0x47, 0x57, 0x66, 0x76, 0x67, 0x77, + 0x80, 0x90, 0x81, 0x91, 0xA0, 0xB0, 0xA1, 0xB1, + 0x82, 0x92, 0x83, 0x93, 0xA2, 0xB2, 0xA3, 0xB3, + 0xC0, 0xD0, 0xC1, 0xD1, 0xE0, 0xF0, 0xE1, 0xF1, + 0xC2, 0xD2, 0xC3, 0xD3, 0xE2, 0xF2, 0xE3, 0xF3, + 0x84, 0x94, 0x85, 0x95, 0xA4, 0xB4, 0xA5, 0xB5, + 0x86, 0x96, 0x87, 0x97, 0xA6, 0xB6, 0xA7, 0xB7, + 0xC4, 0xD4, 0xC5, 0xD5, 0xE4, 0xF4, 0xE5, 0xF5, + 0xC6, 0xD6, 0xC7, 0xD7, 0xE6, 0xF6, 0xE7, 0xF7, + 0x08, 0x18, 0x09, 0x19, 0x28, 0x38, 0x29, 0x39, + 0x0A, 0x1A, 0x0B, 0x1B, 0x2A, 0x3A, 0x2B, 0x3B, + 0x48, 0x58, 0x49, 0x59, 0x68, 0x78, 0x69, 0x79, + 0x4A, 0x5A, 0x4B, 0x5B, 0x6A, 0x7A, 0x6B, 0x7B, + 0x0C, 0x1C, 0x0D, 0x1D, 0x2C, 0x3C, 0x2D, 0x3D, + 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, + 0x4C, 0x5C, 0x4D, 0x5D, 0x6C, 0x7C, 0x6D, 0x7D, + 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, + 0x88, 0x98, 0x89, 0x99, 0xA8, 0xB8, 0xA9, 0xB9, + 0x8A, 0x9A, 0x8B, 0x9B, 0xAA, 0xBA, 0xAB, 0xBB, + 0xC8, 0xD8, 0xC9, 0xD9, 0xE8, 0xF8, 0xE9, 0xF9, + 0xCA, 0xDA, 0xCB, 0xDB, 0xEA, 0xFA, 0xEB, 0xFB, + 0x8C, 0x9C, 0x8D, 0x9D, 0xAC, 0xBC, 0xAD, 0xBD, + 0x8E, 0x9E, 0x8F, 0x9F, 0xAE, 0xBE, 0xAF, 0xBF, + 0xCC, 0xDC, 0xCD, 0xDD, 0xEC, 0xFC, 0xED, 0xFD, + 0xCE, 0xDE, 0xCF, 0xDF, 0xEE, 0xFE, 0xEF, 0xFF + ]; + /** * Inverse IP mapping helper table. * Indexing this table with a byte value reverses the bit order. * * @var array */ - protected static $invipmap = [0x0, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0, 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0, 0x8, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8, 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8, 0x4, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4, 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4, 0xc, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec, 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc, 0x2, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2, 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2, 0xa, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea, 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa, 0x6, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6, 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6, 0xe, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee, 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe, 0x1, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1, 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1, 0x9, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9, 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9, 0x5, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5, 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5, 0xd, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed, 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd, 0x3, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3, 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3, 0xb, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb, 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb, 0x7, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7, 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7, 0xf, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef, 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff]; + protected static $invipmap = [ + 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, + 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0, + 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, + 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8, + 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, + 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4, + 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, + 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC, + 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, + 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2, + 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, + 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA, + 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, + 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6, + 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, + 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE, + 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, + 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1, + 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, + 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9, + 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, + 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5, + 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, + 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD, + 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, + 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3, + 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, + 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB, + 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, + 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7, + 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, + 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF + ]; + /** * Pre-permuted S-box1 * @@ -164,49 +379,193 @@ class DES extends BlockCipher * * @var array */ - protected static $sbox1 = [0x808200, 0x0, 0x8000, 0x808202, 0x808002, 0x8202, 0x2, 0x8000, 0x200, 0x808200, 0x808202, 0x200, 0x800202, 0x808002, 0x800000, 0x2, 0x202, 0x800200, 0x800200, 0x8200, 0x8200, 0x808000, 0x808000, 0x800202, 0x8002, 0x800002, 0x800002, 0x8002, 0x0, 0x202, 0x8202, 0x800000, 0x8000, 0x808202, 0x2, 0x808000, 0x808200, 0x800000, 0x800000, 0x200, 0x808002, 0x8000, 0x8200, 0x800002, 0x200, 0x2, 0x800202, 0x8202, 0x808202, 0x8002, 0x808000, 0x800202, 0x800002, 0x202, 0x8202, 0x808200, 0x202, 0x800200, 0x800200, 0x0, 0x8002, 0x8200, 0x0, 0x808002]; + protected static $sbox1 = [ + 0x00808200, 0x00000000, 0x00008000, 0x00808202, + 0x00808002, 0x00008202, 0x00000002, 0x00008000, + 0x00000200, 0x00808200, 0x00808202, 0x00000200, + 0x00800202, 0x00808002, 0x00800000, 0x00000002, + 0x00000202, 0x00800200, 0x00800200, 0x00008200, + 0x00008200, 0x00808000, 0x00808000, 0x00800202, + 0x00008002, 0x00800002, 0x00800002, 0x00008002, + 0x00000000, 0x00000202, 0x00008202, 0x00800000, + 0x00008000, 0x00808202, 0x00000002, 0x00808000, + 0x00808200, 0x00800000, 0x00800000, 0x00000200, + 0x00808002, 0x00008000, 0x00008200, 0x00800002, + 0x00000200, 0x00000002, 0x00800202, 0x00008202, + 0x00808202, 0x00008002, 0x00808000, 0x00800202, + 0x00800002, 0x00000202, 0x00008202, 0x00808200, + 0x00000202, 0x00800200, 0x00800200, 0x00000000, + 0x00008002, 0x00008200, 0x00000000, 0x00808002 + ]; + /** * Pre-permuted S-box2 * * @var array */ - protected static $sbox2 = [0x40084010, 0x40004000, 0x4000, 0x84010, 0x80000, 0x10, 0x40080010, 0x40004010, 0x40000010, 0x40084010, 0x40084000, 0x40000000, 0x40004000, 0x80000, 0x10, 0x40080010, 0x84000, 0x80010, 0x40004010, 0x0, 0x40000000, 0x4000, 0x84010, 0x40080000, 0x80010, 0x40000010, 0x0, 0x84000, 0x4010, 0x40084000, 0x40080000, 0x4010, 0x0, 0x84010, 0x40080010, 0x80000, 0x40004010, 0x40080000, 0x40084000, 0x4000, 0x40080000, 0x40004000, 0x10, 0x40084010, 0x84010, 0x10, 0x4000, 0x40000000, 0x4010, 0x40084000, 0x80000, 0x40000010, 0x80010, 0x40004010, 0x40000010, 0x80010, 0x84000, 0x0, 0x40004000, 0x4010, 0x40000000, 0x40080010, 0x40084010, 0x84000]; + protected static $sbox2 = [ + 0x40084010, 0x40004000, 0x00004000, 0x00084010, + 0x00080000, 0x00000010, 0x40080010, 0x40004010, + 0x40000010, 0x40084010, 0x40084000, 0x40000000, + 0x40004000, 0x00080000, 0x00000010, 0x40080010, + 0x00084000, 0x00080010, 0x40004010, 0x00000000, + 0x40000000, 0x00004000, 0x00084010, 0x40080000, + 0x00080010, 0x40000010, 0x00000000, 0x00084000, + 0x00004010, 0x40084000, 0x40080000, 0x00004010, + 0x00000000, 0x00084010, 0x40080010, 0x00080000, + 0x40004010, 0x40080000, 0x40084000, 0x00004000, + 0x40080000, 0x40004000, 0x00000010, 0x40084010, + 0x00084010, 0x00000010, 0x00004000, 0x40000000, + 0x00004010, 0x40084000, 0x00080000, 0x40000010, + 0x00080010, 0x40004010, 0x40000010, 0x00080010, + 0x00084000, 0x00000000, 0x40004000, 0x00004010, + 0x40000000, 0x40080010, 0x40084010, 0x00084000 + ]; + /** * Pre-permuted S-box3 * * @var array */ - protected static $sbox3 = [0x104, 0x4010100, 0x0, 0x4010004, 0x4000100, 0x0, 0x10104, 0x4000100, 0x10004, 0x4000004, 0x4000004, 0x10000, 0x4010104, 0x10004, 0x4010000, 0x104, 0x4000000, 0x4, 0x4010100, 0x100, 0x10100, 0x4010000, 0x4010004, 0x10104, 0x4000104, 0x10100, 0x10000, 0x4000104, 0x4, 0x4010104, 0x100, 0x4000000, 0x4010100, 0x4000000, 0x10004, 0x104, 0x10000, 0x4010100, 0x4000100, 0x0, 0x100, 0x10004, 0x4010104, 0x4000100, 0x4000004, 0x100, 0x0, 0x4010004, 0x4000104, 0x10000, 0x4000000, 0x4010104, 0x4, 0x10104, 0x10100, 0x4000004, 0x4010000, 0x4000104, 0x104, 0x4010000, 0x10104, 0x4, 0x4010004, 0x10100]; + protected static $sbox3 = [ + 0x00000104, 0x04010100, 0x00000000, 0x04010004, + 0x04000100, 0x00000000, 0x00010104, 0x04000100, + 0x00010004, 0x04000004, 0x04000004, 0x00010000, + 0x04010104, 0x00010004, 0x04010000, 0x00000104, + 0x04000000, 0x00000004, 0x04010100, 0x00000100, + 0x00010100, 0x04010000, 0x04010004, 0x00010104, + 0x04000104, 0x00010100, 0x00010000, 0x04000104, + 0x00000004, 0x04010104, 0x00000100, 0x04000000, + 0x04010100, 0x04000000, 0x00010004, 0x00000104, + 0x00010000, 0x04010100, 0x04000100, 0x00000000, + 0x00000100, 0x00010004, 0x04010104, 0x04000100, + 0x04000004, 0x00000100, 0x00000000, 0x04010004, + 0x04000104, 0x00010000, 0x04000000, 0x04010104, + 0x00000004, 0x00010104, 0x00010100, 0x04000004, + 0x04010000, 0x04000104, 0x00000104, 0x04010000, + 0x00010104, 0x00000004, 0x04010004, 0x00010100 + ]; + /** * Pre-permuted S-box4 * * @var array */ - protected static $sbox4 = [0x80401000, 0x80001040, 0x80001040, 0x40, 0x401040, 0x80400040, 0x80400000, 0x80001000, 0x0, 0x401000, 0x401000, 0x80401040, 0x80000040, 0x0, 0x400040, 0x80400000, 0x80000000, 0x1000, 0x400000, 0x80401000, 0x40, 0x400000, 0x80001000, 0x1040, 0x80400040, 0x80000000, 0x1040, 0x400040, 0x1000, 0x401040, 0x80401040, 0x80000040, 0x400040, 0x80400000, 0x401000, 0x80401040, 0x80000040, 0x0, 0x0, 0x401000, 0x1040, 0x400040, 0x80400040, 0x80000000, 0x80401000, 0x80001040, 0x80001040, 0x40, 0x80401040, 0x80000040, 0x80000000, 0x1000, 0x80400000, 0x80001000, 0x401040, 0x80400040, 0x80001000, 0x1040, 0x400000, 0x80401000, 0x40, 0x400000, 0x1000, 0x401040]; + protected static $sbox4 = [ + 0x80401000, 0x80001040, 0x80001040, 0x00000040, + 0x00401040, 0x80400040, 0x80400000, 0x80001000, + 0x00000000, 0x00401000, 0x00401000, 0x80401040, + 0x80000040, 0x00000000, 0x00400040, 0x80400000, + 0x80000000, 0x00001000, 0x00400000, 0x80401000, + 0x00000040, 0x00400000, 0x80001000, 0x00001040, + 0x80400040, 0x80000000, 0x00001040, 0x00400040, + 0x00001000, 0x00401040, 0x80401040, 0x80000040, + 0x00400040, 0x80400000, 0x00401000, 0x80401040, + 0x80000040, 0x00000000, 0x00000000, 0x00401000, + 0x00001040, 0x00400040, 0x80400040, 0x80000000, + 0x80401000, 0x80001040, 0x80001040, 0x00000040, + 0x80401040, 0x80000040, 0x80000000, 0x00001000, + 0x80400000, 0x80001000, 0x00401040, 0x80400040, + 0x80001000, 0x00001040, 0x00400000, 0x80401000, + 0x00000040, 0x00400000, 0x00001000, 0x00401040 + ]; + /** * Pre-permuted S-box5 * * @var array */ - protected static $sbox5 = [0x80, 0x1040080, 0x1040000, 0x21000080, 0x40000, 0x80, 0x20000000, 0x1040000, 0x20040080, 0x40000, 0x1000080, 0x20040080, 0x21000080, 0x21040000, 0x40080, 0x20000000, 0x1000000, 0x20040000, 0x20040000, 0x0, 0x20000080, 0x21040080, 0x21040080, 0x1000080, 0x21040000, 0x20000080, 0x0, 0x21000000, 0x1040080, 0x1000000, 0x21000000, 0x40080, 0x40000, 0x21000080, 0x80, 0x1000000, 0x20000000, 0x1040000, 0x21000080, 0x20040080, 0x1000080, 0x20000000, 0x21040000, 0x1040080, 0x20040080, 0x80, 0x1000000, 0x21040000, 0x21040080, 0x40080, 0x21000000, 0x21040080, 0x1040000, 0x0, 0x20040000, 0x21000000, 0x40080, 0x1000080, 0x20000080, 0x40000, 0x0, 0x20040000, 0x1040080, 0x20000080]; + protected static $sbox5 = [ + 0x00000080, 0x01040080, 0x01040000, 0x21000080, + 0x00040000, 0x00000080, 0x20000000, 0x01040000, + 0x20040080, 0x00040000, 0x01000080, 0x20040080, + 0x21000080, 0x21040000, 0x00040080, 0x20000000, + 0x01000000, 0x20040000, 0x20040000, 0x00000000, + 0x20000080, 0x21040080, 0x21040080, 0x01000080, + 0x21040000, 0x20000080, 0x00000000, 0x21000000, + 0x01040080, 0x01000000, 0x21000000, 0x00040080, + 0x00040000, 0x21000080, 0x00000080, 0x01000000, + 0x20000000, 0x01040000, 0x21000080, 0x20040080, + 0x01000080, 0x20000000, 0x21040000, 0x01040080, + 0x20040080, 0x00000080, 0x01000000, 0x21040000, + 0x21040080, 0x00040080, 0x21000000, 0x21040080, + 0x01040000, 0x00000000, 0x20040000, 0x21000000, + 0x00040080, 0x01000080, 0x20000080, 0x00040000, + 0x00000000, 0x20040000, 0x01040080, 0x20000080 + ]; + /** * Pre-permuted S-box6 * * @var array */ - protected static $sbox6 = [0x10000008, 0x10200000, 0x2000, 0x10202008, 0x10200000, 0x8, 0x10202008, 0x200000, 0x10002000, 0x202008, 0x200000, 0x10000008, 0x200008, 0x10002000, 0x10000000, 0x2008, 0x0, 0x200008, 0x10002008, 0x2000, 0x202000, 0x10002008, 0x8, 0x10200008, 0x10200008, 0x0, 0x202008, 0x10202000, 0x2008, 0x202000, 0x10202000, 0x10000000, 0x10002000, 0x8, 0x10200008, 0x202000, 0x10202008, 0x200000, 0x2008, 0x10000008, 0x200000, 0x10002000, 0x10000000, 0x2008, 0x10000008, 0x10202008, 0x202000, 0x10200000, 0x202008, 0x10202000, 0x0, 0x10200008, 0x8, 0x2000, 0x10200000, 0x202008, 0x2000, 0x200008, 0x10002008, 0x0, 0x10202000, 0x10000000, 0x200008, 0x10002008]; + protected static $sbox6 = [ + 0x10000008, 0x10200000, 0x00002000, 0x10202008, + 0x10200000, 0x00000008, 0x10202008, 0x00200000, + 0x10002000, 0x00202008, 0x00200000, 0x10000008, + 0x00200008, 0x10002000, 0x10000000, 0x00002008, + 0x00000000, 0x00200008, 0x10002008, 0x00002000, + 0x00202000, 0x10002008, 0x00000008, 0x10200008, + 0x10200008, 0x00000000, 0x00202008, 0x10202000, + 0x00002008, 0x00202000, 0x10202000, 0x10000000, + 0x10002000, 0x00000008, 0x10200008, 0x00202000, + 0x10202008, 0x00200000, 0x00002008, 0x10000008, + 0x00200000, 0x10002000, 0x10000000, 0x00002008, + 0x10000008, 0x10202008, 0x00202000, 0x10200000, + 0x00202008, 0x10202000, 0x00000000, 0x10200008, + 0x00000008, 0x00002000, 0x10200000, 0x00202008, + 0x00002000, 0x00200008, 0x10002008, 0x00000000, + 0x10202000, 0x10000000, 0x00200008, 0x10002008 + ]; + /** * Pre-permuted S-box7 * * @var array */ - protected static $sbox7 = [0x100000, 0x2100001, 0x2000401, 0x0, 0x400, 0x2000401, 0x100401, 0x2100400, 0x2100401, 0x100000, 0x0, 0x2000001, 0x1, 0x2000000, 0x2100001, 0x401, 0x2000400, 0x100401, 0x100001, 0x2000400, 0x2000001, 0x2100000, 0x2100400, 0x100001, 0x2100000, 0x400, 0x401, 0x2100401, 0x100400, 0x1, 0x2000000, 0x100400, 0x2000000, 0x100400, 0x100000, 0x2000401, 0x2000401, 0x2100001, 0x2100001, 0x1, 0x100001, 0x2000000, 0x2000400, 0x100000, 0x2100400, 0x401, 0x100401, 0x2100400, 0x401, 0x2000001, 0x2100401, 0x2100000, 0x100400, 0x0, 0x1, 0x2100401, 0x0, 0x100401, 0x2100000, 0x400, 0x2000001, 0x2000400, 0x400, 0x100001]; + protected static $sbox7 = [ + 0x00100000, 0x02100001, 0x02000401, 0x00000000, + 0x00000400, 0x02000401, 0x00100401, 0x02100400, + 0x02100401, 0x00100000, 0x00000000, 0x02000001, + 0x00000001, 0x02000000, 0x02100001, 0x00000401, + 0x02000400, 0x00100401, 0x00100001, 0x02000400, + 0x02000001, 0x02100000, 0x02100400, 0x00100001, + 0x02100000, 0x00000400, 0x00000401, 0x02100401, + 0x00100400, 0x00000001, 0x02000000, 0x00100400, + 0x02000000, 0x00100400, 0x00100000, 0x02000401, + 0x02000401, 0x02100001, 0x02100001, 0x00000001, + 0x00100001, 0x02000000, 0x02000400, 0x00100000, + 0x02100400, 0x00000401, 0x00100401, 0x02100400, + 0x00000401, 0x02000001, 0x02100401, 0x02100000, + 0x00100400, 0x00000000, 0x00000001, 0x02100401, + 0x00000000, 0x00100401, 0x02100000, 0x00000400, + 0x02000001, 0x02000400, 0x00000400, 0x00100001 + ]; + /** * Pre-permuted S-box8 * * @var array */ - protected static $sbox8 = [0x8000820, 0x800, 0x20000, 0x8020820, 0x8000000, 0x8000820, 0x20, 0x8000000, 0x20020, 0x8020000, 0x8020820, 0x20800, 0x8020800, 0x20820, 0x800, 0x20, 0x8020000, 0x8000020, 0x8000800, 0x820, 0x20800, 0x20020, 0x8020020, 0x8020800, 0x820, 0x0, 0x0, 0x8020020, 0x8000020, 0x8000800, 0x20820, 0x20000, 0x20820, 0x20000, 0x8020800, 0x800, 0x20, 0x8020020, 0x800, 0x20820, 0x8000800, 0x20, 0x8000020, 0x8020000, 0x8020020, 0x8000000, 0x20000, 0x8000820, 0x0, 0x8020820, 0x20020, 0x8000020, 0x8020000, 0x8000800, 0x8000820, 0x0, 0x8020820, 0x20800, 0x20800, 0x820, 0x820, 0x20020, 0x8000000, 0x8020800]; + protected static $sbox8 = [ + 0x08000820, 0x00000800, 0x00020000, 0x08020820, + 0x08000000, 0x08000820, 0x00000020, 0x08000000, + 0x00020020, 0x08020000, 0x08020820, 0x00020800, + 0x08020800, 0x00020820, 0x00000800, 0x00000020, + 0x08020000, 0x08000020, 0x08000800, 0x00000820, + 0x00020800, 0x00020020, 0x08020020, 0x08020800, + 0x00000820, 0x00000000, 0x00000000, 0x08020020, + 0x08000020, 0x08000800, 0x00020820, 0x00020000, + 0x00020820, 0x00020000, 0x08020800, 0x00000800, + 0x00000020, 0x08020020, 0x00000800, 0x00020820, + 0x08000800, 0x00000020, 0x08000020, 0x08020000, + 0x08020020, 0x08000000, 0x00020000, 0x08000820, + 0x00000000, 0x08020820, 0x00020020, 0x08000020, + 0x08020000, 0x08000800, 0x08000820, 0x00000000, + 0x08020820, 0x00020800, 0x00020800, 0x00000820, + 0x00000820, 0x00020020, 0x08000000, 0x08020800 + ]; + /** * Default Constructor. * @@ -216,10 +575,12 @@ class DES extends BlockCipher public function __construct($mode) { parent::__construct($mode); + if ($this->mode == self::MODE_STREAM) { throw new BadModeException('Block ciphers cannot be ran in stream mode'); } } + /** * Test for engine validity * @@ -236,15 +597,17 @@ protected function isValidEngineHelper($engine) // quoting https://www.openssl.org/news/openssl-3.0-notes.html, OpenSSL 3.0.1 // "Moved all variations of the EVP ciphers CAST5, BF, IDEA, SEED, RC2, RC4, RC5, and DES to the legacy provider" // in theory openssl_get_cipher_methods() should catch this but, on GitHub Actions, at least, it does not - if (\defined('OPENSSL_VERSION_TEXT') && \version_compare(\preg_replace('#OpenSSL (\\d+\\.\\d+\\.\\d+) .*#', '$1', \OPENSSL_VERSION_TEXT), '3.0.1', '>=')) { - return \false; + if (defined('OPENSSL_VERSION_TEXT') && version_compare(preg_replace('#OpenSSL (\d+\.\d+\.\d+) .*#', '$1', OPENSSL_VERSION_TEXT), '3.0.1', '>=')) { + return false; } $this->cipher_name_openssl_ecb = 'des-ecb'; $this->cipher_name_openssl = 'des-' . $this->openssl_translate_mode(); } } + return parent::isValidEngineHelper($engine); } + /** * Sets the key. * @@ -257,12 +620,14 @@ protected function isValidEngineHelper($engine) */ public function setKey($key) { - if (!$this instanceof TripleDES && \strlen($key) != 8) { - throw new \LengthException('Key of size ' . \strlen($key) . ' not supported by this algorithm. Only keys of size 8 are supported'); + if (!($this instanceof TripleDES) && strlen($key) != 8) { + throw new \LengthException('Key of size ' . strlen($key) . ' not supported by this algorithm. Only keys of size 8 are supported'); } + // Sets the key parent::setKey($key); } + /** * Encrypts a block * @@ -276,6 +641,7 @@ protected function encryptBlock($in) { return $this->processBlock($in, self::ENCRYPT); } + /** * Decrypts a block * @@ -289,6 +655,7 @@ protected function decryptBlock($in) { return $this->processBlock($in, self::DECRYPT); } + /** * Encrypts or decrypts a 64-bit block * @@ -306,51 +673,77 @@ private function processBlock($block, $mode) { static $sbox1, $sbox2, $sbox3, $sbox4, $sbox5, $sbox6, $sbox7, $sbox8, $shuffleip, $shuffleinvip; if (!$sbox1) { - $sbox1 = \array_map('intval', self::$sbox1); - $sbox2 = \array_map('intval', self::$sbox2); - $sbox3 = \array_map('intval', self::$sbox3); - $sbox4 = \array_map('intval', self::$sbox4); - $sbox5 = \array_map('intval', self::$sbox5); - $sbox6 = \array_map('intval', self::$sbox6); - $sbox7 = \array_map('intval', self::$sbox7); - $sbox8 = \array_map('intval', self::$sbox8); + $sbox1 = array_map('intval', self::$sbox1); + $sbox2 = array_map('intval', self::$sbox2); + $sbox3 = array_map('intval', self::$sbox3); + $sbox4 = array_map('intval', self::$sbox4); + $sbox5 = array_map('intval', self::$sbox5); + $sbox6 = array_map('intval', self::$sbox6); + $sbox7 = array_map('intval', self::$sbox7); + $sbox8 = array_map('intval', self::$sbox8); /* Merge $shuffle with $[inv]ipmap */ for ($i = 0; $i < 256; ++$i) { - $shuffleip[] = self::$shuffle[self::$ipmap[$i]]; - $shuffleinvip[] = self::$shuffle[self::$invipmap[$i]]; + $shuffleip[] = self::$shuffle[self::$ipmap[$i]]; + $shuffleinvip[] = self::$shuffle[self::$invipmap[$i]]; } } - $keys = $this->keys[$mode]; - $ki = -1; + + $keys = $this->keys[$mode]; + $ki = -1; + // Do the initial IP permutation. - $t = \unpack('Nl/Nr', $block); + $t = unpack('Nl/Nr', $block); list($l, $r) = [$t['l'], $t['r']]; - $block = $shuffleip[$r & 0xff] & "\x80\x80\x80\x80\x80\x80\x80\x80" | $shuffleip[$r >> 8 & 0xff] & "@@@@@@@@" | $shuffleip[$r >> 16 & 0xff] & " " | $shuffleip[$r >> 24 & 0xff] & "\x10\x10\x10\x10\x10\x10\x10\x10" | $shuffleip[$l & 0xff] & "\x08\x08\x08\x08\x08\x08\x08\x08" | $shuffleip[$l >> 8 & 0xff] & "\x04\x04\x04\x04\x04\x04\x04\x04" | $shuffleip[$l >> 16 & 0xff] & "\x02\x02\x02\x02\x02\x02\x02\x02" | $shuffleip[$l >> 24 & 0xff] & "\x01\x01\x01\x01\x01\x01\x01\x01"; + $block = ($shuffleip[ $r & 0xFF] & "\x80\x80\x80\x80\x80\x80\x80\x80") | + ($shuffleip[($r >> 8) & 0xFF] & "\x40\x40\x40\x40\x40\x40\x40\x40") | + ($shuffleip[($r >> 16) & 0xFF] & "\x20\x20\x20\x20\x20\x20\x20\x20") | + ($shuffleip[($r >> 24) & 0xFF] & "\x10\x10\x10\x10\x10\x10\x10\x10") | + ($shuffleip[ $l & 0xFF] & "\x08\x08\x08\x08\x08\x08\x08\x08") | + ($shuffleip[($l >> 8) & 0xFF] & "\x04\x04\x04\x04\x04\x04\x04\x04") | + ($shuffleip[($l >> 16) & 0xFF] & "\x02\x02\x02\x02\x02\x02\x02\x02") | + ($shuffleip[($l >> 24) & 0xFF] & "\x01\x01\x01\x01\x01\x01\x01\x01"); + // Extract L0 and R0. - $t = \unpack('Nl/Nr', $block); + $t = unpack('Nl/Nr', $block); list($l, $r) = [$t['l'], $t['r']]; + for ($des_round = 0; $des_round < $this->des_rounds; ++$des_round) { // Perform the 16 steps. for ($i = 0; $i < 16; $i++) { // start of "the Feistel (F) function" - see the following URL: // http://en.wikipedia.org/wiki/Image:Data_Encryption_Standard_InfoBox_Diagram.png // Merge key schedule. - $b1 = $r >> 3 & 0x1fffffff ^ $r << 29 ^ $keys[++$ki]; - $b2 = $r >> 31 & 0x1 ^ $r << 1 ^ $keys[++$ki]; + $b1 = (($r >> 3) & 0x1FFFFFFF) ^ ($r << 29) ^ $keys[++$ki]; + $b2 = (($r >> 31) & 0x00000001) ^ ($r << 1) ^ $keys[++$ki]; + // S-box indexing. - $t = $sbox1[$b1 >> 24 & 0x3f] ^ $sbox2[$b2 >> 24 & 0x3f] ^ $sbox3[$b1 >> 16 & 0x3f] ^ $sbox4[$b2 >> 16 & 0x3f] ^ $sbox5[$b1 >> 8 & 0x3f] ^ $sbox6[$b2 >> 8 & 0x3f] ^ $sbox7[$b1 & 0x3f] ^ $sbox8[$b2 & 0x3f] ^ $l; + $t = $sbox1[($b1 >> 24) & 0x3F] ^ $sbox2[($b2 >> 24) & 0x3F] ^ + $sbox3[($b1 >> 16) & 0x3F] ^ $sbox4[($b2 >> 16) & 0x3F] ^ + $sbox5[($b1 >> 8) & 0x3F] ^ $sbox6[($b2 >> 8) & 0x3F] ^ + $sbox7[ $b1 & 0x3F] ^ $sbox8[ $b2 & 0x3F] ^ $l; // end of "the Feistel (F) function" + $l = $r; $r = $t; } + // Last step should not permute L & R. $t = $l; $l = $r; $r = $t; } + // Perform the inverse IP permutation. - return $shuffleinvip[$r >> 24 & 0xff] & "\x80\x80\x80\x80\x80\x80\x80\x80" | $shuffleinvip[$l >> 24 & 0xff] & "@@@@@@@@" | $shuffleinvip[$r >> 16 & 0xff] & " " | $shuffleinvip[$l >> 16 & 0xff] & "\x10\x10\x10\x10\x10\x10\x10\x10" | $shuffleinvip[$r >> 8 & 0xff] & "\x08\x08\x08\x08\x08\x08\x08\x08" | $shuffleinvip[$l >> 8 & 0xff] & "\x04\x04\x04\x04\x04\x04\x04\x04" | $shuffleinvip[$r & 0xff] & "\x02\x02\x02\x02\x02\x02\x02\x02" | $shuffleinvip[$l & 0xff] & "\x01\x01\x01\x01\x01\x01\x01\x01"; + return ($shuffleinvip[($r >> 24) & 0xFF] & "\x80\x80\x80\x80\x80\x80\x80\x80") | + ($shuffleinvip[($l >> 24) & 0xFF] & "\x40\x40\x40\x40\x40\x40\x40\x40") | + ($shuffleinvip[($r >> 16) & 0xFF] & "\x20\x20\x20\x20\x20\x20\x20\x20") | + ($shuffleinvip[($l >> 16) & 0xFF] & "\x10\x10\x10\x10\x10\x10\x10\x10") | + ($shuffleinvip[($r >> 8) & 0xFF] & "\x08\x08\x08\x08\x08\x08\x08\x08") | + ($shuffleinvip[($l >> 8) & 0xFF] & "\x04\x04\x04\x04\x04\x04\x04\x04") | + ($shuffleinvip[ $r & 0xFF] & "\x02\x02\x02\x02\x02\x02\x02\x02") | + ($shuffleinvip[ $l & 0xFF] & "\x01\x01\x01\x01\x01\x01\x01\x01"); } + /** * Creates the key schedule * @@ -363,74 +756,528 @@ protected function setupKey() return; } $this->kl = ['key' => $this->key, 'des_rounds' => $this->des_rounds]; - static $shifts = [ - // number of key bits shifted per round - 1, - 1, - 2, - 2, - 2, - 2, - 2, - 2, - 1, - 2, - 2, - 2, - 2, - 2, - 2, - 1, + + static $shifts = [ // number of key bits shifted per round + 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 + ]; + + static $pc1map = [ + 0x00, 0x00, 0x08, 0x08, 0x04, 0x04, 0x0C, 0x0C, + 0x02, 0x02, 0x0A, 0x0A, 0x06, 0x06, 0x0E, 0x0E, + 0x10, 0x10, 0x18, 0x18, 0x14, 0x14, 0x1C, 0x1C, + 0x12, 0x12, 0x1A, 0x1A, 0x16, 0x16, 0x1E, 0x1E, + 0x20, 0x20, 0x28, 0x28, 0x24, 0x24, 0x2C, 0x2C, + 0x22, 0x22, 0x2A, 0x2A, 0x26, 0x26, 0x2E, 0x2E, + 0x30, 0x30, 0x38, 0x38, 0x34, 0x34, 0x3C, 0x3C, + 0x32, 0x32, 0x3A, 0x3A, 0x36, 0x36, 0x3E, 0x3E, + 0x40, 0x40, 0x48, 0x48, 0x44, 0x44, 0x4C, 0x4C, + 0x42, 0x42, 0x4A, 0x4A, 0x46, 0x46, 0x4E, 0x4E, + 0x50, 0x50, 0x58, 0x58, 0x54, 0x54, 0x5C, 0x5C, + 0x52, 0x52, 0x5A, 0x5A, 0x56, 0x56, 0x5E, 0x5E, + 0x60, 0x60, 0x68, 0x68, 0x64, 0x64, 0x6C, 0x6C, + 0x62, 0x62, 0x6A, 0x6A, 0x66, 0x66, 0x6E, 0x6E, + 0x70, 0x70, 0x78, 0x78, 0x74, 0x74, 0x7C, 0x7C, + 0x72, 0x72, 0x7A, 0x7A, 0x76, 0x76, 0x7E, 0x7E, + 0x80, 0x80, 0x88, 0x88, 0x84, 0x84, 0x8C, 0x8C, + 0x82, 0x82, 0x8A, 0x8A, 0x86, 0x86, 0x8E, 0x8E, + 0x90, 0x90, 0x98, 0x98, 0x94, 0x94, 0x9C, 0x9C, + 0x92, 0x92, 0x9A, 0x9A, 0x96, 0x96, 0x9E, 0x9E, + 0xA0, 0xA0, 0xA8, 0xA8, 0xA4, 0xA4, 0xAC, 0xAC, + 0xA2, 0xA2, 0xAA, 0xAA, 0xA6, 0xA6, 0xAE, 0xAE, + 0xB0, 0xB0, 0xB8, 0xB8, 0xB4, 0xB4, 0xBC, 0xBC, + 0xB2, 0xB2, 0xBA, 0xBA, 0xB6, 0xB6, 0xBE, 0xBE, + 0xC0, 0xC0, 0xC8, 0xC8, 0xC4, 0xC4, 0xCC, 0xCC, + 0xC2, 0xC2, 0xCA, 0xCA, 0xC6, 0xC6, 0xCE, 0xCE, + 0xD0, 0xD0, 0xD8, 0xD8, 0xD4, 0xD4, 0xDC, 0xDC, + 0xD2, 0xD2, 0xDA, 0xDA, 0xD6, 0xD6, 0xDE, 0xDE, + 0xE0, 0xE0, 0xE8, 0xE8, 0xE4, 0xE4, 0xEC, 0xEC, + 0xE2, 0xE2, 0xEA, 0xEA, 0xE6, 0xE6, 0xEE, 0xEE, + 0xF0, 0xF0, 0xF8, 0xF8, 0xF4, 0xF4, 0xFC, 0xFC, + 0xF2, 0xF2, 0xFA, 0xFA, 0xF6, 0xF6, 0xFE, 0xFE ]; - static $pc1map = [0x0, 0x0, 0x8, 0x8, 0x4, 0x4, 0xc, 0xc, 0x2, 0x2, 0xa, 0xa, 0x6, 0x6, 0xe, 0xe, 0x10, 0x10, 0x18, 0x18, 0x14, 0x14, 0x1c, 0x1c, 0x12, 0x12, 0x1a, 0x1a, 0x16, 0x16, 0x1e, 0x1e, 0x20, 0x20, 0x28, 0x28, 0x24, 0x24, 0x2c, 0x2c, 0x22, 0x22, 0x2a, 0x2a, 0x26, 0x26, 0x2e, 0x2e, 0x30, 0x30, 0x38, 0x38, 0x34, 0x34, 0x3c, 0x3c, 0x32, 0x32, 0x3a, 0x3a, 0x36, 0x36, 0x3e, 0x3e, 0x40, 0x40, 0x48, 0x48, 0x44, 0x44, 0x4c, 0x4c, 0x42, 0x42, 0x4a, 0x4a, 0x46, 0x46, 0x4e, 0x4e, 0x50, 0x50, 0x58, 0x58, 0x54, 0x54, 0x5c, 0x5c, 0x52, 0x52, 0x5a, 0x5a, 0x56, 0x56, 0x5e, 0x5e, 0x60, 0x60, 0x68, 0x68, 0x64, 0x64, 0x6c, 0x6c, 0x62, 0x62, 0x6a, 0x6a, 0x66, 0x66, 0x6e, 0x6e, 0x70, 0x70, 0x78, 0x78, 0x74, 0x74, 0x7c, 0x7c, 0x72, 0x72, 0x7a, 0x7a, 0x76, 0x76, 0x7e, 0x7e, 0x80, 0x80, 0x88, 0x88, 0x84, 0x84, 0x8c, 0x8c, 0x82, 0x82, 0x8a, 0x8a, 0x86, 0x86, 0x8e, 0x8e, 0x90, 0x90, 0x98, 0x98, 0x94, 0x94, 0x9c, 0x9c, 0x92, 0x92, 0x9a, 0x9a, 0x96, 0x96, 0x9e, 0x9e, 0xa0, 0xa0, 0xa8, 0xa8, 0xa4, 0xa4, 0xac, 0xac, 0xa2, 0xa2, 0xaa, 0xaa, 0xa6, 0xa6, 0xae, 0xae, 0xb0, 0xb0, 0xb8, 0xb8, 0xb4, 0xb4, 0xbc, 0xbc, 0xb2, 0xb2, 0xba, 0xba, 0xb6, 0xb6, 0xbe, 0xbe, 0xc0, 0xc0, 0xc8, 0xc8, 0xc4, 0xc4, 0xcc, 0xcc, 0xc2, 0xc2, 0xca, 0xca, 0xc6, 0xc6, 0xce, 0xce, 0xd0, 0xd0, 0xd8, 0xd8, 0xd4, 0xd4, 0xdc, 0xdc, 0xd2, 0xd2, 0xda, 0xda, 0xd6, 0xd6, 0xde, 0xde, 0xe0, 0xe0, 0xe8, 0xe8, 0xe4, 0xe4, 0xec, 0xec, 0xe2, 0xe2, 0xea, 0xea, 0xe6, 0xe6, 0xee, 0xee, 0xf0, 0xf0, 0xf8, 0xf8, 0xf4, 0xf4, 0xfc, 0xfc, 0xf2, 0xf2, 0xfa, 0xfa, 0xf6, 0xf6, 0xfe, 0xfe]; + // Mapping tables for the PC-2 transformation. - static $pc2mapc1 = [0x0, 0x400, 0x200000, 0x200400, 0x1, 0x401, 0x200001, 0x200401, 0x2000000, 0x2000400, 0x2200000, 0x2200400, 0x2000001, 0x2000401, 0x2200001, 0x2200401]; - static $pc2mapc2 = [0x0, 0x800, 0x8000000, 0x8000800, 0x10000, 0x10800, 0x8010000, 0x8010800, 0x0, 0x800, 0x8000000, 0x8000800, 0x10000, 0x10800, 0x8010000, 0x8010800, 0x100, 0x900, 0x8000100, 0x8000900, 0x10100, 0x10900, 0x8010100, 0x8010900, 0x100, 0x900, 0x8000100, 0x8000900, 0x10100, 0x10900, 0x8010100, 0x8010900, 0x10, 0x810, 0x8000010, 0x8000810, 0x10010, 0x10810, 0x8010010, 0x8010810, 0x10, 0x810, 0x8000010, 0x8000810, 0x10010, 0x10810, 0x8010010, 0x8010810, 0x110, 0x910, 0x8000110, 0x8000910, 0x10110, 0x10910, 0x8010110, 0x8010910, 0x110, 0x910, 0x8000110, 0x8000910, 0x10110, 0x10910, 0x8010110, 0x8010910, 0x40000, 0x40800, 0x8040000, 0x8040800, 0x50000, 0x50800, 0x8050000, 0x8050800, 0x40000, 0x40800, 0x8040000, 0x8040800, 0x50000, 0x50800, 0x8050000, 0x8050800, 0x40100, 0x40900, 0x8040100, 0x8040900, 0x50100, 0x50900, 0x8050100, 0x8050900, 0x40100, 0x40900, 0x8040100, 0x8040900, 0x50100, 0x50900, 0x8050100, 0x8050900, 0x40010, 0x40810, 0x8040010, 0x8040810, 0x50010, 0x50810, 0x8050010, 0x8050810, 0x40010, 0x40810, 0x8040010, 0x8040810, 0x50010, 0x50810, 0x8050010, 0x8050810, 0x40110, 0x40910, 0x8040110, 0x8040910, 0x50110, 0x50910, 0x8050110, 0x8050910, 0x40110, 0x40910, 0x8040110, 0x8040910, 0x50110, 0x50910, 0x8050110, 0x8050910, 0x1000000, 0x1000800, 0x9000000, 0x9000800, 0x1010000, 0x1010800, 0x9010000, 0x9010800, 0x1000000, 0x1000800, 0x9000000, 0x9000800, 0x1010000, 0x1010800, 0x9010000, 0x9010800, 0x1000100, 0x1000900, 0x9000100, 0x9000900, 0x1010100, 0x1010900, 0x9010100, 0x9010900, 0x1000100, 0x1000900, 0x9000100, 0x9000900, 0x1010100, 0x1010900, 0x9010100, 0x9010900, 0x1000010, 0x1000810, 0x9000010, 0x9000810, 0x1010010, 0x1010810, 0x9010010, 0x9010810, 0x1000010, 0x1000810, 0x9000010, 0x9000810, 0x1010010, 0x1010810, 0x9010010, 0x9010810, 0x1000110, 0x1000910, 0x9000110, 0x9000910, 0x1010110, 0x1010910, 0x9010110, 0x9010910, 0x1000110, 0x1000910, 0x9000110, 0x9000910, 0x1010110, 0x1010910, 0x9010110, 0x9010910, 0x1040000, 0x1040800, 0x9040000, 0x9040800, 0x1050000, 0x1050800, 0x9050000, 0x9050800, 0x1040000, 0x1040800, 0x9040000, 0x9040800, 0x1050000, 0x1050800, 0x9050000, 0x9050800, 0x1040100, 0x1040900, 0x9040100, 0x9040900, 0x1050100, 0x1050900, 0x9050100, 0x9050900, 0x1040100, 0x1040900, 0x9040100, 0x9040900, 0x1050100, 0x1050900, 0x9050100, 0x9050900, 0x1040010, 0x1040810, 0x9040010, 0x9040810, 0x1050010, 0x1050810, 0x9050010, 0x9050810, 0x1040010, 0x1040810, 0x9040010, 0x9040810, 0x1050010, 0x1050810, 0x9050010, 0x9050810, 0x1040110, 0x1040910, 0x9040110, 0x9040910, 0x1050110, 0x1050910, 0x9050110, 0x9050910, 0x1040110, 0x1040910, 0x9040110, 0x9040910, 0x1050110, 0x1050910, 0x9050110, 0x9050910]; - static $pc2mapc3 = [0x0, 0x4, 0x1000, 0x1004, 0x0, 0x4, 0x1000, 0x1004, 0x10000000, 0x10000004, 0x10001000, 0x10001004, 0x10000000, 0x10000004, 0x10001000, 0x10001004, 0x20, 0x24, 0x1020, 0x1024, 0x20, 0x24, 0x1020, 0x1024, 0x10000020, 0x10000024, 0x10001020, 0x10001024, 0x10000020, 0x10000024, 0x10001020, 0x10001024, 0x80000, 0x80004, 0x81000, 0x81004, 0x80000, 0x80004, 0x81000, 0x81004, 0x10080000, 0x10080004, 0x10081000, 0x10081004, 0x10080000, 0x10080004, 0x10081000, 0x10081004, 0x80020, 0x80024, 0x81020, 0x81024, 0x80020, 0x80024, 0x81020, 0x81024, 0x10080020, 0x10080024, 0x10081020, 0x10081024, 0x10080020, 0x10080024, 0x10081020, 0x10081024, 0x20000000, 0x20000004, 0x20001000, 0x20001004, 0x20000000, 0x20000004, 0x20001000, 0x20001004, 0x30000000, 0x30000004, 0x30001000, 0x30001004, 0x30000000, 0x30000004, 0x30001000, 0x30001004, 0x20000020, 0x20000024, 0x20001020, 0x20001024, 0x20000020, 0x20000024, 0x20001020, 0x20001024, 0x30000020, 0x30000024, 0x30001020, 0x30001024, 0x30000020, 0x30000024, 0x30001020, 0x30001024, 0x20080000, 0x20080004, 0x20081000, 0x20081004, 0x20080000, 0x20080004, 0x20081000, 0x20081004, 0x30080000, 0x30080004, 0x30081000, 0x30081004, 0x30080000, 0x30080004, 0x30081000, 0x30081004, 0x20080020, 0x20080024, 0x20081020, 0x20081024, 0x20080020, 0x20080024, 0x20081020, 0x20081024, 0x30080020, 0x30080024, 0x30081020, 0x30081024, 0x30080020, 0x30080024, 0x30081020, 0x30081024, 0x2, 0x6, 0x1002, 0x1006, 0x2, 0x6, 0x1002, 0x1006, 0x10000002, 0x10000006, 0x10001002, 0x10001006, 0x10000002, 0x10000006, 0x10001002, 0x10001006, 0x22, 0x26, 0x1022, 0x1026, 0x22, 0x26, 0x1022, 0x1026, 0x10000022, 0x10000026, 0x10001022, 0x10001026, 0x10000022, 0x10000026, 0x10001022, 0x10001026, 0x80002, 0x80006, 0x81002, 0x81006, 0x80002, 0x80006, 0x81002, 0x81006, 0x10080002, 0x10080006, 0x10081002, 0x10081006, 0x10080002, 0x10080006, 0x10081002, 0x10081006, 0x80022, 0x80026, 0x81022, 0x81026, 0x80022, 0x80026, 0x81022, 0x81026, 0x10080022, 0x10080026, 0x10081022, 0x10081026, 0x10080022, 0x10080026, 0x10081022, 0x10081026, 0x20000002, 0x20000006, 0x20001002, 0x20001006, 0x20000002, 0x20000006, 0x20001002, 0x20001006, 0x30000002, 0x30000006, 0x30001002, 0x30001006, 0x30000002, 0x30000006, 0x30001002, 0x30001006, 0x20000022, 0x20000026, 0x20001022, 0x20001026, 0x20000022, 0x20000026, 0x20001022, 0x20001026, 0x30000022, 0x30000026, 0x30001022, 0x30001026, 0x30000022, 0x30000026, 0x30001022, 0x30001026, 0x20080002, 0x20080006, 0x20081002, 0x20081006, 0x20080002, 0x20080006, 0x20081002, 0x20081006, 0x30080002, 0x30080006, 0x30081002, 0x30081006, 0x30080002, 0x30080006, 0x30081002, 0x30081006, 0x20080022, 0x20080026, 0x20081022, 0x20081026, 0x20080022, 0x20080026, 0x20081022, 0x20081026, 0x30080022, 0x30080026, 0x30081022, 0x30081026, 0x30080022, 0x30080026, 0x30081022, 0x30081026]; - static $pc2mapc4 = [0x0, 0x100000, 0x8, 0x100008, 0x200, 0x100200, 0x208, 0x100208, 0x0, 0x100000, 0x8, 0x100008, 0x200, 0x100200, 0x208, 0x100208, 0x4000000, 0x4100000, 0x4000008, 0x4100008, 0x4000200, 0x4100200, 0x4000208, 0x4100208, 0x4000000, 0x4100000, 0x4000008, 0x4100008, 0x4000200, 0x4100200, 0x4000208, 0x4100208, 0x2000, 0x102000, 0x2008, 0x102008, 0x2200, 0x102200, 0x2208, 0x102208, 0x2000, 0x102000, 0x2008, 0x102008, 0x2200, 0x102200, 0x2208, 0x102208, 0x4002000, 0x4102000, 0x4002008, 0x4102008, 0x4002200, 0x4102200, 0x4002208, 0x4102208, 0x4002000, 0x4102000, 0x4002008, 0x4102008, 0x4002200, 0x4102200, 0x4002208, 0x4102208, 0x0, 0x100000, 0x8, 0x100008, 0x200, 0x100200, 0x208, 0x100208, 0x0, 0x100000, 0x8, 0x100008, 0x200, 0x100200, 0x208, 0x100208, 0x4000000, 0x4100000, 0x4000008, 0x4100008, 0x4000200, 0x4100200, 0x4000208, 0x4100208, 0x4000000, 0x4100000, 0x4000008, 0x4100008, 0x4000200, 0x4100200, 0x4000208, 0x4100208, 0x2000, 0x102000, 0x2008, 0x102008, 0x2200, 0x102200, 0x2208, 0x102208, 0x2000, 0x102000, 0x2008, 0x102008, 0x2200, 0x102200, 0x2208, 0x102208, 0x4002000, 0x4102000, 0x4002008, 0x4102008, 0x4002200, 0x4102200, 0x4002208, 0x4102208, 0x4002000, 0x4102000, 0x4002008, 0x4102008, 0x4002200, 0x4102200, 0x4002208, 0x4102208, 0x20000, 0x120000, 0x20008, 0x120008, 0x20200, 0x120200, 0x20208, 0x120208, 0x20000, 0x120000, 0x20008, 0x120008, 0x20200, 0x120200, 0x20208, 0x120208, 0x4020000, 0x4120000, 0x4020008, 0x4120008, 0x4020200, 0x4120200, 0x4020208, 0x4120208, 0x4020000, 0x4120000, 0x4020008, 0x4120008, 0x4020200, 0x4120200, 0x4020208, 0x4120208, 0x22000, 0x122000, 0x22008, 0x122008, 0x22200, 0x122200, 0x22208, 0x122208, 0x22000, 0x122000, 0x22008, 0x122008, 0x22200, 0x122200, 0x22208, 0x122208, 0x4022000, 0x4122000, 0x4022008, 0x4122008, 0x4022200, 0x4122200, 0x4022208, 0x4122208, 0x4022000, 0x4122000, 0x4022008, 0x4122008, 0x4022200, 0x4122200, 0x4022208, 0x4122208, 0x20000, 0x120000, 0x20008, 0x120008, 0x20200, 0x120200, 0x20208, 0x120208, 0x20000, 0x120000, 0x20008, 0x120008, 0x20200, 0x120200, 0x20208, 0x120208, 0x4020000, 0x4120000, 0x4020008, 0x4120008, 0x4020200, 0x4120200, 0x4020208, 0x4120208, 0x4020000, 0x4120000, 0x4020008, 0x4120008, 0x4020200, 0x4120200, 0x4020208, 0x4120208, 0x22000, 0x122000, 0x22008, 0x122008, 0x22200, 0x122200, 0x22208, 0x122208, 0x22000, 0x122000, 0x22008, 0x122008, 0x22200, 0x122200, 0x22208, 0x122208, 0x4022000, 0x4122000, 0x4022008, 0x4122008, 0x4022200, 0x4122200, 0x4022208, 0x4122208, 0x4022000, 0x4122000, 0x4022008, 0x4122008, 0x4022200, 0x4122200, 0x4022208, 0x4122208]; - static $pc2mapd1 = [0x0, 0x1, 0x8000000, 0x8000001, 0x200000, 0x200001, 0x8200000, 0x8200001, 0x2, 0x3, 0x8000002, 0x8000003, 0x200002, 0x200003, 0x8200002, 0x8200003]; - static $pc2mapd2 = [0x0, 0x100000, 0x800, 0x100800, 0x0, 0x100000, 0x800, 0x100800, 0x4000000, 0x4100000, 0x4000800, 0x4100800, 0x4000000, 0x4100000, 0x4000800, 0x4100800, 0x4, 0x100004, 0x804, 0x100804, 0x4, 0x100004, 0x804, 0x100804, 0x4000004, 0x4100004, 0x4000804, 0x4100804, 0x4000004, 0x4100004, 0x4000804, 0x4100804, 0x0, 0x100000, 0x800, 0x100800, 0x0, 0x100000, 0x800, 0x100800, 0x4000000, 0x4100000, 0x4000800, 0x4100800, 0x4000000, 0x4100000, 0x4000800, 0x4100800, 0x4, 0x100004, 0x804, 0x100804, 0x4, 0x100004, 0x804, 0x100804, 0x4000004, 0x4100004, 0x4000804, 0x4100804, 0x4000004, 0x4100004, 0x4000804, 0x4100804, 0x200, 0x100200, 0xa00, 0x100a00, 0x200, 0x100200, 0xa00, 0x100a00, 0x4000200, 0x4100200, 0x4000a00, 0x4100a00, 0x4000200, 0x4100200, 0x4000a00, 0x4100a00, 0x204, 0x100204, 0xa04, 0x100a04, 0x204, 0x100204, 0xa04, 0x100a04, 0x4000204, 0x4100204, 0x4000a04, 0x4100a04, 0x4000204, 0x4100204, 0x4000a04, 0x4100a04, 0x200, 0x100200, 0xa00, 0x100a00, 0x200, 0x100200, 0xa00, 0x100a00, 0x4000200, 0x4100200, 0x4000a00, 0x4100a00, 0x4000200, 0x4100200, 0x4000a00, 0x4100a00, 0x204, 0x100204, 0xa04, 0x100a04, 0x204, 0x100204, 0xa04, 0x100a04, 0x4000204, 0x4100204, 0x4000a04, 0x4100a04, 0x4000204, 0x4100204, 0x4000a04, 0x4100a04, 0x20000, 0x120000, 0x20800, 0x120800, 0x20000, 0x120000, 0x20800, 0x120800, 0x4020000, 0x4120000, 0x4020800, 0x4120800, 0x4020000, 0x4120000, 0x4020800, 0x4120800, 0x20004, 0x120004, 0x20804, 0x120804, 0x20004, 0x120004, 0x20804, 0x120804, 0x4020004, 0x4120004, 0x4020804, 0x4120804, 0x4020004, 0x4120004, 0x4020804, 0x4120804, 0x20000, 0x120000, 0x20800, 0x120800, 0x20000, 0x120000, 0x20800, 0x120800, 0x4020000, 0x4120000, 0x4020800, 0x4120800, 0x4020000, 0x4120000, 0x4020800, 0x4120800, 0x20004, 0x120004, 0x20804, 0x120804, 0x20004, 0x120004, 0x20804, 0x120804, 0x4020004, 0x4120004, 0x4020804, 0x4120804, 0x4020004, 0x4120004, 0x4020804, 0x4120804, 0x20200, 0x120200, 0x20a00, 0x120a00, 0x20200, 0x120200, 0x20a00, 0x120a00, 0x4020200, 0x4120200, 0x4020a00, 0x4120a00, 0x4020200, 0x4120200, 0x4020a00, 0x4120a00, 0x20204, 0x120204, 0x20a04, 0x120a04, 0x20204, 0x120204, 0x20a04, 0x120a04, 0x4020204, 0x4120204, 0x4020a04, 0x4120a04, 0x4020204, 0x4120204, 0x4020a04, 0x4120a04, 0x20200, 0x120200, 0x20a00, 0x120a00, 0x20200, 0x120200, 0x20a00, 0x120a00, 0x4020200, 0x4120200, 0x4020a00, 0x4120a00, 0x4020200, 0x4120200, 0x4020a00, 0x4120a00, 0x20204, 0x120204, 0x20a04, 0x120a04, 0x20204, 0x120204, 0x20a04, 0x120a04, 0x4020204, 0x4120204, 0x4020a04, 0x4120a04, 0x4020204, 0x4120204, 0x4020a04, 0x4120a04]; - static $pc2mapd3 = [0x0, 0x10000, 0x2000000, 0x2010000, 0x20, 0x10020, 0x2000020, 0x2010020, 0x40000, 0x50000, 0x2040000, 0x2050000, 0x40020, 0x50020, 0x2040020, 0x2050020, 0x2000, 0x12000, 0x2002000, 0x2012000, 0x2020, 0x12020, 0x2002020, 0x2012020, 0x42000, 0x52000, 0x2042000, 0x2052000, 0x42020, 0x52020, 0x2042020, 0x2052020, 0x0, 0x10000, 0x2000000, 0x2010000, 0x20, 0x10020, 0x2000020, 0x2010020, 0x40000, 0x50000, 0x2040000, 0x2050000, 0x40020, 0x50020, 0x2040020, 0x2050020, 0x2000, 0x12000, 0x2002000, 0x2012000, 0x2020, 0x12020, 0x2002020, 0x2012020, 0x42000, 0x52000, 0x2042000, 0x2052000, 0x42020, 0x52020, 0x2042020, 0x2052020, 0x10, 0x10010, 0x2000010, 0x2010010, 0x30, 0x10030, 0x2000030, 0x2010030, 0x40010, 0x50010, 0x2040010, 0x2050010, 0x40030, 0x50030, 0x2040030, 0x2050030, 0x2010, 0x12010, 0x2002010, 0x2012010, 0x2030, 0x12030, 0x2002030, 0x2012030, 0x42010, 0x52010, 0x2042010, 0x2052010, 0x42030, 0x52030, 0x2042030, 0x2052030, 0x10, 0x10010, 0x2000010, 0x2010010, 0x30, 0x10030, 0x2000030, 0x2010030, 0x40010, 0x50010, 0x2040010, 0x2050010, 0x40030, 0x50030, 0x2040030, 0x2050030, 0x2010, 0x12010, 0x2002010, 0x2012010, 0x2030, 0x12030, 0x2002030, 0x2012030, 0x42010, 0x52010, 0x2042010, 0x2052010, 0x42030, 0x52030, 0x2042030, 0x2052030, 0x20000000, 0x20010000, 0x22000000, 0x22010000, 0x20000020, 0x20010020, 0x22000020, 0x22010020, 0x20040000, 0x20050000, 0x22040000, 0x22050000, 0x20040020, 0x20050020, 0x22040020, 0x22050020, 0x20002000, 0x20012000, 0x22002000, 0x22012000, 0x20002020, 0x20012020, 0x22002020, 0x22012020, 0x20042000, 0x20052000, 0x22042000, 0x22052000, 0x20042020, 0x20052020, 0x22042020, 0x22052020, 0x20000000, 0x20010000, 0x22000000, 0x22010000, 0x20000020, 0x20010020, 0x22000020, 0x22010020, 0x20040000, 0x20050000, 0x22040000, 0x22050000, 0x20040020, 0x20050020, 0x22040020, 0x22050020, 0x20002000, 0x20012000, 0x22002000, 0x22012000, 0x20002020, 0x20012020, 0x22002020, 0x22012020, 0x20042000, 0x20052000, 0x22042000, 0x22052000, 0x20042020, 0x20052020, 0x22042020, 0x22052020, 0x20000010, 0x20010010, 0x22000010, 0x22010010, 0x20000030, 0x20010030, 0x22000030, 0x22010030, 0x20040010, 0x20050010, 0x22040010, 0x22050010, 0x20040030, 0x20050030, 0x22040030, 0x22050030, 0x20002010, 0x20012010, 0x22002010, 0x22012010, 0x20002030, 0x20012030, 0x22002030, 0x22012030, 0x20042010, 0x20052010, 0x22042010, 0x22052010, 0x20042030, 0x20052030, 0x22042030, 0x22052030, 0x20000010, 0x20010010, 0x22000010, 0x22010010, 0x20000030, 0x20010030, 0x22000030, 0x22010030, 0x20040010, 0x20050010, 0x22040010, 0x22050010, 0x20040030, 0x20050030, 0x22040030, 0x22050030, 0x20002010, 0x20012010, 0x22002010, 0x22012010, 0x20002030, 0x20012030, 0x22002030, 0x22012030, 0x20042010, 0x20052010, 0x22042010, 0x22052010, 0x20042030, 0x20052030, 0x22042030, 0x22052030]; - static $pc2mapd4 = [0x0, 0x400, 0x1000000, 0x1000400, 0x0, 0x400, 0x1000000, 0x1000400, 0x100, 0x500, 0x1000100, 0x1000500, 0x100, 0x500, 0x1000100, 0x1000500, 0x10000000, 0x10000400, 0x11000000, 0x11000400, 0x10000000, 0x10000400, 0x11000000, 0x11000400, 0x10000100, 0x10000500, 0x11000100, 0x11000500, 0x10000100, 0x10000500, 0x11000100, 0x11000500, 0x80000, 0x80400, 0x1080000, 0x1080400, 0x80000, 0x80400, 0x1080000, 0x1080400, 0x80100, 0x80500, 0x1080100, 0x1080500, 0x80100, 0x80500, 0x1080100, 0x1080500, 0x10080000, 0x10080400, 0x11080000, 0x11080400, 0x10080000, 0x10080400, 0x11080000, 0x11080400, 0x10080100, 0x10080500, 0x11080100, 0x11080500, 0x10080100, 0x10080500, 0x11080100, 0x11080500, 0x8, 0x408, 0x1000008, 0x1000408, 0x8, 0x408, 0x1000008, 0x1000408, 0x108, 0x508, 0x1000108, 0x1000508, 0x108, 0x508, 0x1000108, 0x1000508, 0x10000008, 0x10000408, 0x11000008, 0x11000408, 0x10000008, 0x10000408, 0x11000008, 0x11000408, 0x10000108, 0x10000508, 0x11000108, 0x11000508, 0x10000108, 0x10000508, 0x11000108, 0x11000508, 0x80008, 0x80408, 0x1080008, 0x1080408, 0x80008, 0x80408, 0x1080008, 0x1080408, 0x80108, 0x80508, 0x1080108, 0x1080508, 0x80108, 0x80508, 0x1080108, 0x1080508, 0x10080008, 0x10080408, 0x11080008, 0x11080408, 0x10080008, 0x10080408, 0x11080008, 0x11080408, 0x10080108, 0x10080508, 0x11080108, 0x11080508, 0x10080108, 0x10080508, 0x11080108, 0x11080508, 0x1000, 0x1400, 0x1001000, 0x1001400, 0x1000, 0x1400, 0x1001000, 0x1001400, 0x1100, 0x1500, 0x1001100, 0x1001500, 0x1100, 0x1500, 0x1001100, 0x1001500, 0x10001000, 0x10001400, 0x11001000, 0x11001400, 0x10001000, 0x10001400, 0x11001000, 0x11001400, 0x10001100, 0x10001500, 0x11001100, 0x11001500, 0x10001100, 0x10001500, 0x11001100, 0x11001500, 0x81000, 0x81400, 0x1081000, 0x1081400, 0x81000, 0x81400, 0x1081000, 0x1081400, 0x81100, 0x81500, 0x1081100, 0x1081500, 0x81100, 0x81500, 0x1081100, 0x1081500, 0x10081000, 0x10081400, 0x11081000, 0x11081400, 0x10081000, 0x10081400, 0x11081000, 0x11081400, 0x10081100, 0x10081500, 0x11081100, 0x11081500, 0x10081100, 0x10081500, 0x11081100, 0x11081500, 0x1008, 0x1408, 0x1001008, 0x1001408, 0x1008, 0x1408, 0x1001008, 0x1001408, 0x1108, 0x1508, 0x1001108, 0x1001508, 0x1108, 0x1508, 0x1001108, 0x1001508, 0x10001008, 0x10001408, 0x11001008, 0x11001408, 0x10001008, 0x10001408, 0x11001008, 0x11001408, 0x10001108, 0x10001508, 0x11001108, 0x11001508, 0x10001108, 0x10001508, 0x11001108, 0x11001508, 0x81008, 0x81408, 0x1081008, 0x1081408, 0x81008, 0x81408, 0x1081008, 0x1081408, 0x81108, 0x81508, 0x1081108, 0x1081508, 0x81108, 0x81508, 0x1081108, 0x1081508, 0x10081008, 0x10081408, 0x11081008, 0x11081408, 0x10081008, 0x10081408, 0x11081008, 0x11081408, 0x10081108, 0x10081508, 0x11081108, 0x11081508, 0x10081108, 0x10081508, 0x11081108, 0x11081508]; + static $pc2mapc1 = [ + 0x00000000, 0x00000400, 0x00200000, 0x00200400, + 0x00000001, 0x00000401, 0x00200001, 0x00200401, + 0x02000000, 0x02000400, 0x02200000, 0x02200400, + 0x02000001, 0x02000401, 0x02200001, 0x02200401 + ]; + static $pc2mapc2 = [ + 0x00000000, 0x00000800, 0x08000000, 0x08000800, + 0x00010000, 0x00010800, 0x08010000, 0x08010800, + 0x00000000, 0x00000800, 0x08000000, 0x08000800, + 0x00010000, 0x00010800, 0x08010000, 0x08010800, + 0x00000100, 0x00000900, 0x08000100, 0x08000900, + 0x00010100, 0x00010900, 0x08010100, 0x08010900, + 0x00000100, 0x00000900, 0x08000100, 0x08000900, + 0x00010100, 0x00010900, 0x08010100, 0x08010900, + 0x00000010, 0x00000810, 0x08000010, 0x08000810, + 0x00010010, 0x00010810, 0x08010010, 0x08010810, + 0x00000010, 0x00000810, 0x08000010, 0x08000810, + 0x00010010, 0x00010810, 0x08010010, 0x08010810, + 0x00000110, 0x00000910, 0x08000110, 0x08000910, + 0x00010110, 0x00010910, 0x08010110, 0x08010910, + 0x00000110, 0x00000910, 0x08000110, 0x08000910, + 0x00010110, 0x00010910, 0x08010110, 0x08010910, + 0x00040000, 0x00040800, 0x08040000, 0x08040800, + 0x00050000, 0x00050800, 0x08050000, 0x08050800, + 0x00040000, 0x00040800, 0x08040000, 0x08040800, + 0x00050000, 0x00050800, 0x08050000, 0x08050800, + 0x00040100, 0x00040900, 0x08040100, 0x08040900, + 0x00050100, 0x00050900, 0x08050100, 0x08050900, + 0x00040100, 0x00040900, 0x08040100, 0x08040900, + 0x00050100, 0x00050900, 0x08050100, 0x08050900, + 0x00040010, 0x00040810, 0x08040010, 0x08040810, + 0x00050010, 0x00050810, 0x08050010, 0x08050810, + 0x00040010, 0x00040810, 0x08040010, 0x08040810, + 0x00050010, 0x00050810, 0x08050010, 0x08050810, + 0x00040110, 0x00040910, 0x08040110, 0x08040910, + 0x00050110, 0x00050910, 0x08050110, 0x08050910, + 0x00040110, 0x00040910, 0x08040110, 0x08040910, + 0x00050110, 0x00050910, 0x08050110, 0x08050910, + 0x01000000, 0x01000800, 0x09000000, 0x09000800, + 0x01010000, 0x01010800, 0x09010000, 0x09010800, + 0x01000000, 0x01000800, 0x09000000, 0x09000800, + 0x01010000, 0x01010800, 0x09010000, 0x09010800, + 0x01000100, 0x01000900, 0x09000100, 0x09000900, + 0x01010100, 0x01010900, 0x09010100, 0x09010900, + 0x01000100, 0x01000900, 0x09000100, 0x09000900, + 0x01010100, 0x01010900, 0x09010100, 0x09010900, + 0x01000010, 0x01000810, 0x09000010, 0x09000810, + 0x01010010, 0x01010810, 0x09010010, 0x09010810, + 0x01000010, 0x01000810, 0x09000010, 0x09000810, + 0x01010010, 0x01010810, 0x09010010, 0x09010810, + 0x01000110, 0x01000910, 0x09000110, 0x09000910, + 0x01010110, 0x01010910, 0x09010110, 0x09010910, + 0x01000110, 0x01000910, 0x09000110, 0x09000910, + 0x01010110, 0x01010910, 0x09010110, 0x09010910, + 0x01040000, 0x01040800, 0x09040000, 0x09040800, + 0x01050000, 0x01050800, 0x09050000, 0x09050800, + 0x01040000, 0x01040800, 0x09040000, 0x09040800, + 0x01050000, 0x01050800, 0x09050000, 0x09050800, + 0x01040100, 0x01040900, 0x09040100, 0x09040900, + 0x01050100, 0x01050900, 0x09050100, 0x09050900, + 0x01040100, 0x01040900, 0x09040100, 0x09040900, + 0x01050100, 0x01050900, 0x09050100, 0x09050900, + 0x01040010, 0x01040810, 0x09040010, 0x09040810, + 0x01050010, 0x01050810, 0x09050010, 0x09050810, + 0x01040010, 0x01040810, 0x09040010, 0x09040810, + 0x01050010, 0x01050810, 0x09050010, 0x09050810, + 0x01040110, 0x01040910, 0x09040110, 0x09040910, + 0x01050110, 0x01050910, 0x09050110, 0x09050910, + 0x01040110, 0x01040910, 0x09040110, 0x09040910, + 0x01050110, 0x01050910, 0x09050110, 0x09050910 + ]; + static $pc2mapc3 = [ + 0x00000000, 0x00000004, 0x00001000, 0x00001004, + 0x00000000, 0x00000004, 0x00001000, 0x00001004, + 0x10000000, 0x10000004, 0x10001000, 0x10001004, + 0x10000000, 0x10000004, 0x10001000, 0x10001004, + 0x00000020, 0x00000024, 0x00001020, 0x00001024, + 0x00000020, 0x00000024, 0x00001020, 0x00001024, + 0x10000020, 0x10000024, 0x10001020, 0x10001024, + 0x10000020, 0x10000024, 0x10001020, 0x10001024, + 0x00080000, 0x00080004, 0x00081000, 0x00081004, + 0x00080000, 0x00080004, 0x00081000, 0x00081004, + 0x10080000, 0x10080004, 0x10081000, 0x10081004, + 0x10080000, 0x10080004, 0x10081000, 0x10081004, + 0x00080020, 0x00080024, 0x00081020, 0x00081024, + 0x00080020, 0x00080024, 0x00081020, 0x00081024, + 0x10080020, 0x10080024, 0x10081020, 0x10081024, + 0x10080020, 0x10080024, 0x10081020, 0x10081024, + 0x20000000, 0x20000004, 0x20001000, 0x20001004, + 0x20000000, 0x20000004, 0x20001000, 0x20001004, + 0x30000000, 0x30000004, 0x30001000, 0x30001004, + 0x30000000, 0x30000004, 0x30001000, 0x30001004, + 0x20000020, 0x20000024, 0x20001020, 0x20001024, + 0x20000020, 0x20000024, 0x20001020, 0x20001024, + 0x30000020, 0x30000024, 0x30001020, 0x30001024, + 0x30000020, 0x30000024, 0x30001020, 0x30001024, + 0x20080000, 0x20080004, 0x20081000, 0x20081004, + 0x20080000, 0x20080004, 0x20081000, 0x20081004, + 0x30080000, 0x30080004, 0x30081000, 0x30081004, + 0x30080000, 0x30080004, 0x30081000, 0x30081004, + 0x20080020, 0x20080024, 0x20081020, 0x20081024, + 0x20080020, 0x20080024, 0x20081020, 0x20081024, + 0x30080020, 0x30080024, 0x30081020, 0x30081024, + 0x30080020, 0x30080024, 0x30081020, 0x30081024, + 0x00000002, 0x00000006, 0x00001002, 0x00001006, + 0x00000002, 0x00000006, 0x00001002, 0x00001006, + 0x10000002, 0x10000006, 0x10001002, 0x10001006, + 0x10000002, 0x10000006, 0x10001002, 0x10001006, + 0x00000022, 0x00000026, 0x00001022, 0x00001026, + 0x00000022, 0x00000026, 0x00001022, 0x00001026, + 0x10000022, 0x10000026, 0x10001022, 0x10001026, + 0x10000022, 0x10000026, 0x10001022, 0x10001026, + 0x00080002, 0x00080006, 0x00081002, 0x00081006, + 0x00080002, 0x00080006, 0x00081002, 0x00081006, + 0x10080002, 0x10080006, 0x10081002, 0x10081006, + 0x10080002, 0x10080006, 0x10081002, 0x10081006, + 0x00080022, 0x00080026, 0x00081022, 0x00081026, + 0x00080022, 0x00080026, 0x00081022, 0x00081026, + 0x10080022, 0x10080026, 0x10081022, 0x10081026, + 0x10080022, 0x10080026, 0x10081022, 0x10081026, + 0x20000002, 0x20000006, 0x20001002, 0x20001006, + 0x20000002, 0x20000006, 0x20001002, 0x20001006, + 0x30000002, 0x30000006, 0x30001002, 0x30001006, + 0x30000002, 0x30000006, 0x30001002, 0x30001006, + 0x20000022, 0x20000026, 0x20001022, 0x20001026, + 0x20000022, 0x20000026, 0x20001022, 0x20001026, + 0x30000022, 0x30000026, 0x30001022, 0x30001026, + 0x30000022, 0x30000026, 0x30001022, 0x30001026, + 0x20080002, 0x20080006, 0x20081002, 0x20081006, + 0x20080002, 0x20080006, 0x20081002, 0x20081006, + 0x30080002, 0x30080006, 0x30081002, 0x30081006, + 0x30080002, 0x30080006, 0x30081002, 0x30081006, + 0x20080022, 0x20080026, 0x20081022, 0x20081026, + 0x20080022, 0x20080026, 0x20081022, 0x20081026, + 0x30080022, 0x30080026, 0x30081022, 0x30081026, + 0x30080022, 0x30080026, 0x30081022, 0x30081026 + ]; + static $pc2mapc4 = [ + 0x00000000, 0x00100000, 0x00000008, 0x00100008, + 0x00000200, 0x00100200, 0x00000208, 0x00100208, + 0x00000000, 0x00100000, 0x00000008, 0x00100008, + 0x00000200, 0x00100200, 0x00000208, 0x00100208, + 0x04000000, 0x04100000, 0x04000008, 0x04100008, + 0x04000200, 0x04100200, 0x04000208, 0x04100208, + 0x04000000, 0x04100000, 0x04000008, 0x04100008, + 0x04000200, 0x04100200, 0x04000208, 0x04100208, + 0x00002000, 0x00102000, 0x00002008, 0x00102008, + 0x00002200, 0x00102200, 0x00002208, 0x00102208, + 0x00002000, 0x00102000, 0x00002008, 0x00102008, + 0x00002200, 0x00102200, 0x00002208, 0x00102208, + 0x04002000, 0x04102000, 0x04002008, 0x04102008, + 0x04002200, 0x04102200, 0x04002208, 0x04102208, + 0x04002000, 0x04102000, 0x04002008, 0x04102008, + 0x04002200, 0x04102200, 0x04002208, 0x04102208, + 0x00000000, 0x00100000, 0x00000008, 0x00100008, + 0x00000200, 0x00100200, 0x00000208, 0x00100208, + 0x00000000, 0x00100000, 0x00000008, 0x00100008, + 0x00000200, 0x00100200, 0x00000208, 0x00100208, + 0x04000000, 0x04100000, 0x04000008, 0x04100008, + 0x04000200, 0x04100200, 0x04000208, 0x04100208, + 0x04000000, 0x04100000, 0x04000008, 0x04100008, + 0x04000200, 0x04100200, 0x04000208, 0x04100208, + 0x00002000, 0x00102000, 0x00002008, 0x00102008, + 0x00002200, 0x00102200, 0x00002208, 0x00102208, + 0x00002000, 0x00102000, 0x00002008, 0x00102008, + 0x00002200, 0x00102200, 0x00002208, 0x00102208, + 0x04002000, 0x04102000, 0x04002008, 0x04102008, + 0x04002200, 0x04102200, 0x04002208, 0x04102208, + 0x04002000, 0x04102000, 0x04002008, 0x04102008, + 0x04002200, 0x04102200, 0x04002208, 0x04102208, + 0x00020000, 0x00120000, 0x00020008, 0x00120008, + 0x00020200, 0x00120200, 0x00020208, 0x00120208, + 0x00020000, 0x00120000, 0x00020008, 0x00120008, + 0x00020200, 0x00120200, 0x00020208, 0x00120208, + 0x04020000, 0x04120000, 0x04020008, 0x04120008, + 0x04020200, 0x04120200, 0x04020208, 0x04120208, + 0x04020000, 0x04120000, 0x04020008, 0x04120008, + 0x04020200, 0x04120200, 0x04020208, 0x04120208, + 0x00022000, 0x00122000, 0x00022008, 0x00122008, + 0x00022200, 0x00122200, 0x00022208, 0x00122208, + 0x00022000, 0x00122000, 0x00022008, 0x00122008, + 0x00022200, 0x00122200, 0x00022208, 0x00122208, + 0x04022000, 0x04122000, 0x04022008, 0x04122008, + 0x04022200, 0x04122200, 0x04022208, 0x04122208, + 0x04022000, 0x04122000, 0x04022008, 0x04122008, + 0x04022200, 0x04122200, 0x04022208, 0x04122208, + 0x00020000, 0x00120000, 0x00020008, 0x00120008, + 0x00020200, 0x00120200, 0x00020208, 0x00120208, + 0x00020000, 0x00120000, 0x00020008, 0x00120008, + 0x00020200, 0x00120200, 0x00020208, 0x00120208, + 0x04020000, 0x04120000, 0x04020008, 0x04120008, + 0x04020200, 0x04120200, 0x04020208, 0x04120208, + 0x04020000, 0x04120000, 0x04020008, 0x04120008, + 0x04020200, 0x04120200, 0x04020208, 0x04120208, + 0x00022000, 0x00122000, 0x00022008, 0x00122008, + 0x00022200, 0x00122200, 0x00022208, 0x00122208, + 0x00022000, 0x00122000, 0x00022008, 0x00122008, + 0x00022200, 0x00122200, 0x00022208, 0x00122208, + 0x04022000, 0x04122000, 0x04022008, 0x04122008, + 0x04022200, 0x04122200, 0x04022208, 0x04122208, + 0x04022000, 0x04122000, 0x04022008, 0x04122008, + 0x04022200, 0x04122200, 0x04022208, 0x04122208 + ]; + static $pc2mapd1 = [ + 0x00000000, 0x00000001, 0x08000000, 0x08000001, + 0x00200000, 0x00200001, 0x08200000, 0x08200001, + 0x00000002, 0x00000003, 0x08000002, 0x08000003, + 0x00200002, 0x00200003, 0x08200002, 0x08200003 + ]; + static $pc2mapd2 = [ + 0x00000000, 0x00100000, 0x00000800, 0x00100800, + 0x00000000, 0x00100000, 0x00000800, 0x00100800, + 0x04000000, 0x04100000, 0x04000800, 0x04100800, + 0x04000000, 0x04100000, 0x04000800, 0x04100800, + 0x00000004, 0x00100004, 0x00000804, 0x00100804, + 0x00000004, 0x00100004, 0x00000804, 0x00100804, + 0x04000004, 0x04100004, 0x04000804, 0x04100804, + 0x04000004, 0x04100004, 0x04000804, 0x04100804, + 0x00000000, 0x00100000, 0x00000800, 0x00100800, + 0x00000000, 0x00100000, 0x00000800, 0x00100800, + 0x04000000, 0x04100000, 0x04000800, 0x04100800, + 0x04000000, 0x04100000, 0x04000800, 0x04100800, + 0x00000004, 0x00100004, 0x00000804, 0x00100804, + 0x00000004, 0x00100004, 0x00000804, 0x00100804, + 0x04000004, 0x04100004, 0x04000804, 0x04100804, + 0x04000004, 0x04100004, 0x04000804, 0x04100804, + 0x00000200, 0x00100200, 0x00000A00, 0x00100A00, + 0x00000200, 0x00100200, 0x00000A00, 0x00100A00, + 0x04000200, 0x04100200, 0x04000A00, 0x04100A00, + 0x04000200, 0x04100200, 0x04000A00, 0x04100A00, + 0x00000204, 0x00100204, 0x00000A04, 0x00100A04, + 0x00000204, 0x00100204, 0x00000A04, 0x00100A04, + 0x04000204, 0x04100204, 0x04000A04, 0x04100A04, + 0x04000204, 0x04100204, 0x04000A04, 0x04100A04, + 0x00000200, 0x00100200, 0x00000A00, 0x00100A00, + 0x00000200, 0x00100200, 0x00000A00, 0x00100A00, + 0x04000200, 0x04100200, 0x04000A00, 0x04100A00, + 0x04000200, 0x04100200, 0x04000A00, 0x04100A00, + 0x00000204, 0x00100204, 0x00000A04, 0x00100A04, + 0x00000204, 0x00100204, 0x00000A04, 0x00100A04, + 0x04000204, 0x04100204, 0x04000A04, 0x04100A04, + 0x04000204, 0x04100204, 0x04000A04, 0x04100A04, + 0x00020000, 0x00120000, 0x00020800, 0x00120800, + 0x00020000, 0x00120000, 0x00020800, 0x00120800, + 0x04020000, 0x04120000, 0x04020800, 0x04120800, + 0x04020000, 0x04120000, 0x04020800, 0x04120800, + 0x00020004, 0x00120004, 0x00020804, 0x00120804, + 0x00020004, 0x00120004, 0x00020804, 0x00120804, + 0x04020004, 0x04120004, 0x04020804, 0x04120804, + 0x04020004, 0x04120004, 0x04020804, 0x04120804, + 0x00020000, 0x00120000, 0x00020800, 0x00120800, + 0x00020000, 0x00120000, 0x00020800, 0x00120800, + 0x04020000, 0x04120000, 0x04020800, 0x04120800, + 0x04020000, 0x04120000, 0x04020800, 0x04120800, + 0x00020004, 0x00120004, 0x00020804, 0x00120804, + 0x00020004, 0x00120004, 0x00020804, 0x00120804, + 0x04020004, 0x04120004, 0x04020804, 0x04120804, + 0x04020004, 0x04120004, 0x04020804, 0x04120804, + 0x00020200, 0x00120200, 0x00020A00, 0x00120A00, + 0x00020200, 0x00120200, 0x00020A00, 0x00120A00, + 0x04020200, 0x04120200, 0x04020A00, 0x04120A00, + 0x04020200, 0x04120200, 0x04020A00, 0x04120A00, + 0x00020204, 0x00120204, 0x00020A04, 0x00120A04, + 0x00020204, 0x00120204, 0x00020A04, 0x00120A04, + 0x04020204, 0x04120204, 0x04020A04, 0x04120A04, + 0x04020204, 0x04120204, 0x04020A04, 0x04120A04, + 0x00020200, 0x00120200, 0x00020A00, 0x00120A00, + 0x00020200, 0x00120200, 0x00020A00, 0x00120A00, + 0x04020200, 0x04120200, 0x04020A00, 0x04120A00, + 0x04020200, 0x04120200, 0x04020A00, 0x04120A00, + 0x00020204, 0x00120204, 0x00020A04, 0x00120A04, + 0x00020204, 0x00120204, 0x00020A04, 0x00120A04, + 0x04020204, 0x04120204, 0x04020A04, 0x04120A04, + 0x04020204, 0x04120204, 0x04020A04, 0x04120A04 + ]; + static $pc2mapd3 = [ + 0x00000000, 0x00010000, 0x02000000, 0x02010000, + 0x00000020, 0x00010020, 0x02000020, 0x02010020, + 0x00040000, 0x00050000, 0x02040000, 0x02050000, + 0x00040020, 0x00050020, 0x02040020, 0x02050020, + 0x00002000, 0x00012000, 0x02002000, 0x02012000, + 0x00002020, 0x00012020, 0x02002020, 0x02012020, + 0x00042000, 0x00052000, 0x02042000, 0x02052000, + 0x00042020, 0x00052020, 0x02042020, 0x02052020, + 0x00000000, 0x00010000, 0x02000000, 0x02010000, + 0x00000020, 0x00010020, 0x02000020, 0x02010020, + 0x00040000, 0x00050000, 0x02040000, 0x02050000, + 0x00040020, 0x00050020, 0x02040020, 0x02050020, + 0x00002000, 0x00012000, 0x02002000, 0x02012000, + 0x00002020, 0x00012020, 0x02002020, 0x02012020, + 0x00042000, 0x00052000, 0x02042000, 0x02052000, + 0x00042020, 0x00052020, 0x02042020, 0x02052020, + 0x00000010, 0x00010010, 0x02000010, 0x02010010, + 0x00000030, 0x00010030, 0x02000030, 0x02010030, + 0x00040010, 0x00050010, 0x02040010, 0x02050010, + 0x00040030, 0x00050030, 0x02040030, 0x02050030, + 0x00002010, 0x00012010, 0x02002010, 0x02012010, + 0x00002030, 0x00012030, 0x02002030, 0x02012030, + 0x00042010, 0x00052010, 0x02042010, 0x02052010, + 0x00042030, 0x00052030, 0x02042030, 0x02052030, + 0x00000010, 0x00010010, 0x02000010, 0x02010010, + 0x00000030, 0x00010030, 0x02000030, 0x02010030, + 0x00040010, 0x00050010, 0x02040010, 0x02050010, + 0x00040030, 0x00050030, 0x02040030, 0x02050030, + 0x00002010, 0x00012010, 0x02002010, 0x02012010, + 0x00002030, 0x00012030, 0x02002030, 0x02012030, + 0x00042010, 0x00052010, 0x02042010, 0x02052010, + 0x00042030, 0x00052030, 0x02042030, 0x02052030, + 0x20000000, 0x20010000, 0x22000000, 0x22010000, + 0x20000020, 0x20010020, 0x22000020, 0x22010020, + 0x20040000, 0x20050000, 0x22040000, 0x22050000, + 0x20040020, 0x20050020, 0x22040020, 0x22050020, + 0x20002000, 0x20012000, 0x22002000, 0x22012000, + 0x20002020, 0x20012020, 0x22002020, 0x22012020, + 0x20042000, 0x20052000, 0x22042000, 0x22052000, + 0x20042020, 0x20052020, 0x22042020, 0x22052020, + 0x20000000, 0x20010000, 0x22000000, 0x22010000, + 0x20000020, 0x20010020, 0x22000020, 0x22010020, + 0x20040000, 0x20050000, 0x22040000, 0x22050000, + 0x20040020, 0x20050020, 0x22040020, 0x22050020, + 0x20002000, 0x20012000, 0x22002000, 0x22012000, + 0x20002020, 0x20012020, 0x22002020, 0x22012020, + 0x20042000, 0x20052000, 0x22042000, 0x22052000, + 0x20042020, 0x20052020, 0x22042020, 0x22052020, + 0x20000010, 0x20010010, 0x22000010, 0x22010010, + 0x20000030, 0x20010030, 0x22000030, 0x22010030, + 0x20040010, 0x20050010, 0x22040010, 0x22050010, + 0x20040030, 0x20050030, 0x22040030, 0x22050030, + 0x20002010, 0x20012010, 0x22002010, 0x22012010, + 0x20002030, 0x20012030, 0x22002030, 0x22012030, + 0x20042010, 0x20052010, 0x22042010, 0x22052010, + 0x20042030, 0x20052030, 0x22042030, 0x22052030, + 0x20000010, 0x20010010, 0x22000010, 0x22010010, + 0x20000030, 0x20010030, 0x22000030, 0x22010030, + 0x20040010, 0x20050010, 0x22040010, 0x22050010, + 0x20040030, 0x20050030, 0x22040030, 0x22050030, + 0x20002010, 0x20012010, 0x22002010, 0x22012010, + 0x20002030, 0x20012030, 0x22002030, 0x22012030, + 0x20042010, 0x20052010, 0x22042010, 0x22052010, + 0x20042030, 0x20052030, 0x22042030, 0x22052030 + ]; + static $pc2mapd4 = [ + 0x00000000, 0x00000400, 0x01000000, 0x01000400, + 0x00000000, 0x00000400, 0x01000000, 0x01000400, + 0x00000100, 0x00000500, 0x01000100, 0x01000500, + 0x00000100, 0x00000500, 0x01000100, 0x01000500, + 0x10000000, 0x10000400, 0x11000000, 0x11000400, + 0x10000000, 0x10000400, 0x11000000, 0x11000400, + 0x10000100, 0x10000500, 0x11000100, 0x11000500, + 0x10000100, 0x10000500, 0x11000100, 0x11000500, + 0x00080000, 0x00080400, 0x01080000, 0x01080400, + 0x00080000, 0x00080400, 0x01080000, 0x01080400, + 0x00080100, 0x00080500, 0x01080100, 0x01080500, + 0x00080100, 0x00080500, 0x01080100, 0x01080500, + 0x10080000, 0x10080400, 0x11080000, 0x11080400, + 0x10080000, 0x10080400, 0x11080000, 0x11080400, + 0x10080100, 0x10080500, 0x11080100, 0x11080500, + 0x10080100, 0x10080500, 0x11080100, 0x11080500, + 0x00000008, 0x00000408, 0x01000008, 0x01000408, + 0x00000008, 0x00000408, 0x01000008, 0x01000408, + 0x00000108, 0x00000508, 0x01000108, 0x01000508, + 0x00000108, 0x00000508, 0x01000108, 0x01000508, + 0x10000008, 0x10000408, 0x11000008, 0x11000408, + 0x10000008, 0x10000408, 0x11000008, 0x11000408, + 0x10000108, 0x10000508, 0x11000108, 0x11000508, + 0x10000108, 0x10000508, 0x11000108, 0x11000508, + 0x00080008, 0x00080408, 0x01080008, 0x01080408, + 0x00080008, 0x00080408, 0x01080008, 0x01080408, + 0x00080108, 0x00080508, 0x01080108, 0x01080508, + 0x00080108, 0x00080508, 0x01080108, 0x01080508, + 0x10080008, 0x10080408, 0x11080008, 0x11080408, + 0x10080008, 0x10080408, 0x11080008, 0x11080408, + 0x10080108, 0x10080508, 0x11080108, 0x11080508, + 0x10080108, 0x10080508, 0x11080108, 0x11080508, + 0x00001000, 0x00001400, 0x01001000, 0x01001400, + 0x00001000, 0x00001400, 0x01001000, 0x01001400, + 0x00001100, 0x00001500, 0x01001100, 0x01001500, + 0x00001100, 0x00001500, 0x01001100, 0x01001500, + 0x10001000, 0x10001400, 0x11001000, 0x11001400, + 0x10001000, 0x10001400, 0x11001000, 0x11001400, + 0x10001100, 0x10001500, 0x11001100, 0x11001500, + 0x10001100, 0x10001500, 0x11001100, 0x11001500, + 0x00081000, 0x00081400, 0x01081000, 0x01081400, + 0x00081000, 0x00081400, 0x01081000, 0x01081400, + 0x00081100, 0x00081500, 0x01081100, 0x01081500, + 0x00081100, 0x00081500, 0x01081100, 0x01081500, + 0x10081000, 0x10081400, 0x11081000, 0x11081400, + 0x10081000, 0x10081400, 0x11081000, 0x11081400, + 0x10081100, 0x10081500, 0x11081100, 0x11081500, + 0x10081100, 0x10081500, 0x11081100, 0x11081500, + 0x00001008, 0x00001408, 0x01001008, 0x01001408, + 0x00001008, 0x00001408, 0x01001008, 0x01001408, + 0x00001108, 0x00001508, 0x01001108, 0x01001508, + 0x00001108, 0x00001508, 0x01001108, 0x01001508, + 0x10001008, 0x10001408, 0x11001008, 0x11001408, + 0x10001008, 0x10001408, 0x11001008, 0x11001408, + 0x10001108, 0x10001508, 0x11001108, 0x11001508, + 0x10001108, 0x10001508, 0x11001108, 0x11001508, + 0x00081008, 0x00081408, 0x01081008, 0x01081408, + 0x00081008, 0x00081408, 0x01081008, 0x01081408, + 0x00081108, 0x00081508, 0x01081108, 0x01081508, + 0x00081108, 0x00081508, 0x01081108, 0x01081508, + 0x10081008, 0x10081408, 0x11081008, 0x11081408, + 0x10081008, 0x10081408, 0x11081008, 0x11081408, + 0x10081108, 0x10081508, 0x11081108, 0x11081508, + 0x10081108, 0x10081508, 0x11081108, 0x11081508 + ]; + $keys = []; for ($des_round = 0; $des_round < $this->des_rounds; ++$des_round) { // pad the key and remove extra characters as appropriate. - $key = \str_pad(\substr($this->key, $des_round * 8, 8), 8, "\x00"); + $key = str_pad(substr($this->key, $des_round * 8, 8), 8, "\0"); + // Perform the PC/1 transformation and compute C and D. - $t = \unpack('Nl/Nr', $key); + $t = unpack('Nl/Nr', $key); list($l, $r) = [$t['l'], $t['r']]; - $key = self::$shuffle[$pc1map[$r & 0xff]] & "\x80\x80\x80\x80\x80\x80\x80\x00" | self::$shuffle[$pc1map[$r >> 8 & 0xff]] & "@@@@@@@\x00" | self::$shuffle[$pc1map[$r >> 16 & 0xff]] & " \x00" | self::$shuffle[$pc1map[$r >> 24 & 0xff]] & "\x10\x10\x10\x10\x10\x10\x10\x00" | self::$shuffle[$pc1map[$l & 0xff]] & "\x08\x08\x08\x08\x08\x08\x08\x00" | self::$shuffle[$pc1map[$l >> 8 & 0xff]] & "\x04\x04\x04\x04\x04\x04\x04\x00" | self::$shuffle[$pc1map[$l >> 16 & 0xff]] & "\x02\x02\x02\x02\x02\x02\x02\x00" | self::$shuffle[$pc1map[$l >> 24 & 0xff]] & "\x01\x01\x01\x01\x01\x01\x01\x00"; - $key = \unpack('Nc/Nd', $key); - $c = $key['c'] >> 4 & 0xfffffff; - $d = $key['d'] >> 4 & 0xffffff0 | $key['c'] & 0xf; - $keys[$des_round] = [self::ENCRYPT => [], self::DECRYPT => \array_fill(0, 32, 0)]; + $key = (self::$shuffle[$pc1map[ $r & 0xFF]] & "\x80\x80\x80\x80\x80\x80\x80\x00") | + (self::$shuffle[$pc1map[($r >> 8) & 0xFF]] & "\x40\x40\x40\x40\x40\x40\x40\x00") | + (self::$shuffle[$pc1map[($r >> 16) & 0xFF]] & "\x20\x20\x20\x20\x20\x20\x20\x00") | + (self::$shuffle[$pc1map[($r >> 24) & 0xFF]] & "\x10\x10\x10\x10\x10\x10\x10\x00") | + (self::$shuffle[$pc1map[ $l & 0xFF]] & "\x08\x08\x08\x08\x08\x08\x08\x00") | + (self::$shuffle[$pc1map[($l >> 8) & 0xFF]] & "\x04\x04\x04\x04\x04\x04\x04\x00") | + (self::$shuffle[$pc1map[($l >> 16) & 0xFF]] & "\x02\x02\x02\x02\x02\x02\x02\x00") | + (self::$shuffle[$pc1map[($l >> 24) & 0xFF]] & "\x01\x01\x01\x01\x01\x01\x01\x00"); + $key = unpack('Nc/Nd', $key); + $c = ( $key['c'] >> 4) & 0x0FFFFFFF; + $d = (($key['d'] >> 4) & 0x0FFFFFF0) | ($key['c'] & 0x0F); + + $keys[$des_round] = [ + self::ENCRYPT => [], + self::DECRYPT => array_fill(0, 32, 0) + ]; for ($i = 0, $ki = 31; $i < 16; ++$i, $ki -= 2) { $c <<= $shifts[$i]; - $c = ($c | $c >> 28) & 0xfffffff; + $c = ($c | ($c >> 28)) & 0x0FFFFFFF; $d <<= $shifts[$i]; - $d = ($d | $d >> 28) & 0xfffffff; + $d = ($d | ($d >> 28)) & 0x0FFFFFFF; + // Perform the PC-2 transformation. - $cp = $pc2mapc1[$c >> 24] | $pc2mapc2[$c >> 16 & 0xff] | $pc2mapc3[$c >> 8 & 0xff] | $pc2mapc4[$c & 0xff]; - $dp = $pc2mapd1[$d >> 24] | $pc2mapd2[$d >> 16 & 0xff] | $pc2mapd3[$d >> 8 & 0xff] | $pc2mapd4[$d & 0xff]; + $cp = $pc2mapc1[ $c >> 24 ] | $pc2mapc2[($c >> 16) & 0xFF] | + $pc2mapc3[($c >> 8) & 0xFF] | $pc2mapc4[ $c & 0xFF]; + $dp = $pc2mapd1[ $d >> 24 ] | $pc2mapd2[($d >> 16) & 0xFF] | + $pc2mapd3[($d >> 8) & 0xFF] | $pc2mapd4[ $d & 0xFF]; + // Reorder: odd bytes/even bytes. Push the result in key schedule. - $val1 = $cp & \intval(0xff000000) | $cp << 8 & 0xff0000 | $dp >> 16 & 0xff00 | $dp >> 8 & 0xff; - $val2 = $cp << 8 & \intval(0xff000000) | $cp << 16 & 0xff0000 | $dp >> 8 & 0xff00 | $dp & 0xff; - $keys[$des_round][self::ENCRYPT][] = $val1; + $val1 = ( $cp & intval(0xFF000000)) | (($cp << 8) & 0x00FF0000) | + (($dp >> 16) & 0x0000FF00) | (($dp >> 8) & 0x000000FF); + $val2 = (($cp << 8) & intval(0xFF000000)) | (($cp << 16) & 0x00FF0000) | + (($dp >> 8) & 0x0000FF00) | ( $dp & 0x000000FF); + $keys[$des_round][self::ENCRYPT][ ] = $val1; $keys[$des_round][self::DECRYPT][$ki - 1] = $val1; - $keys[$des_round][self::ENCRYPT][] = $val2; - $keys[$des_round][self::DECRYPT][$ki] = $val2; + $keys[$des_round][self::ENCRYPT][ ] = $val2; + $keys[$des_round][self::DECRYPT][$ki ] = $val2; } } + switch ($this->des_rounds) { - case 3: - // 3DES keys - $this->keys = [self::ENCRYPT => \array_merge($keys[0][self::ENCRYPT], $keys[1][self::DECRYPT], $keys[2][self::ENCRYPT]), self::DECRYPT => \array_merge($keys[2][self::DECRYPT], $keys[1][self::ENCRYPT], $keys[0][self::DECRYPT])]; + case 3: // 3DES keys + $this->keys = [ + self::ENCRYPT => array_merge( + $keys[0][self::ENCRYPT], + $keys[1][self::DECRYPT], + $keys[2][self::ENCRYPT] + ), + self::DECRYPT => array_merge( + $keys[2][self::DECRYPT], + $keys[1][self::ENCRYPT], + $keys[0][self::DECRYPT] + ) + ]; break; // case 1: // DES keys default: - $this->keys = [self::ENCRYPT => $keys[0][self::ENCRYPT], self::DECRYPT => $keys[0][self::DECRYPT]]; + $this->keys = [ + self::ENCRYPT => $keys[0][self::ENCRYPT], + self::DECRYPT => $keys[0][self::DECRYPT] + ]; } } + /** * Setup the performance-optimized function for de/encrypt() * @@ -442,6 +1289,7 @@ protected function setupInlineCrypt() // - DES ($des_rounds == 1) or // - 3DES ($des_rounds == 3) $des_rounds = $this->des_rounds; + $init_crypt = 'static $sbox1, $sbox2, $sbox3, $sbox4, $sbox5, $sbox6, $sbox7, $sbox8, $shuffleip, $shuffleinvip; if (!$sbox1) { $sbox1 = array_map("intval", self::$sbox1); @@ -451,16 +1299,22 @@ protected function setupInlineCrypt() $sbox5 = array_map("intval", self::$sbox5); $sbox6 = array_map("intval", self::$sbox6); $sbox7 = array_map("intval", self::$sbox7); - $sbox8 = array_map("intval", self::$sbox8);' . ' + $sbox8 = array_map("intval", self::$sbox8);' + /* Merge $shuffle with $[inv]ipmap */ . ' for ($i = 0; $i < 256; ++$i) { $shuffleip[] = self::$shuffle[self::$ipmap[$i]]; $shuffleinvip[] = self::$shuffle[self::$invipmap[$i]]; } } '; - $k = [self::ENCRYPT => $this->keys[self::ENCRYPT], self::DECRYPT => $this->keys[self::DECRYPT]]; + + $k = [ + self::ENCRYPT => $this->keys[self::ENCRYPT], + self::DECRYPT => $this->keys[self::DECRYPT] + ]; $init_encrypt = ''; $init_decrypt = ''; + // Creating code for en- and decryption. $crypt_block = []; foreach ([self::ENCRYPT, self::DECRYPT] as $c) { @@ -470,21 +1324,23 @@ protected function setupInlineCrypt() $l = $in[1]; $r = $in[2]; $in = unpack("N*", - ($shuffleip[ $r & 0xFF] & "\\x80\\x80\\x80\\x80\\x80\\x80\\x80\\x80") | - ($shuffleip[($r >> 8) & 0xFF] & "\\x40\\x40\\x40\\x40\\x40\\x40\\x40\\x40") | - ($shuffleip[($r >> 16) & 0xFF] & "\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20") | - ($shuffleip[($r >> 24) & 0xFF] & "\\x10\\x10\\x10\\x10\\x10\\x10\\x10\\x10") | - ($shuffleip[ $l & 0xFF] & "\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08") | - ($shuffleip[($l >> 8) & 0xFF] & "\\x04\\x04\\x04\\x04\\x04\\x04\\x04\\x04") | - ($shuffleip[($l >> 16) & 0xFF] & "\\x02\\x02\\x02\\x02\\x02\\x02\\x02\\x02") | - ($shuffleip[($l >> 24) & 0xFF] & "\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01") + ($shuffleip[ $r & 0xFF] & "\x80\x80\x80\x80\x80\x80\x80\x80") | + ($shuffleip[($r >> 8) & 0xFF] & "\x40\x40\x40\x40\x40\x40\x40\x40") | + ($shuffleip[($r >> 16) & 0xFF] & "\x20\x20\x20\x20\x20\x20\x20\x20") | + ($shuffleip[($r >> 24) & 0xFF] & "\x10\x10\x10\x10\x10\x10\x10\x10") | + ($shuffleip[ $l & 0xFF] & "\x08\x08\x08\x08\x08\x08\x08\x08") | + ($shuffleip[($l >> 8) & 0xFF] & "\x04\x04\x04\x04\x04\x04\x04\x04") | + ($shuffleip[($l >> 16) & 0xFF] & "\x02\x02\x02\x02\x02\x02\x02\x02") | + ($shuffleip[($l >> 24) & 0xFF] & "\x01\x01\x01\x01\x01\x01\x01\x01") ); - ' . ' + ' . /* Extract L0 and R0 */ ' $l = $in[1]; $r = $in[2]; '; + $l = '$l'; $r = '$r'; + // Perform DES or 3DES. for ($ki = -1, $des_round = 0; $des_round < $des_rounds; ++$des_round) { // Perform the 16 steps. @@ -494,30 +1350,43 @@ protected function setupInlineCrypt() // Merge key schedule. $crypt_block[$c] .= ' $b1 = ((' . $r . ' >> 3) & 0x1FFFFFFF) ^ (' . $r . ' << 29) ^ ' . $k[$c][++$ki] . '; - $b2 = ((' . $r . ' >> 31) & 0x00000001) ^ (' . $r . ' << 1) ^ ' . $k[$c][++$ki] . ';' . $l . ' = $sbox1[($b1 >> 24) & 0x3F] ^ $sbox2[($b2 >> 24) & 0x3F] ^ + $b2 = ((' . $r . ' >> 31) & 0x00000001) ^ (' . $r . ' << 1) ^ ' . $k[$c][++$ki] . ';' . + /* S-box indexing. */ + $l . ' = $sbox1[($b1 >> 24) & 0x3F] ^ $sbox2[($b2 >> 24) & 0x3F] ^ $sbox3[($b1 >> 16) & 0x3F] ^ $sbox4[($b2 >> 16) & 0x3F] ^ $sbox5[($b1 >> 8) & 0x3F] ^ $sbox6[($b2 >> 8) & 0x3F] ^ $sbox7[ $b1 & 0x3F] ^ $sbox8[ $b2 & 0x3F] ^ ' . $l . '; '; // end of "the Feistel (F) function" + // swap L & R list($l, $r) = [$r, $l]; } list($l, $r) = [$r, $l]; } + // Perform the inverse IP permutation. $crypt_block[$c] .= '$in = - ($shuffleinvip[($l >> 24) & 0xFF] & "\\x80\\x80\\x80\\x80\\x80\\x80\\x80\\x80") | - ($shuffleinvip[($r >> 24) & 0xFF] & "\\x40\\x40\\x40\\x40\\x40\\x40\\x40\\x40") | - ($shuffleinvip[($l >> 16) & 0xFF] & "\\x20\\x20\\x20\\x20\\x20\\x20\\x20\\x20") | - ($shuffleinvip[($r >> 16) & 0xFF] & "\\x10\\x10\\x10\\x10\\x10\\x10\\x10\\x10") | - ($shuffleinvip[($l >> 8) & 0xFF] & "\\x08\\x08\\x08\\x08\\x08\\x08\\x08\\x08") | - ($shuffleinvip[($r >> 8) & 0xFF] & "\\x04\\x04\\x04\\x04\\x04\\x04\\x04\\x04") | - ($shuffleinvip[ $l & 0xFF] & "\\x02\\x02\\x02\\x02\\x02\\x02\\x02\\x02") | - ($shuffleinvip[ $r & 0xFF] & "\\x01\\x01\\x01\\x01\\x01\\x01\\x01\\x01"); + ($shuffleinvip[($l >> 24) & 0xFF] & "\x80\x80\x80\x80\x80\x80\x80\x80") | + ($shuffleinvip[($r >> 24) & 0xFF] & "\x40\x40\x40\x40\x40\x40\x40\x40") | + ($shuffleinvip[($l >> 16) & 0xFF] & "\x20\x20\x20\x20\x20\x20\x20\x20") | + ($shuffleinvip[($r >> 16) & 0xFF] & "\x10\x10\x10\x10\x10\x10\x10\x10") | + ($shuffleinvip[($l >> 8) & 0xFF] & "\x08\x08\x08\x08\x08\x08\x08\x08") | + ($shuffleinvip[($r >> 8) & 0xFF] & "\x04\x04\x04\x04\x04\x04\x04\x04") | + ($shuffleinvip[ $l & 0xFF] & "\x02\x02\x02\x02\x02\x02\x02\x02") | + ($shuffleinvip[ $r & 0xFF] & "\x01\x01\x01\x01\x01\x01\x01\x01"); '; } + // Creates the inline-crypt function - $this->inline_crypt = $this->createInlineCryptFunction(['init_crypt' => $init_crypt, 'init_encrypt' => $init_encrypt, 'init_decrypt' => $init_decrypt, 'encrypt_block' => $crypt_block[self::ENCRYPT], 'decrypt_block' => $crypt_block[self::DECRYPT]]); + $this->inline_crypt = $this->createInlineCryptFunction( + [ + 'init_crypt' => $init_crypt, + 'init_encrypt' => $init_encrypt, + 'init_decrypt' => $init_decrypt, + 'encrypt_block' => $crypt_block[self::ENCRYPT], + 'decrypt_block' => $crypt_block[self::DECRYPT] + ] + ); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/DH.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/DH.php index 3535839..f1bde41 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/DH.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/DH.php @@ -21,6 +21,7 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt; use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\AsymmetricKey; @@ -30,11 +31,11 @@ use OCA\Libresign\Vendor\phpseclib3\Exception\NoKeyLoadedException; use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedOperationException; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * Pure-PHP (EC)DH implementation * * @author Jim Wigginton - * @internal */ abstract class DH extends AsymmetricKey { @@ -44,12 +45,14 @@ abstract class DH extends AsymmetricKey * @var string */ const ALGORITHM = 'DH'; + /** * DH prime * * @var BigInteger */ protected $prime; + /** * DH Base * @@ -58,12 +61,14 @@ abstract class DH extends AsymmetricKey * @var BigInteger */ protected $base; + /** * Public Key * * @var BigInteger */ protected $publicKey; + /** * Create DH parameters * @@ -80,60 +85,149 @@ public static function createParameters(...$args) if ($class->isFinal()) { throw new \RuntimeException('createParameters() should not be called from final classes (' . static::class . ')'); } + $params = new Parameters(); - if (\count($args) == 2 && $args[0] instanceof BigInteger && $args[1] instanceof BigInteger) { + if (count($args) == 2 && $args[0] instanceof BigInteger && $args[1] instanceof BigInteger) { //if (!$args[0]->isPrime()) { // throw new \InvalidArgumentException('The first parameter should be a prime number'); //} $params->prime = $args[0]; $params->base = $args[1]; return $params; - } elseif (\count($args) == 1 && \is_numeric($args[0])) { + } elseif (count($args) == 1 && is_numeric($args[0])) { $params->prime = BigInteger::randomPrime($args[0]); $params->base = new BigInteger(2); return $params; - } elseif (\count($args) != 1 || !\is_string($args[0])) { + } elseif (count($args) != 1 || !is_string($args[0])) { throw new \InvalidArgumentException('Valid parameters are either: two BigInteger\'s (prime and base), a single integer (the length of the prime; base is assumed to be 2) or a string'); } switch ($args[0]) { // see http://tools.ietf.org/html/rfc2409#section-6.2 and // http://tools.ietf.org/html/rfc2412, appendex E case 'diffie-hellman-group1-sha1': - $prime = 'FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74' . '020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437' . '4FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED' . 'EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381FFFFFFFFFFFFFFFF'; + $prime = 'FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74' . + '020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437' . + '4FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED' . + 'EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381FFFFFFFFFFFFFFFF'; break; // see http://tools.ietf.org/html/rfc3526#section-3 - case 'diffie-hellman-group14-sha1': - // 2048-bit MODP Group + case 'diffie-hellman-group14-sha1': // 2048-bit MODP Group case 'diffie-hellman-group14-sha256': - $prime = 'FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74' . '020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437' . '4FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED' . 'EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF05' . '98DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB' . '9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B' . 'E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718' . '3995497CEA956AE515D2261898FA051015728E5A8AACAA68FFFFFFFFFFFFFFFF'; + $prime = 'FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74' . + '020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437' . + '4FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED' . + 'EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF05' . + '98DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB' . + '9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B' . + 'E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718' . + '3995497CEA956AE515D2261898FA051015728E5A8AACAA68FFFFFFFFFFFFFFFF'; break; // see https://tools.ietf.org/html/rfc3526#section-4 - case 'diffie-hellman-group15-sha512': - // 3072-bit MODP Group - $prime = 'FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74' . '020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437' . '4FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED' . 'EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF05' . '98DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB' . '9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B' . 'E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718' . '3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D04507A33' . 'A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7' . 'ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6BF12FFA06D98A0864' . 'D87602733EC86A64521F2B18177B200CBBE117577A615D6C770988C0BAD946E2' . '08E24FA074E5AB3143DB5BFCE0FD108E4B82D120A93AD2CAFFFFFFFFFFFFFFFF'; + case 'diffie-hellman-group15-sha512': // 3072-bit MODP Group + $prime = 'FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74' . + '020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437' . + '4FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED' . + 'EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF05' . + '98DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB' . + '9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B' . + 'E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718' . + '3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D04507A33' . + 'A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7' . + 'ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6BF12FFA06D98A0864' . + 'D87602733EC86A64521F2B18177B200CBBE117577A615D6C770988C0BAD946E2' . + '08E24FA074E5AB3143DB5BFCE0FD108E4B82D120A93AD2CAFFFFFFFFFFFFFFFF'; break; // see https://tools.ietf.org/html/rfc3526#section-5 - case 'diffie-hellman-group16-sha512': - // 4096-bit MODP Group - $prime = 'FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74' . '020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437' . '4FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED' . 'EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF05' . '98DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB' . '9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B' . 'E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718' . '3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D04507A33' . 'A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7' . 'ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6BF12FFA06D98A0864' . 'D87602733EC86A64521F2B18177B200CBBE117577A615D6C770988C0BAD946E2' . '08E24FA074E5AB3143DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D7' . '88719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8' . 'DBBBC2DB04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2' . '233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA9' . '93B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934063199FFFFFFFFFFFFFFFF'; + case 'diffie-hellman-group16-sha512': // 4096-bit MODP Group + $prime = 'FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74' . + '020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437' . + '4FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED' . + 'EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF05' . + '98DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB' . + '9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B' . + 'E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718' . + '3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D04507A33' . + 'A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7' . + 'ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6BF12FFA06D98A0864' . + 'D87602733EC86A64521F2B18177B200CBBE117577A615D6C770988C0BAD946E2' . + '08E24FA074E5AB3143DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D7' . + '88719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8' . + 'DBBBC2DB04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2' . + '233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA9' . + '93B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934063199FFFFFFFFFFFFFFFF'; break; // see https://tools.ietf.org/html/rfc3526#section-6 - case 'diffie-hellman-group17-sha512': - // 6144-bit MODP Group - $prime = 'FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74' . '020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437' . '4FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED' . 'EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF05' . '98DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB' . '9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B' . 'E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718' . '3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D04507A33' . 'A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7' . 'ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6BF12FFA06D98A0864' . 'D87602733EC86A64521F2B18177B200CBBE117577A615D6C770988C0BAD946E2' . '08E24FA074E5AB3143DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D7' . '88719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8' . 'DBBBC2DB04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2' . '233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA9' . '93B4EA988D8FDDC186FFB7DC90A6C08F4DF435C93402849236C3FAB4D27C7026' . 'C1D4DCB2602646DEC9751E763DBA37BDF8FF9406AD9E530EE5DB382F413001AE' . 'B06A53ED9027D831179727B0865A8918DA3EDBEBCF9B14ED44CE6CBACED4BB1B' . 'DB7F1447E6CC254B332051512BD7AF426FB8F401378CD2BF5983CA01C64B92EC' . 'F032EA15D1721D03F482D7CE6E74FEF6D55E702F46980C82B5A84031900B1C9E' . '59E7C97FBEC7E8F323A97A7E36CC88BE0F1D45B7FF585AC54BD407B22B4154AA' . 'CC8F6D7EBF48E1D814CC5ED20F8037E0A79715EEF29BE32806A1D58BB7C5DA76' . 'F550AA3D8A1FBFF0EB19CCB1A313D55CDA56C9EC2EF29632387FE8D76E3C0468' . '043E8F663F4860EE12BF2D5B0B7474D6E694F91E6DCC4024FFFFFFFFFFFFFFFF'; + case 'diffie-hellman-group17-sha512': // 6144-bit MODP Group + $prime = 'FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74' . + '020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437' . + '4FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED' . + 'EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF05' . + '98DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB' . + '9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B' . + 'E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718' . + '3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D04507A33' . + 'A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7' . + 'ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6BF12FFA06D98A0864' . + 'D87602733EC86A64521F2B18177B200CBBE117577A615D6C770988C0BAD946E2' . + '08E24FA074E5AB3143DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D7' . + '88719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8' . + 'DBBBC2DB04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2' . + '233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA9' . + '93B4EA988D8FDDC186FFB7DC90A6C08F4DF435C93402849236C3FAB4D27C7026' . + 'C1D4DCB2602646DEC9751E763DBA37BDF8FF9406AD9E530EE5DB382F413001AE' . + 'B06A53ED9027D831179727B0865A8918DA3EDBEBCF9B14ED44CE6CBACED4BB1B' . + 'DB7F1447E6CC254B332051512BD7AF426FB8F401378CD2BF5983CA01C64B92EC' . + 'F032EA15D1721D03F482D7CE6E74FEF6D55E702F46980C82B5A84031900B1C9E' . + '59E7C97FBEC7E8F323A97A7E36CC88BE0F1D45B7FF585AC54BD407B22B4154AA' . + 'CC8F6D7EBF48E1D814CC5ED20F8037E0A79715EEF29BE32806A1D58BB7C5DA76' . + 'F550AA3D8A1FBFF0EB19CCB1A313D55CDA56C9EC2EF29632387FE8D76E3C0468' . + '043E8F663F4860EE12BF2D5B0B7474D6E694F91E6DCC4024FFFFFFFFFFFFFFFF'; break; // see https://tools.ietf.org/html/rfc3526#section-7 - case 'diffie-hellman-group18-sha512': - // 8192-bit MODP Group - $prime = 'FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74' . '020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437' . '4FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED' . 'EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF05' . '98DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB' . '9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B' . 'E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718' . '3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D04507A33' . 'A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7' . 'ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6BF12FFA06D98A0864' . 'D87602733EC86A64521F2B18177B200CBBE117577A615D6C770988C0BAD946E2' . '08E24FA074E5AB3143DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D7' . '88719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8' . 'DBBBC2DB04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2' . '233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA9' . '93B4EA988D8FDDC186FFB7DC90A6C08F4DF435C93402849236C3FAB4D27C7026' . 'C1D4DCB2602646DEC9751E763DBA37BDF8FF9406AD9E530EE5DB382F413001AE' . 'B06A53ED9027D831179727B0865A8918DA3EDBEBCF9B14ED44CE6CBACED4BB1B' . 'DB7F1447E6CC254B332051512BD7AF426FB8F401378CD2BF5983CA01C64B92EC' . 'F032EA15D1721D03F482D7CE6E74FEF6D55E702F46980C82B5A84031900B1C9E' . '59E7C97FBEC7E8F323A97A7E36CC88BE0F1D45B7FF585AC54BD407B22B4154AA' . 'CC8F6D7EBF48E1D814CC5ED20F8037E0A79715EEF29BE32806A1D58BB7C5DA76' . 'F550AA3D8A1FBFF0EB19CCB1A313D55CDA56C9EC2EF29632387FE8D76E3C0468' . '043E8F663F4860EE12BF2D5B0B7474D6E694F91E6DBE115974A3926F12FEE5E4' . '38777CB6A932DF8CD8BEC4D073B931BA3BC832B68D9DD300741FA7BF8AFC47ED' . '2576F6936BA424663AAB639C5AE4F5683423B4742BF1C978238F16CBE39D652D' . 'E3FDB8BEFC848AD922222E04A4037C0713EB57A81A23F0C73473FC646CEA306B' . '4BCBC8862F8385DDFA9D4B7FA2C087E879683303ED5BDD3A062B3CF5B3A278A6' . '6D2A13F83F44F82DDF310EE074AB6A364597E899A0255DC164F31CC50846851D' . 'F9AB48195DED7EA1B1D510BD7EE74D73FAF36BC31ECFA268359046F4EB879F92' . '4009438B481C6CD7889A002ED5EE382BC9190DA6FC026E479558E4475677E9AA' . '9E3050E2765694DFC81F56E880B96E7160C980DD98EDD3DFFFFFFFFFFFFFFFFF'; + case 'diffie-hellman-group18-sha512': // 8192-bit MODP Group + $prime = 'FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74' . + '020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437' . + '4FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED' . + 'EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF05' . + '98DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB' . + '9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B' . + 'E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718' . + '3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D04507A33' . + 'A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7' . + 'ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6BF12FFA06D98A0864' . + 'D87602733EC86A64521F2B18177B200CBBE117577A615D6C770988C0BAD946E2' . + '08E24FA074E5AB3143DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D7' . + '88719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8' . + 'DBBBC2DB04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2' . + '233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA9' . + '93B4EA988D8FDDC186FFB7DC90A6C08F4DF435C93402849236C3FAB4D27C7026' . + 'C1D4DCB2602646DEC9751E763DBA37BDF8FF9406AD9E530EE5DB382F413001AE' . + 'B06A53ED9027D831179727B0865A8918DA3EDBEBCF9B14ED44CE6CBACED4BB1B' . + 'DB7F1447E6CC254B332051512BD7AF426FB8F401378CD2BF5983CA01C64B92EC' . + 'F032EA15D1721D03F482D7CE6E74FEF6D55E702F46980C82B5A84031900B1C9E' . + '59E7C97FBEC7E8F323A97A7E36CC88BE0F1D45B7FF585AC54BD407B22B4154AA' . + 'CC8F6D7EBF48E1D814CC5ED20F8037E0A79715EEF29BE32806A1D58BB7C5DA76' . + 'F550AA3D8A1FBFF0EB19CCB1A313D55CDA56C9EC2EF29632387FE8D76E3C0468' . + '043E8F663F4860EE12BF2D5B0B7474D6E694F91E6DBE115974A3926F12FEE5E4' . + '38777CB6A932DF8CD8BEC4D073B931BA3BC832B68D9DD300741FA7BF8AFC47ED' . + '2576F6936BA424663AAB639C5AE4F5683423B4742BF1C978238F16CBE39D652D' . + 'E3FDB8BEFC848AD922222E04A4037C0713EB57A81A23F0C73473FC646CEA306B' . + '4BCBC8862F8385DDFA9D4B7FA2C087E879683303ED5BDD3A062B3CF5B3A278A6' . + '6D2A13F83F44F82DDF310EE074AB6A364597E899A0255DC164F31CC50846851D' . + 'F9AB48195DED7EA1B1D510BD7EE74D73FAF36BC31ECFA268359046F4EB879F92' . + '4009438B481C6CD7889A002ED5EE382BC9190DA6FC026E479558E4475677E9AA' . + '9E3050E2765694DFC81F56E880B96E7160C980DD98EDD3DFFFFFFFFFFFFFFFFF'; break; default: throw new \InvalidArgumentException('Invalid named prime provided'); } + $params->prime = new BigInteger($prime, 16); $params->base = new BigInteger(2); + return $params; } + /** * Create public / private key pair. * @@ -157,6 +251,7 @@ public static function createKey(Parameters $params, $length = 0) if ($class->isFinal()) { throw new \RuntimeException('createKey() should not be called from final classes (' . static::class . ')'); } + $one = new BigInteger(1); if ($length) { $max = $one->bitwise_leftShift($length); @@ -164,6 +259,7 @@ public static function createKey(Parameters $params, $length = 0) } else { $max = $params->prime->subtract($one); } + $key = new PrivateKey(); $key->prime = $params->prime; $key->base = $params->base; @@ -171,6 +267,7 @@ public static function createKey(Parameters $params, $length = 0) $key->publicKey = $key->base->powMod($key->privateKey, $key->prime); return $key; } + /** * Compute Shared Secret * @@ -180,29 +277,29 @@ public static function createKey(Parameters $params, $length = 0) */ public static function computeSecret($private, $public) { - if ($private instanceof PrivateKey) { - // DH\PrivateKey - switch (\true) { + if ($private instanceof PrivateKey) { // DH\PrivateKey + switch (true) { case $public instanceof PublicKey: if (!$private->prime->equals($public->prime) || !$private->base->equals($public->base)) { throw new \InvalidArgumentException('The public and private key do not share the same prime and / or base numbers'); } - return $public->publicKey->powMod($private->privateKey, $private->prime)->toBytes(\true); - case \is_string($public): + return $public->publicKey->powMod($private->privateKey, $private->prime)->toBytes(true); + case is_string($public): $public = new BigInteger($public, -256); - // fall-through + // fall-through case $public instanceof BigInteger: - return $public->powMod($private->privateKey, $private->prime)->toBytes(\true); + return $public->powMod($private->privateKey, $private->prime)->toBytes(true); default: - throw new \InvalidArgumentException('$public needs to be an instance of DH\\PublicKey, a BigInteger or a string'); + throw new \InvalidArgumentException('$public needs to be an instance of DH\PublicKey, a BigInteger or a string'); } } + if ($private instanceof EC\PrivateKey) { - switch (\true) { + switch (true) { case $public instanceof EC\PublicKey: $public = $public->getEncodedCoordinates(); - // fall-through - case \is_string($public): + // fall-through + case is_string($public): $point = $private->multiply($public); switch ($private->getCurve()) { case 'Curve25519': @@ -211,7 +308,7 @@ public static function computeSecret($private, $public) break; default: // according to https://www.secg.org/sec1-v2.pdf#page=33 only X is returned - $secret = \substr($point, 1, \strlen($point) - 1 >> 1); + $secret = substr($point, 1, (strlen($point) - 1) >> 1); } /* if (($secret[0] & "\x80") === "\x80") { @@ -220,10 +317,11 @@ public static function computeSecret($private, $public) */ return $secret; default: - throw new \InvalidArgumentException('$public needs to be an instance of EC\\PublicKey or a string (an encoded coordinate)'); + throw new \InvalidArgumentException('$public needs to be an instance of EC\PublicKey or a string (an encoded coordinate)'); } } } + /** * Load the key * @@ -231,14 +329,16 @@ public static function computeSecret($private, $public) * @param string $password optional * @return AsymmetricKey */ - public static function load($key, $password = \false) + public static function load($key, $password = false) { try { return EC::load($key, $password); } catch (NoKeyLoadedException $e) { } + return parent::load($key, $password); } + /** * OnLoad Handler * @@ -249,18 +349,24 @@ protected static function onLoad(array $components) if (!isset($components['privateKey']) && !isset($components['publicKey'])) { $new = new Parameters(); } else { - $new = isset($components['privateKey']) ? new PrivateKey() : new PublicKey(); + $new = isset($components['privateKey']) ? + new PrivateKey() : + new PublicKey(); } + $new->prime = $components['prime']; $new->base = $components['base']; + if (isset($components['privateKey'])) { $new->privateKey = $components['privateKey']; } if (isset($components['publicKey'])) { $new->publicKey = $components['publicKey']; } + return $new; } + /** * Determines which hashing function should be used * @@ -270,6 +376,7 @@ public function withHash($hash) { throw new UnsupportedOperationException('DH does not use a hash algorithm'); } + /** * Returns the hash algorithm currently being used * @@ -278,6 +385,7 @@ public function getHash() { throw new UnsupportedOperationException('DH does not use a hash algorithm'); } + /** * Returns the parameters * @@ -290,6 +398,7 @@ public function getHash() public function getParameters() { $type = DH::validatePlugin('Keys', 'PKCS1', 'saveParameters'); + $key = $type::saveParameters($this->prime, $this->base); return DH::load($key, 'PKCS1'); } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/DH/Formats/Keys/PKCS1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/DH/Formats/Keys/PKCS1.php index 98406f2..49e1ecf 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/DH/Formats/Keys/PKCS1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/DH/Formats/Keys/PKCS1.php @@ -18,17 +18,18 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\DH\Formats\Keys; use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Keys\PKCS1 as Progenitor; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; use OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * "PKCS1" Formatted DH Key Handler * * @author Jim Wigginton - * @internal */ abstract class PKCS1 extends Progenitor { @@ -42,16 +43,20 @@ abstract class PKCS1 extends Progenitor public static function load($key, $password = '') { $key = parent::load($key, $password); + $decoded = ASN1::decodeBER($key); if (!$decoded) { throw new \RuntimeException('Unable to decode BER'); } + $components = ASN1::asn1map($decoded[0], Maps\DHParameter::MAP); - if (!\is_array($components)) { + if (!is_array($components)) { throw new \RuntimeException('Unable to perform ASN1 mapping on parameters'); } + return $components; } + /** * Convert EC parameters to the appropriate format * @@ -59,8 +64,14 @@ public static function load($key, $password = '') */ public static function saveParameters(BigInteger $prime, BigInteger $base, array $options = []) { - $params = ['prime' => $prime, 'base' => $base]; + $params = [ + 'prime' => $prime, + 'base' => $base + ]; $params = ASN1::encodeDER($params, Maps\DHParameter::MAP); - return "-----BEGIN DH PARAMETERS-----\r\n" . \chunk_split(\base64_encode($params), 64) . "-----END DH PARAMETERS-----\r\n"; + + return "-----BEGIN DH PARAMETERS-----\r\n" . + chunk_split(base64_encode($params), 64) . + "-----END DH PARAMETERS-----\r\n"; } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/DH/Formats/Keys/PKCS8.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/DH/Formats/Keys/PKCS8.php index 0843cf7..df981c3 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/DH/Formats/Keys/PKCS8.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/DH/Formats/Keys/PKCS8.php @@ -16,17 +16,18 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\DH\Formats\Keys; use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Keys\PKCS8 as Progenitor; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; use OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * PKCS#8 Formatted DH Key Handler * * @author Jim Wigginton - * @internal */ abstract class PKCS8 extends Progenitor { @@ -36,18 +37,21 @@ abstract class PKCS8 extends Progenitor * @var string */ const OID_NAME = 'dhKeyAgreement'; + /** * OID Value * * @var string */ const OID_VALUE = '1.2.840.113549.1.3.1'; + /** * Child OIDs loaded * * @var bool */ - protected static $childOIDsLoaded = \false; + protected static $childOIDsLoaded = false; + /** * Break a public or private key down into its constituent components * @@ -58,25 +62,30 @@ abstract class PKCS8 extends Progenitor public static function load($key, $password = '') { $key = parent::load($key, $password); + $type = isset($key['privateKey']) ? 'privateKey' : 'publicKey'; + $decoded = ASN1::decodeBER($key[$type . 'Algorithm']['parameters']->element); if (empty($decoded)) { throw new \RuntimeException('Unable to decode BER of parameters'); } $components = ASN1::asn1map($decoded[0], Maps\DHParameter::MAP); - if (!\is_array($components)) { + if (!is_array($components)) { throw new \RuntimeException('Unable to perform ASN1 mapping on parameters'); } + $decoded = ASN1::decodeBER($key[$type]); - switch (\true) { + switch (true) { case !isset($decoded): case !isset($decoded[0]['content']): case !$decoded[0]['content'] instanceof BigInteger: throw new \RuntimeException('Unable to decode BER of parameters'); } $components[$type] = $decoded[0]['content']; + return $components; } + /** * Convert a private key to the appropriate format. * @@ -90,12 +99,16 @@ public static function load($key, $password = '') */ public static function savePrivateKey(BigInteger $prime, BigInteger $base, BigInteger $privateKey, BigInteger $publicKey, $password = '', array $options = []) { - $params = ['prime' => $prime, 'base' => $base]; + $params = [ + 'prime' => $prime, + 'base' => $base + ]; $params = ASN1::encodeDER($params, Maps\DHParameter::MAP); $params = new ASN1\Element($params); $key = ASN1::encodeDER($privateKey, ['type' => ASN1::TYPE_INTEGER]); return self::wrapPrivateKey($key, [], $params, $password, null, '', $options); } + /** * Convert a public key to the appropriate format * @@ -107,7 +120,10 @@ public static function savePrivateKey(BigInteger $prime, BigInteger $base, BigIn */ public static function savePublicKey(BigInteger $prime, BigInteger $base, BigInteger $publicKey, array $options = []) { - $params = ['prime' => $prime, 'base' => $base]; + $params = [ + 'prime' => $prime, + 'base' => $base + ]; $params = ASN1::encodeDER($params, Maps\DHParameter::MAP); $params = new ASN1\Element($params); $key = ASN1::encodeDER($publicKey, ['type' => ASN1::TYPE_INTEGER]); diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/DH/Parameters.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/DH/Parameters.php index 05b7de1..d26ef5f 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/DH/Parameters.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/DH/Parameters.php @@ -8,14 +8,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\DH; use OCA\Libresign\Vendor\phpseclib3\Crypt\DH; + /** * DH Parameters * * @author Jim Wigginton - * @internal */ final class Parameters extends DH { @@ -29,6 +30,7 @@ final class Parameters extends DH public function toString($type = 'PKCS1', array $options = []) { $type = self::validatePlugin('Keys', 'PKCS1', 'saveParameters'); + return $type::saveParameters($this->prime, $this->base, $options); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/DH/PrivateKey.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/DH/PrivateKey.php index 74ad048..3f40093 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/DH/PrivateKey.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/DH/PrivateKey.php @@ -8,31 +8,35 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\DH; use OCA\Libresign\Vendor\phpseclib3\Crypt\Common; use OCA\Libresign\Vendor\phpseclib3\Crypt\DH; + /** * DH Private Key * * @author Jim Wigginton - * @internal */ final class PrivateKey extends DH { use Common\Traits\PasswordProtected; + /** * Private Key * * @var \phpseclib3\Math\BigInteger */ protected $privateKey; + /** * Public Key * * @var \phpseclib3\Math\BigInteger */ protected $publicKey; + /** * Returns the public key * @@ -41,12 +45,16 @@ final class PrivateKey extends DH public function getPublicKey() { $type = self::validatePlugin('Keys', 'PKCS8', 'savePublicKey'); + if (!isset($this->publicKey)) { $this->publicKey = $this->base->powMod($this->privateKey, $this->prime); } + $key = $type::savePublicKey($this->prime, $this->base, $this->publicKey); + return DH::loadFormat('PKCS8', $key); } + /** * Returns the private key * @@ -57,9 +65,11 @@ public function getPublicKey() public function toString($type, array $options = []) { $type = self::validatePlugin('Keys', $type, 'savePrivateKey'); + if (!isset($this->publicKey)) { $this->publicKey = $this->base->powMod($this->privateKey, $this->prime); } + return $type::savePrivateKey($this->prime, $this->base, $this->privateKey, $this->publicKey, $this->password, $options); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/DH/PublicKey.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/DH/PublicKey.php index e448adf..bd81000 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/DH/PublicKey.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/DH/PublicKey.php @@ -8,19 +8,21 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\DH; use OCA\Libresign\Vendor\phpseclib3\Crypt\Common; use OCA\Libresign\Vendor\phpseclib3\Crypt\DH; + /** * DH Public Key * * @author Jim Wigginton - * @internal */ final class PublicKey extends DH { use Common\Traits\Fingerprint; + /** * Returns the public key * @@ -31,8 +33,10 @@ final class PublicKey extends DH public function toString($type, array $options = []) { $type = self::validatePlugin('Keys', $type, 'savePublicKey'); + return $type::savePublicKey($this->prime, $this->base, $this->publicKey, $options); } + /** * Returns the public key as a BigInteger * diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA.php index b8b3854..c1ed9a9 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA.php @@ -26,6 +26,7 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt; use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\AsymmetricKey; @@ -34,11 +35,11 @@ use OCA\Libresign\Vendor\phpseclib3\Crypt\DSA\PublicKey; use OCA\Libresign\Vendor\phpseclib3\Exception\InsufficientSetupException; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * Pure-PHP FIPS 186-4 compliant implementation of DSA. * * @author Jim Wigginton - * @internal */ abstract class DSA extends AsymmetricKey { @@ -48,12 +49,14 @@ abstract class DSA extends AsymmetricKey * @var string */ const ALGORITHM = 'DSA'; + /** * DSA Prime P * * @var BigInteger */ protected $p; + /** * DSA Group Order q * @@ -62,30 +65,35 @@ abstract class DSA extends AsymmetricKey * @var BigInteger */ protected $q; + /** * DSA Group Generator G * * @var BigInteger */ protected $g; + /** * DSA public key value y * * @var BigInteger */ protected $y; + /** * Signature Format * * @var string */ protected $sigFormat; + /** * Signature Format (Short) * * @var string */ protected $shortFormat; + /** * Create DSA parameters * @@ -96,14 +104,17 @@ abstract class DSA extends AsymmetricKey public static function createParameters($L = 2048, $N = 224) { self::initialize_static_variables(); + $class = new \ReflectionClass(static::class); if ($class->isFinal()) { throw new \RuntimeException('createParameters() should not be called from final classes (' . static::class . ')'); } + if (!isset(self::$engines['PHP'])) { self::useBestEngine(); } - switch (\true) { + + switch (true) { case $N == 160: /* in FIPS 186-1 and 186-2 N was fixed at 160 whereas K had an upper bound of 1024. @@ -123,34 +134,42 @@ public static function createParameters($L = 2048, $N = 224) default: throw new \InvalidArgumentException('Invalid values for N and L'); } + $two = new BigInteger(2); + $q = BigInteger::randomPrime($N); $divisor = $q->multiply($two); + do { $x = BigInteger::random($L); list(, $c) = $x->divide($divisor); $p = $x->subtract($c->subtract(self::$one)); } while ($p->getLength() != $L || !$p->isPrime()); + $p_1 = $p->subtract(self::$one); list($e) = $p_1->divide($q); + // quoting http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf#page=50 , // "h could be obtained from a random number generator or from a counter that // changes after each use". PuTTY (sshdssg.c) starts h off at 1 and increments // it on each loop. wikipedia says "commonly h = 2 is used" so we'll just do that $h = clone $two; - while (\true) { + while (true) { $g = $h->powMod($e, $p); if (!$g->equals(self::$one)) { break; } $h = $h->add(self::$one); } + $dsa = new Parameters(); $dsa->p = $p; $dsa->q = $q; $dsa->g = $g; + return $dsa; } + /** * Create public / private key pair. * @@ -165,32 +184,42 @@ public static function createParameters($L = 2048, $N = 224) public static function createKey(...$args) { self::initialize_static_variables(); + $class = new \ReflectionClass(static::class); if ($class->isFinal()) { throw new \RuntimeException('createKey() should not be called from final classes (' . static::class . ')'); } + if (!isset(self::$engines['PHP'])) { self::useBestEngine(); } - if (\count($args) == 2 && \is_int($args[0]) && \is_int($args[1])) { + + if (count($args) == 2 && is_int($args[0]) && is_int($args[1])) { $params = self::createParameters($args[0], $args[1]); - } elseif (\count($args) == 1 && $args[0] instanceof Parameters) { + } elseif (count($args) == 1 && $args[0] instanceof Parameters) { $params = $args[0]; - } elseif (!\count($args)) { + } elseif (!count($args)) { $params = self::createParameters(); } else { throw new InsufficientSetupException('Valid parameters are either two integers (L and N), a single DSA object or no parameters at all.'); } + $private = new PrivateKey(); $private->p = $params->p; $private->q = $params->q; $private->g = $params->g; + $private->x = BigInteger::randomRange(self::$one, $private->q->subtract(self::$one)); $private->y = $private->g->powMod($private->x, $private->p); + //$public = clone $private; //unset($public->x); - return $private->withHash($params->hash->getHash())->withSignatureFormat($params->shortFormat); + + return $private + ->withHash($params->hash->getHash()) + ->withSignatureFormat($params->shortFormat); } + /** * OnLoad Handler * @@ -201,6 +230,7 @@ protected static function onLoad(array $components) if (!isset(self::$engines['PHP'])) { self::useBestEngine(); } + if (!isset($components['x']) && !isset($components['y'])) { $new = new Parameters(); } elseif (isset($components['x'])) { @@ -209,14 +239,18 @@ protected static function onLoad(array $components) } else { $new = new PublicKey(); } + $new->p = $components['p']; $new->q = $components['q']; $new->g = $components['g']; + if (isset($components['y'])) { $new->y = $components['y']; } + return $new; } + /** * Constructor * @@ -226,8 +260,10 @@ protected function __construct() { $this->sigFormat = self::validatePlugin('Signature', 'ASN1'); $this->shortFormat = 'ASN1'; + parent::__construct(); } + /** * Returns the key size * @@ -239,6 +275,7 @@ public function getLength() { return ['L' => $this->p->getLength(), 'N' => $this->q->getLength()]; } + /** * Returns the current engine being used * @@ -251,8 +288,10 @@ public function getEngine() if (!isset(self::$engines['PHP'])) { self::useBestEngine(); } - return self::$engines['OpenSSL'] && \in_array($this->hash->getHash(), \openssl_get_md_methods()) ? 'OpenSSL' : 'PHP'; + return self::$engines['OpenSSL'] && in_array($this->hash->getHash(), openssl_get_md_methods()) ? + 'OpenSSL' : 'PHP'; } + /** * Returns the parameters * @@ -265,9 +304,13 @@ public function getEngine() public function getParameters() { $type = self::validatePlugin('Keys', 'PKCS1', 'saveParameters'); + $key = $type::saveParameters($this->p, $this->q, $this->g); - return DSA::load($key, 'PKCS1')->withHash($this->hash->getHash())->withSignatureFormat($this->shortFormat); + return DSA::load($key, 'PKCS1') + ->withHash($this->hash->getHash()) + ->withSignatureFormat($this->shortFormat); } + /** * Determines the signature padding mode * @@ -282,6 +325,7 @@ public function withSignatureFormat($format) $new->sigFormat = self::validatePlugin('Signature', $format); return $new; } + /** * Returns the signature format currently being used * diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/OpenSSH.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/OpenSSH.php index 3070e32..090d7ac 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/OpenSSH.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/OpenSSH.php @@ -12,16 +12,17 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\DSA\Formats\Keys; use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Keys\OpenSSH as Progenitor; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * OpenSSH Formatted DSA Key Handler * * @author Jim Wigginton - * @internal */ abstract class OpenSSH extends Progenitor { @@ -31,6 +32,7 @@ abstract class OpenSSH extends Progenitor * @var array */ protected static $types = ['ssh-dss']; + /** * Break a public or private key down into its constituent components * @@ -41,18 +43,25 @@ abstract class OpenSSH extends Progenitor public static function load($key, $password = '') { $parsed = parent::load($key, $password); + if (isset($parsed['paddedKey'])) { list($type) = Strings::unpackSSH2('s', $parsed['paddedKey']); if ($type != $parsed['type']) { - throw new \RuntimeException("The public and private keys are not of the same type ({$type} vs {$parsed['type']})"); + throw new \RuntimeException("The public and private keys are not of the same type ($type vs $parsed[type])"); } + list($p, $q, $g, $y, $x, $comment) = Strings::unpackSSH2('i5s', $parsed['paddedKey']); - return \compact('p', 'q', 'g', 'y', 'x', 'comment'); + + return compact('p', 'q', 'g', 'y', 'x', 'comment'); } + list($p, $q, $g, $y) = Strings::unpackSSH2('iiii', $parsed['publicKey']); + $comment = $parsed['comment']; - return \compact('p', 'q', 'g', 'y', 'comment'); + + return compact('p', 'q', 'g', 'y', 'comment'); } + /** * Convert a public key to the appropriate format * @@ -68,6 +77,7 @@ public static function savePublicKey(BigInteger $p, BigInteger $q, BigInteger $g if ($q->getLength() != 160) { throw new \InvalidArgumentException('SSH only supports keys with an N (length of Group Order q) of 160'); } + // from : // string "ssh-dss" // mpint p @@ -75,13 +85,17 @@ public static function savePublicKey(BigInteger $p, BigInteger $q, BigInteger $g // mpint g // mpint y $DSAPublicKey = Strings::packSSH2('siiii', 'ssh-dss', $p, $q, $g, $y); + if (isset($options['binary']) ? $options['binary'] : self::$binary) { return $DSAPublicKey; } + $comment = isset($options['comment']) ? $options['comment'] : self::$comment; - $DSAPublicKey = 'ssh-dss ' . \base64_encode($DSAPublicKey) . ' ' . $comment; + $DSAPublicKey = 'ssh-dss ' . base64_encode($DSAPublicKey) . ' ' . $comment; + return $DSAPublicKey; } + /** * Convert a private key to the appropriate format. * @@ -96,8 +110,9 @@ public static function savePublicKey(BigInteger $p, BigInteger $q, BigInteger $g */ public static function savePrivateKey(BigInteger $p, BigInteger $q, BigInteger $g, BigInteger $y, BigInteger $x, $password = '', array $options = []) { - $publicKey = self::savePublicKey($p, $q, $g, $y, ['binary' => \true]); + $publicKey = self::savePublicKey($p, $q, $g, $y, ['binary' => true]); $privateKey = Strings::packSSH2('si5', 'ssh-dss', $p, $q, $g, $y, $x); + return self::wrapPrivateKey($publicKey, $privateKey, $password, $options); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PKCS1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PKCS1.php index f37e5a8..043cd3c 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PKCS1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PKCS1.php @@ -24,6 +24,7 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\DSA\Formats\Keys; use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; @@ -31,11 +32,11 @@ use OCA\Libresign\Vendor\phpseclib3\File\ASN1; use OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * PKCS#1 Formatted DSA Key Handler * * @author Jim Wigginton - * @internal */ abstract class PKCS1 extends Progenitor { @@ -49,24 +50,30 @@ abstract class PKCS1 extends Progenitor public static function load($key, $password = '') { $key = parent::load($key, $password); + $decoded = ASN1::decodeBER($key); if (!$decoded) { throw new \RuntimeException('Unable to decode BER'); } + $key = ASN1::asn1map($decoded[0], Maps\DSAParams::MAP); - if (\is_array($key)) { + if (is_array($key)) { return $key; } + $key = ASN1::asn1map($decoded[0], Maps\DSAPrivateKey::MAP); - if (\is_array($key)) { + if (is_array($key)) { return $key; } + $key = ASN1::asn1map($decoded[0], Maps\DSAPublicKey::MAP); - if (\is_array($key)) { + if (is_array($key)) { return $key; } + throw new \RuntimeException('Unable to perform ASN1 mapping'); } + /** * Convert DSA parameters to the appropriate format * @@ -77,10 +84,19 @@ public static function load($key, $password = '') */ public static function saveParameters(BigInteger $p, BigInteger $q, BigInteger $g) { - $key = ['p' => $p, 'q' => $q, 'g' => $g]; + $key = [ + 'p' => $p, + 'q' => $q, + 'g' => $g + ]; + $key = ASN1::encodeDER($key, Maps\DSAParams::MAP); - return "-----BEGIN DSA PARAMETERS-----\r\n" . \chunk_split(Strings::base64_encode($key), 64) . "-----END DSA PARAMETERS-----\r\n"; + + return "-----BEGIN DSA PARAMETERS-----\r\n" . + chunk_split(Strings::base64_encode($key), 64) . + "-----END DSA PARAMETERS-----\r\n"; } + /** * Convert a private key to the appropriate format. * @@ -95,10 +111,20 @@ public static function saveParameters(BigInteger $p, BigInteger $q, BigInteger $ */ public static function savePrivateKey(BigInteger $p, BigInteger $q, BigInteger $g, BigInteger $y, BigInteger $x, $password = '', array $options = []) { - $key = ['version' => 0, 'p' => $p, 'q' => $q, 'g' => $g, 'y' => $y, 'x' => $x]; + $key = [ + 'version' => 0, + 'p' => $p, + 'q' => $q, + 'g' => $g, + 'y' => $y, + 'x' => $x + ]; + $key = ASN1::encodeDER($key, Maps\DSAPrivateKey::MAP); + return self::wrapPrivateKey($key, 'DSA', $password, $options); } + /** * Convert a public key to the appropriate format * @@ -111,6 +137,7 @@ public static function savePrivateKey(BigInteger $p, BigInteger $q, BigInteger $ public static function savePublicKey(BigInteger $p, BigInteger $q, BigInteger $g, BigInteger $y) { $key = ASN1::encodeDER($y, Maps\DSAPublicKey::MAP); + return self::wrapPublicKey($key, 'DSA'); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PKCS8.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PKCS8.php index 4c9ff45..a810dea 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PKCS8.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PKCS8.php @@ -20,17 +20,18 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\DSA\Formats\Keys; use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Keys\PKCS8 as Progenitor; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; use OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * PKCS#8 Formatted DSA Key Handler * * @author Jim Wigginton - * @internal */ abstract class PKCS8 extends Progenitor { @@ -40,18 +41,21 @@ abstract class PKCS8 extends Progenitor * @var string */ const OID_NAME = 'id-dsa'; + /** * OID Value * * @var string */ const OID_VALUE = '1.2.840.10040.4.1'; + /** * Child OIDs loaded * * @var bool */ - protected static $childOIDsLoaded = \false; + protected static $childOIDsLoaded = false; + /** * Break a public or private key down into its constituent components * @@ -62,29 +66,36 @@ abstract class PKCS8 extends Progenitor public static function load($key, $password = '') { $key = parent::load($key, $password); + $type = isset($key['privateKey']) ? 'privateKey' : 'publicKey'; + $decoded = ASN1::decodeBER($key[$type . 'Algorithm']['parameters']->element); if (!$decoded) { throw new \RuntimeException('Unable to decode BER of parameters'); } $components = ASN1::asn1map($decoded[0], Maps\DSAParams::MAP); - if (!\is_array($components)) { + if (!is_array($components)) { throw new \RuntimeException('Unable to perform ASN1 mapping on parameters'); } + $decoded = ASN1::decodeBER($key[$type]); if (empty($decoded)) { throw new \RuntimeException('Unable to decode BER'); } + $var = $type == 'privateKey' ? 'x' : 'y'; $components[$var] = ASN1::asn1map($decoded[0], Maps\DSAPublicKey::MAP); if (!$components[$var] instanceof BigInteger) { throw new \RuntimeException('Unable to perform ASN1 mapping'); } + if (isset($key['meta'])) { $components['meta'] = $key['meta']; } + return $components; } + /** * Convert a private key to the appropriate format. * @@ -99,12 +110,17 @@ public static function load($key, $password = '') */ public static function savePrivateKey(BigInteger $p, BigInteger $q, BigInteger $g, BigInteger $y, BigInteger $x, $password = '', array $options = []) { - $params = ['p' => $p, 'q' => $q, 'g' => $g]; + $params = [ + 'p' => $p, + 'q' => $q, + 'g' => $g + ]; $params = ASN1::encodeDER($params, Maps\DSAParams::MAP); $params = new ASN1\Element($params); $key = ASN1::encodeDER($x, Maps\DSAPublicKey::MAP); return self::wrapPrivateKey($key, [], $params, $password, null, '', $options); } + /** * Convert a public key to the appropriate format * @@ -117,7 +133,11 @@ public static function savePrivateKey(BigInteger $p, BigInteger $q, BigInteger $ */ public static function savePublicKey(BigInteger $p, BigInteger $q, BigInteger $g, BigInteger $y, array $options = []) { - $params = ['p' => $p, 'q' => $q, 'g' => $g]; + $params = [ + 'p' => $p, + 'q' => $q, + 'g' => $g + ]; $params = ASN1::encodeDER($params, Maps\DSAParams::MAP); $params = new ASN1\Element($params); $key = ASN1::encodeDER($y, Maps\DSAPublicKey::MAP); diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PuTTY.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PuTTY.php index f422179..e9bb817 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PuTTY.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PuTTY.php @@ -15,16 +15,17 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\DSA\Formats\Keys; use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Keys\PuTTY as Progenitor; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * PuTTY Formatted DSA Key Handler * * @author Jim Wigginton - * @internal */ abstract class PuTTY extends Progenitor { @@ -33,13 +34,15 @@ abstract class PuTTY extends Progenitor * * @var string */ - const PUBLIC_HANDLER = 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\DSA\\Formats\\Keys\\OpenSSH'; + const PUBLIC_HANDLER = '\OCA\Libresign\Vendor\phpseclib3\Crypt\DSA\Formats\Keys\OpenSSH'; + /** * Algorithm Identifier * * @var array */ protected static $types = ['ssh-dss']; + /** * Break a public or private key down into its constituent components * @@ -58,10 +61,13 @@ public static function load($key, $password = '') $public = $components['public']; $private = $components['private']; unset($components['public'], $components['private']); + list($p, $q, $g, $y) = Strings::unpackSSH2('iiii', $public); list($x) = Strings::unpackSSH2('i', $private); - return \compact('p', 'q', 'g', 'y', 'x', 'comment'); + + return compact('p', 'q', 'g', 'y', 'x', 'comment'); } + /** * Convert a private key to the appropriate format. * @@ -74,15 +80,18 @@ public static function load($key, $password = '') * @param array $options optional * @return string */ - public static function savePrivateKey(BigInteger $p, BigInteger $q, BigInteger $g, BigInteger $y, BigInteger $x, $password = \false, array $options = []) + public static function savePrivateKey(BigInteger $p, BigInteger $q, BigInteger $g, BigInteger $y, BigInteger $x, $password = false, array $options = []) { if ($q->getLength() != 160) { throw new \InvalidArgumentException('SSH only supports keys with an N (length of Group Order q) of 160'); } + $public = Strings::packSSH2('iiii', $p, $q, $g, $y); $private = Strings::packSSH2('i', $x); + return self::wrapPrivateKey($public, $private, 'ssh-dss', $password, $options); } + /** * Convert a public key to the appropriate format * @@ -97,6 +106,7 @@ public static function savePublicKey(BigInteger $p, BigInteger $q, BigInteger $g if ($q->getLength() != 160) { throw new \InvalidArgumentException('SSH only supports keys with an N (length of Group Order q) of 160'); } + return self::wrapPublicKey(Strings::packSSH2('iiii', $p, $q, $g, $y), 'ssh-dss'); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/Raw.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/Raw.php index ac2868f..1570930 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/Raw.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/Raw.php @@ -12,14 +12,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\DSA\Formats\Keys; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * Raw DSA Key Handler * * @author Jim Wigginton - * @internal */ abstract class Raw { @@ -32,10 +33,11 @@ abstract class Raw */ public static function load($key, $password = '') { - if (!\is_array($key)) { - throw new \UnexpectedValueException('Key should be a array - not a ' . \gettype($key)); + if (!is_array($key)) { + throw new \UnexpectedValueException('Key should be a array - not a ' . gettype($key)); } - switch (\true) { + + switch (true) { case !isset($key['p']) || !isset($key['q']) || !isset($key['g']): case !$key['p'] instanceof BigInteger: case !$key['q'] instanceof BigInteger: @@ -45,9 +47,12 @@ public static function load($key, $password = '') case isset($key['y']) && !$key['y'] instanceof BigInteger: throw new \UnexpectedValueException('Key appears to be malformed'); } + $options = ['p' => 1, 'q' => 1, 'g' => 1, 'x' => 1, 'y' => 1]; - return \array_intersect_key($key, $options); + + return array_intersect_key($key, $options); } + /** * Convert a private key to the appropriate format. * @@ -61,8 +66,9 @@ public static function load($key, $password = '') */ public static function savePrivateKey(BigInteger $p, BigInteger $q, BigInteger $g, BigInteger $y, BigInteger $x, $password = '') { - return \compact('p', 'q', 'g', 'y', 'x'); + return compact('p', 'q', 'g', 'y', 'x'); } + /** * Convert a public key to the appropriate format * @@ -74,6 +80,6 @@ public static function savePrivateKey(BigInteger $p, BigInteger $q, BigInteger $ */ public static function savePublicKey(BigInteger $p, BigInteger $q, BigInteger $g, BigInteger $y) { - return \compact('p', 'q', 'g', 'y'); + return compact('p', 'q', 'g', 'y'); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/XML.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/XML.php index 503a4f6..7679030 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/XML.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/XML.php @@ -16,16 +16,17 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\DSA\Formats\Keys; use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; use OCA\Libresign\Vendor\phpseclib3\Exception\BadConfigurationException; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * XML Formatted DSA Key Handler * * @author Jim Wigginton - * @internal */ abstract class XML { @@ -39,73 +40,75 @@ abstract class XML public static function load($key, $password = '') { if (!Strings::is_stringable($key)) { - throw new \UnexpectedValueException('Key should be a string - not a ' . \gettype($key)); + throw new \UnexpectedValueException('Key should be a string - not a ' . gettype($key)); } - if (!\class_exists('DOMDocument')) { + + if (!class_exists('DOMDocument')) { throw new BadConfigurationException('The dom extension is not setup correctly on this system'); } - $use_errors = \libxml_use_internal_errors(\true); + + $use_errors = libxml_use_internal_errors(true); + $dom = new \DOMDocument(); - if (\substr($key, 0, 5) != '' . $key . ''; } if (!$dom->loadXML($key)) { - \libxml_use_internal_errors($use_errors); + libxml_use_internal_errors($use_errors); throw new \UnexpectedValueException('Key does not appear to contain XML'); } $xpath = new \DOMXPath($dom); $keys = ['p', 'q', 'g', 'y', 'j', 'seed', 'pgencounter']; foreach ($keys as $key) { // $dom->getElementsByTagName($key) is case-sensitive - $temp = $xpath->query("//*[translate(local-name(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')='{$key}']"); + $temp = $xpath->query("//*[translate(local-name(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')='$key']"); if (!$temp->length) { continue; } $value = new BigInteger(Strings::base64_decode($temp->item(0)->nodeValue), 256); switch ($key) { - case 'p': - // a prime modulus meeting the [DSS] requirements + case 'p': // a prime modulus meeting the [DSS] requirements // Parameters P, Q, and G can be public and common to a group of users. They might be known // from application context. As such, they are optional but P and Q must either both appear // or both be absent $components['p'] = $value; break; - case 'q': - // an integer in the range 2**159 < Q < 2**160 which is a prime divisor of P-1 + case 'q': // an integer in the range 2**159 < Q < 2**160 which is a prime divisor of P-1 $components['q'] = $value; break; - case 'g': - // an integer with certain properties with respect to P and Q + case 'g': // an integer with certain properties with respect to P and Q $components['g'] = $value; break; - case 'y': - // G**X mod P (where X is part of the private key and not made public) + case 'y': // G**X mod P (where X is part of the private key and not made public) $components['y'] = $value; - // the remaining options do not do anything - case 'j': - // (P - 1) / Q - // Parameter J is available for inclusion solely for efficiency as it is calculatable from - // P and Q - case 'seed': - // a DSA prime generation seed - // Parameters seed and pgenCounter are used in the DSA prime number generation algorithm - // specified in [DSS]. As such, they are optional but must either both be present or both - // be absent - case 'pgencounter': + // the remaining options do not do anything + case 'j': // (P - 1) / Q + // Parameter J is available for inclusion solely for efficiency as it is calculatable from + // P and Q + case 'seed': // a DSA prime generation seed + // Parameters seed and pgenCounter are used in the DSA prime number generation algorithm + // specified in [DSS]. As such, they are optional but must either both be present or both + // be absent + case 'pgencounter': // a DSA prime generation counter } } - \libxml_use_internal_errors($use_errors); + + libxml_use_internal_errors($use_errors); + if (!isset($components['y'])) { throw new \UnexpectedValueException('Key is missing y component'); } - switch (\true) { + + switch (true) { case !isset($components['p']): case !isset($components['q']): case !isset($components['g']): return ['y' => $components['y']]; } + return $components; } + /** * Convert a public key to the appropriate format * @@ -119,6 +122,11 @@ public static function load($key, $password = '') */ public static function savePublicKey(BigInteger $p, BigInteger $q, BigInteger $g, BigInteger $y) { - return "\r\n" . '

' . Strings::base64_encode($p->toBytes()) . "

\r\n" . ' ' . Strings::base64_encode($q->toBytes()) . "\r\n" . ' ' . Strings::base64_encode($g->toBytes()) . "\r\n" . ' ' . Strings::base64_encode($y->toBytes()) . "\r\n" . '
'; + return "\r\n" . + '

' . Strings::base64_encode($p->toBytes()) . "

\r\n" . + ' ' . Strings::base64_encode($q->toBytes()) . "\r\n" . + ' ' . Strings::base64_encode($g->toBytes()) . "\r\n" . + ' ' . Strings::base64_encode($y->toBytes()) . "\r\n" . + '
'; } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/ASN1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/ASN1.php index 6b5be2b..e6fcc73 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/ASN1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/ASN1.php @@ -13,16 +13,17 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\DSA\Formats\Signature; use OCA\Libresign\Vendor\phpseclib3\File\ASN1 as Encoder; use OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * ASN1 Signature Handler * * @author Jim Wigginton - * @internal */ abstract class ASN1 { @@ -34,16 +35,19 @@ abstract class ASN1 */ public static function load($sig) { - if (!\is_string($sig)) { - return \false; + if (!is_string($sig)) { + return false; } + $decoded = Encoder::decodeBER($sig); if (empty($decoded)) { - return \false; + return false; } $components = Encoder::asn1map($decoded[0], Maps\DssSigValue::MAP); + return $components; } + /** * Returns a signature in the appropriate format * @@ -53,6 +57,6 @@ public static function load($sig) */ public static function save(BigInteger $r, BigInteger $s) { - return Encoder::encodeDER(\compact('r', 's'), Maps\DssSigValue::MAP); + return Encoder::encodeDER(compact('r', 's'), Maps\DssSigValue::MAP); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/Raw.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/Raw.php index fb82807..50cead5 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/Raw.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/Raw.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\DSA\Formats\Signature; use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Signature\Raw as Progenitor; + /** * Raw DSA Signature Handler * * @author Jim Wigginton - * @internal */ abstract class Raw extends Progenitor { diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/SSH2.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/SSH2.php index 4aa847c..17f61de 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/SSH2.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/SSH2.php @@ -12,15 +12,16 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\DSA\Formats\Signature; use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * SSH2 Signature Handler * * @author Jim Wigginton - * @internal */ abstract class SSH2 { @@ -32,19 +33,25 @@ abstract class SSH2 */ public static function load($sig) { - if (!\is_string($sig)) { - return \false; + if (!is_string($sig)) { + return false; } + $result = Strings::unpackSSH2('ss', $sig); - if ($result === \false) { - return \false; + if ($result === false) { + return false; } list($type, $blob) = $result; - if ($type != 'ssh-dss' || \strlen($blob) != 40) { - return \false; + if ($type != 'ssh-dss' || strlen($blob) != 40) { + return false; } - return ['r' => new BigInteger(\substr($blob, 0, 20), 256), 's' => new BigInteger(\substr($blob, 20), 256)]; + + return [ + 'r' => new BigInteger(substr($blob, 0, 20), 256), + 's' => new BigInteger(substr($blob, 20), 256) + ]; } + /** * Returns a signature in the appropriate format * @@ -55,8 +62,13 @@ public static function load($sig) public static function save(BigInteger $r, BigInteger $s) { if ($r->getLength() > 160 || $s->getLength() > 160) { - return \false; + return false; } - return Strings::packSSH2('ss', 'ssh-dss', \str_pad($r->toBytes(), 20, "\x00", \STR_PAD_LEFT) . \str_pad($s->toBytes(), 20, "\x00", \STR_PAD_LEFT)); + return Strings::packSSH2( + 'ss', + 'ssh-dss', + str_pad($r->toBytes(), 20, "\0", STR_PAD_LEFT) . + str_pad($s->toBytes(), 20, "\0", STR_PAD_LEFT) + ); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Parameters.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Parameters.php index f5a05c6..aa13e04 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Parameters.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Parameters.php @@ -8,14 +8,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\DSA; use OCA\Libresign\Vendor\phpseclib3\Crypt\DSA; + /** * DSA Parameters * * @author Jim Wigginton - * @internal */ final class Parameters extends DSA { @@ -29,6 +30,7 @@ final class Parameters extends DSA public function toString($type = 'PKCS1', array $options = []) { $type = self::validatePlugin('Keys', 'PKCS1', 'saveParameters'); + return $type::saveParameters($this->p, $this->q, $this->g, $options); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/PrivateKey.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/PrivateKey.php index cbb1294..75aadec 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/PrivateKey.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/PrivateKey.php @@ -8,27 +8,30 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\DSA; use OCA\Libresign\Vendor\phpseclib3\Crypt\Common; use OCA\Libresign\Vendor\phpseclib3\Crypt\DSA; use OCA\Libresign\Vendor\phpseclib3\Crypt\DSA\Formats\Signature\ASN1 as ASN1Signature; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * DSA Private Key * * @author Jim Wigginton - * @internal */ final class PrivateKey extends DSA implements Common\PrivateKey { use Common\Traits\PasswordProtected; + /** * DSA secret exponent x * * @var BigInteger */ protected $x; + /** * Returns the public key * @@ -53,12 +56,18 @@ final class PrivateKey extends DSA implements Common\PrivateKey public function getPublicKey() { $type = self::validatePlugin('Keys', 'PKCS8', 'savePublicKey'); + if (!isset($this->y)) { $this->y = $this->g->powMod($this->x, $this->p); } + $key = $type::savePublicKey($this->p, $this->q, $this->g, $this->y); - return DSA::loadFormat('PKCS8', $key)->withHash($this->hash->getHash())->withSignatureFormat($this->shortFormat); + + return DSA::loadFormat('PKCS8', $key) + ->withHash($this->hash->getHash()) + ->withSignatureFormat($this->shortFormat); } + /** * Create a signature * @@ -69,22 +78,28 @@ public function getPublicKey() public function sign($message) { $format = $this->sigFormat; - if (self::$engines['OpenSSL'] && \in_array($this->hash->getHash(), \openssl_get_md_methods())) { + + if (self::$engines['OpenSSL'] && in_array($this->hash->getHash(), openssl_get_md_methods())) { $signature = ''; - $result = \openssl_sign($message, $signature, $this->toString('PKCS8'), $this->hash->getHash()); + $result = openssl_sign($message, $signature, $this->toString('PKCS8'), $this->hash->getHash()); + if ($result) { if ($this->shortFormat == 'ASN1') { return $signature; } + $loaded = ASN1Signature::load($signature); $r = $loaded['r']; $s = $loaded['s']; + return $format::save($r, $s); } } + $h = $this->hash->hash($message); $h = $this->bits2int($h); - while (\true) { + + while (true) { $k = BigInteger::randomRange(self::$one, $this->q->subtract(self::$one)); $r = $this->g->powMod($k, $this->p); list(, $r) = $r->divide($this->q); @@ -99,6 +114,7 @@ public function sign($message) break; } } + // the following is an RFC6979 compliant implementation of deterministic DSA // it's unused because it's mainly intended for use when a good CSPRNG isn't // available. if phpseclib's CSPRNG isn't good then even key generation is @@ -114,8 +130,10 @@ public function sign($message) $temp = $kinv->multiply($temp); list(, $s) = $temp->divide($this->q); */ + return $format::save($r, $s); } + /** * Returns the private key * @@ -126,9 +144,11 @@ public function sign($message) public function toString($type, array $options = []) { $type = self::validatePlugin('Keys', $type, 'savePrivateKey'); + if (!isset($this->y)) { $this->y = $this->g->powMod($this->x, $this->p); } + return $type::savePrivateKey($this->p, $this->q, $this->g, $this->y, $this->x, $this->password, $options); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/PublicKey.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/PublicKey.php index dbf734f..43c06bb 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/PublicKey.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/PublicKey.php @@ -8,20 +8,22 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\DSA; use OCA\Libresign\Vendor\phpseclib3\Crypt\Common; use OCA\Libresign\Vendor\phpseclib3\Crypt\DSA; use OCA\Libresign\Vendor\phpseclib3\Crypt\DSA\Formats\Signature\ASN1 as ASN1Signature; + /** * DSA Public Key * * @author Jim Wigginton - * @internal */ final class PublicKey extends DSA implements Common\PublicKey { use Common\Traits\Fingerprint; + /** * Verify a signature * @@ -33,23 +35,29 @@ final class PublicKey extends DSA implements Common\PublicKey public function verify($message, $signature) { $format = $this->sigFormat; + $params = $format::load($signature); - if ($params === \false || \count($params) != 2) { - return \false; + if ($params === false || count($params) != 2) { + return false; } $r = $params['r']; $s = $params['s']; - if (self::$engines['OpenSSL'] && \in_array($this->hash->getHash(), \openssl_get_md_methods())) { + + if (self::$engines['OpenSSL'] && in_array($this->hash->getHash(), openssl_get_md_methods())) { $sig = $format != 'ASN1' ? ASN1Signature::save($r, $s) : $signature; - $result = \openssl_verify($message, $sig, $this->toString('PKCS8'), $this->hash->getHash()); + + $result = openssl_verify($message, $sig, $this->toString('PKCS8'), $this->hash->getHash()); + if ($result != -1) { return (bool) $result; } } + $q_1 = $this->q->subtract(self::$one); if (!$r->between(self::$one, $q_1) || !$s->between(self::$one, $q_1)) { - return \false; + return false; } + $w = $s->modInverse($this->q); $h = $this->hash->hash($message); $h = $this->bits2int($h); @@ -59,8 +67,10 @@ public function verify($message, $signature) $v2 = $this->y->powMod($u2, $this->p); list(, $v) = $v1->multiply($v2)->divide($this->p); list(, $v) = $v->divide($this->q); + return $v->equals($r); } + /** * Returns the public key * @@ -71,6 +81,7 @@ public function verify($message, $signature) public function toString($type, array $options = []) { $type = self::validatePlugin('Keys', $type, 'savePublicKey'); + return $type::savePublicKey($this->p, $this->q, $this->g, $this->y, $options); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC.php index 7098de0..ab93243 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC.php @@ -26,6 +26,7 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt; use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\AsymmetricKey; @@ -44,11 +45,11 @@ use OCA\Libresign\Vendor\phpseclib3\File\ASN1; use OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps\ECParameters; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * Pure-PHP implementation of EC. * * @author Jim Wigginton - * @internal */ abstract class EC extends AsymmetricKey { @@ -58,36 +59,42 @@ abstract class EC extends AsymmetricKey * @var string */ const ALGORITHM = 'EC'; + /** * Public Key QA * * @var object[] */ protected $QA; + /** * Curve * * @var EC\BaseCurves\Base */ protected $curve; + /** * Signature Format * * @var string */ protected $format; + /** * Signature Format (Short) * * @var string */ protected $shortFormat; + /** * Curve Name * * @var string */ private $curveName; + /** * Curve Order * @@ -96,6 +103,7 @@ abstract class EC extends AsymmetricKey * @var BigInteger */ protected $q; + /** * Alias for the private key * @@ -107,18 +115,21 @@ abstract class EC extends AsymmetricKey * @var BigInteger */ protected $x; + /** * Context * * @var string */ protected $context; + /** * Signature Format * * @var string */ protected $sigFormat; + /** * Create public / private key pair. * @@ -128,35 +139,48 @@ abstract class EC extends AsymmetricKey public static function createKey($curve) { self::initialize_static_variables(); + $class = new \ReflectionClass(static::class); if ($class->isFinal()) { throw new \RuntimeException('createKey() should not be called from final classes (' . static::class . ')'); } + if (!isset(self::$engines['PHP'])) { self::useBestEngine(); } - $curve = \strtolower($curve); - if (self::$engines['libsodium'] && $curve == 'ed25519' && \function_exists('sodium_crypto_sign_keypair')) { - $kp = \sodium_crypto_sign_keypair(); - $privatekey = EC::loadFormat('libsodium', \sodium_crypto_sign_secretkey($kp)); + + $curve = strtolower($curve); + if (self::$engines['libsodium'] && $curve == 'ed25519' && function_exists('sodium_crypto_sign_keypair')) { + $kp = sodium_crypto_sign_keypair(); + + $privatekey = EC::loadFormat('libsodium', sodium_crypto_sign_secretkey($kp)); //$publickey = EC::loadFormat('libsodium', sodium_crypto_sign_publickey($kp)); + $privatekey->curveName = 'Ed25519'; //$publickey->curveName = $curve; + return $privatekey; } + $privatekey = new PrivateKey(); + $curveName = $curve; - if (\preg_match('#(?:^curve|^ed)\\d+$#', $curveName)) { - $curveName = \ucfirst($curveName); - } elseif (\substr($curveName, 0, 10) == 'brainpoolp') { - $curveName = 'brainpoolP' . \substr($curveName, 10); + if (preg_match('#(?:^curve|^ed)\d+$#', $curveName)) { + $curveName = ucfirst($curveName); + } elseif (substr($curveName, 0, 10) == 'brainpoolp') { + $curveName = 'brainpoolP' . substr($curveName, 10); } - $curve = '\\OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\' . $curveName; - if (!\class_exists($curve)) { + $curve = '\phpseclib3\Crypt\EC\Curves\\' . $curveName; + + if (!class_exists($curve)) { throw new UnsupportedCurveException('Named Curve of ' . $curveName . ' is not supported'); } + $reflect = new \ReflectionClass($curve); - $curveName = $reflect->isFinal() ? $reflect->getParentClass()->getShortName() : $reflect->getShortName(); + $curveName = $reflect->isFinal() ? + $reflect->getParentClass()->getShortName() : + $reflect->getShortName(); + $curve = new $curve(); if ($curve instanceof TwistedEdwardsCurve) { $arr = $curve->extractSecret(Random::string($curve instanceof Ed448 ? 57 : 32)); @@ -168,22 +192,27 @@ public static function createKey($curve) if ($curve instanceof Curve25519 && self::$engines['libsodium']) { //$r = pack('H*', '0900000000000000000000000000000000000000000000000000000000000000'); //$QA = sodium_crypto_scalarmult($dA->toBytes(), $r); - $QA = \sodium_crypto_box_publickey_from_secretkey($dA->toBytes()); - $privatekey->QA = [$curve->convertInteger(new BigInteger(\strrev($QA), 256))]; + $QA = sodium_crypto_box_publickey_from_secretkey($dA->toBytes()); + $privatekey->QA = [$curve->convertInteger(new BigInteger(strrev($QA), 256))]; } else { $privatekey->QA = $curve->multiplyPoint($curve->getBasePoint(), $dA); } $privatekey->curve = $curve; + //$publickey = clone $privatekey; //unset($publickey->dA); //unset($publickey->x); + $privatekey->curveName = $curveName; //$publickey->curveName = $curveName; + if ($privatekey->curve instanceof TwistedEdwardsCurve) { return $privatekey->withHash($curve::HASH); } + return $privatekey; } + /** * OnLoad Handler * @@ -194,23 +223,31 @@ protected static function onLoad(array $components) if (!isset(self::$engines['PHP'])) { self::useBestEngine(); } + if (!isset($components['dA']) && !isset($components['QA'])) { $new = new Parameters(); $new->curve = $components['curve']; return $new; } - $new = isset($components['dA']) ? new PrivateKey() : new PublicKey(); + + $new = isset($components['dA']) ? + new PrivateKey() : + new PublicKey(); $new->curve = $components['curve']; $new->QA = $components['QA']; + if (isset($components['dA'])) { $new->dA = $components['dA']; $new->secret = $components['secret']; } + if ($new->curve instanceof TwistedEdwardsCurve) { return $new->withHash($components['curve']::HASH); } + return $new; } + /** * Constructor * @@ -220,8 +257,10 @@ protected function __construct() { $this->sigFormat = self::validatePlugin('Signature', 'ASN1'); $this->shortFormat = 'ASN1'; + parent::__construct(); } + /** * Returns the curve * @@ -234,15 +273,18 @@ public function getCurve() if ($this->curveName) { return $this->curveName; } + if ($this->curve instanceof MontgomeryCurve) { $this->curveName = $this->curve instanceof Curve25519 ? 'Curve25519' : 'Curve448'; return $this->curveName; } + if ($this->curve instanceof TwistedEdwardsCurve) { $this->curveName = $this->curve instanceof Ed25519 ? 'Ed25519' : 'Ed448'; return $this->curveName; } - $params = $this->getParameters()->toString('PKCS8', ['namedCurve' => \true]); + + $params = $this->getParameters()->toString('PKCS8', ['namedCurve' => true]); $decoded = ASN1::extractBER($params); $decoded = ASN1::decodeBER($decoded); $decoded = ASN1::asn1map($decoded[0], ECParameters::MAP); @@ -250,11 +292,14 @@ public function getCurve() $this->curveName = $decoded['namedCurve']; return $decoded['namedCurve']; } + if (!$namedCurves) { PKCS1::useSpecifiedCurve(); } + return $decoded; } + /** * Returns the key size * @@ -274,6 +319,7 @@ public function getLength() { return $this->curve->getLength(); } + /** * Returns the current engine being used * @@ -287,10 +333,14 @@ public function getEngine() self::useBestEngine(); } if ($this->curve instanceof TwistedEdwardsCurve) { - return $this->curve instanceof Ed25519 && self::$engines['libsodium'] && !isset($this->context) ? 'libsodium' : 'PHP'; + return $this->curve instanceof Ed25519 && self::$engines['libsodium'] && !isset($this->context) ? + 'libsodium' : 'PHP'; } - return self::$engines['OpenSSL'] && \in_array($this->hash->getHash(), \openssl_get_md_methods()) ? 'OpenSSL' : 'PHP'; + + return self::$engines['OpenSSL'] && in_array($this->hash->getHash(), openssl_get_md_methods()) ? + 'OpenSSL' : 'PHP'; } + /** * Returns the public key coordinates as a string * @@ -301,13 +351,14 @@ public function getEngine() public function getEncodedCoordinates() { if ($this->curve instanceof MontgomeryCurve) { - return \strrev($this->QA[0]->toBytes(\true)); + return strrev($this->QA[0]->toBytes(true)); } if ($this->curve instanceof TwistedEdwardsCurve) { return $this->curve->encodePoint($this->QA); } - return "\x04" . $this->QA[0]->toBytes(\true) . $this->QA[1]->toBytes(\true); + return "\4" . $this->QA[0]->toBytes(true) . $this->QA[1]->toBytes(true); } + /** * Returns the parameters * @@ -318,9 +369,14 @@ public function getEncodedCoordinates() public function getParameters($type = 'PKCS1') { $type = self::validatePlugin('Keys', $type, 'saveParameters'); + $key = $type::saveParameters($this->curve); - return EC::load($key, 'PKCS1')->withHash($this->hash->getHash())->withSignatureFormat($this->shortFormat); + + return EC::load($key, 'PKCS1') + ->withHash($this->hash->getHash()) + ->withSignatureFormat($this->shortFormat); } + /** * Determines the signature padding mode * @@ -333,11 +389,13 @@ public function withSignatureFormat($format) if ($this->curve instanceof MontgomeryCurve) { throw new UnsupportedOperationException('Montgomery Curves cannot be used to create signatures'); } + $new = clone $this; $new->shortFormat = $format; $new->sigFormat = self::validatePlugin('Signature', $format); return $new; } + /** * Returns the signature format currently being used * @@ -346,6 +404,7 @@ public function getSignatureFormat() { return $this->shortFormat; } + /** * Sets the context * @@ -360,20 +419,22 @@ public function withContext($context = null) if (!$this->curve instanceof TwistedEdwardsCurve) { throw new UnsupportedCurveException('Only Ed25519 and Ed448 support contexts'); } + $new = clone $this; if (!isset($context)) { $new->context = null; return $new; } - if (!\is_string($context)) { + if (!is_string($context)) { throw new \InvalidArgumentException('setContext expects a string'); } - if (\strlen($context) > 255) { + if (strlen($context) > 255) { throw new \LengthException('The context is supposed to be, at most, 255 bytes long'); } $new->context = $context; return $new; } + /** * Returns the signature format currently being used * @@ -382,6 +443,7 @@ public function getContext() { return $this->context; } + /** * Determines which hashing function should be used * @@ -398,8 +460,10 @@ public function withHash($hash) if ($this->curve instanceof Ed448 && $hash != 'shake256-912') { throw new UnsupportedAlgorithmException('Ed448 only supports shake256 with a length of 114 bytes'); } + return parent::withHash($hash); } + /** * __toString() magic method * @@ -410,6 +474,7 @@ public function __toString() if ($this->curve instanceof MontgomeryCurve) { return ''; } + return parent::__toString(); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Base.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Base.php index 33d4442..e35e142 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Base.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Base.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * Base * * @author Jim Wigginton - * @internal */ abstract class Base { @@ -27,12 +28,14 @@ abstract class Base * @var BigInteger */ protected $order; + /** * Finite Field Integer factory * * @var FiniteField\Integer */ protected $factory; + /** * Returns a random integer * @@ -42,6 +45,7 @@ public function randomInteger() { return $this->factory->randomInteger(); } + /** * Converts a BigInteger to a FiniteField\Integer integer * @@ -51,6 +55,7 @@ public function convertInteger(BigInteger $x) { return $this->factory->newInteger($x); } + /** * Returns the length, in bytes, of the modulo * @@ -60,6 +65,7 @@ public function getLengthInBytes() { return $this->factory->getLengthInBytes(); } + /** * Returns the length, in bits, of the modulo * @@ -69,6 +75,7 @@ public function getLength() { return $this->factory->getLength(); } + /** * Multiply a point on the curve by a scalar * @@ -82,15 +89,20 @@ public function getLength() public function multiplyPoint(array $p, BigInteger $d) { $alreadyInternal = isset($p[2]); - $r = $alreadyInternal ? [[], $p] : [[], $this->convertToInternal($p)]; + $r = $alreadyInternal ? + [[], $p] : + [[], $this->convertToInternal($p)]; + $d = $d->toBits(); - for ($i = 0; $i < \strlen($d); $i++) { + for ($i = 0; $i < strlen($d); $i++) { $d_i = (int) $d[$i]; $r[1 - $d_i] = $this->addPoint($r[0], $r[1]); $r[$d_i] = $this->doublePoint($r[$d_i]); } + return $alreadyInternal ? $r[0] : $this->convertToAffine($r[0]); } + /** * Creates a random scalar multiplier * @@ -102,8 +114,10 @@ public function createRandomMultiplier() if (!isset($one)) { $one = new BigInteger(1); } + return BigInteger::randomRange($one, $this->order->subtract($one)); } + /** * Performs range check */ @@ -113,6 +127,7 @@ public function rangeCheck(BigInteger $x) if (!isset($zero)) { $zero = new BigInteger(); } + if (!isset($this->order)) { throw new \RuntimeException('setOrder needs to be called before this method'); } @@ -120,6 +135,7 @@ public function rangeCheck(BigInteger $x) throw new \RangeException('x must be between 1 and the order of the curve'); } } + /** * Sets the Order */ @@ -127,6 +143,7 @@ public function setOrder(BigInteger $order) { $this->order = $order; } + /** * Returns the Order * @@ -136,6 +153,7 @@ public function getOrder() { return $this->order; } + /** * Use a custom defined modular reduction function * @@ -145,6 +163,7 @@ public function setReduction(callable $func) { $this->factory->setReduction($func); } + /** * Returns the affine point * @@ -154,6 +173,7 @@ public function convertToAffine(array $p) { return $p; } + /** * Converts an affine point to a jacobian coordinate * @@ -163,6 +183,7 @@ public function convertToInternal(array $p) { return $p; } + /** * Negates a point * @@ -170,12 +191,16 @@ public function convertToInternal(array $p) */ public function negatePoint(array $p) { - $temp = [$p[0], $p[1]->negate()]; + $temp = [ + $p[0], + $p[1]->negate() + ]; if (isset($p[2])) { $temp[] = $p[2]; } return $temp; } + /** * Multiply and Add Points * diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Binary.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Binary.php index 9c674a4..df099db 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Binary.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Binary.php @@ -18,16 +18,17 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; use OCA\Libresign\Vendor\phpseclib3\Math\BinaryField; use OCA\Libresign\Vendor\phpseclib3\Math\BinaryField\Integer as BinaryInteger; + /** * Curves over y^2 + x*y = x^3 + a*x^2 + b * * @author Jim Wigginton - * @internal */ class Binary extends Base { @@ -37,42 +38,49 @@ class Binary extends Base * @var BinaryField */ protected $factory; + /** * Cofficient for x^1 * * @var object */ protected $a; + /** * Cofficient for x^0 * * @var object */ protected $b; + /** * Base Point * * @var object */ protected $p; + /** * The number one over the specified finite field * * @var object */ protected $one; + /** * The modulo * * @var BigInteger */ protected $modulo; + /** * The Order * * @var BigInteger */ protected $order; + /** * Sets the modulo */ @@ -80,8 +88,10 @@ public function setModulo(...$modulo) { $this->modulo = $modulo; $this->factory = new BinaryField(...$modulo); - $this->one = $this->factory->newInteger("\x01"); + + $this->one = $this->factory->newInteger("\1"); } + /** * Set coefficients a and b * @@ -93,9 +103,10 @@ public function setCoefficients($a, $b) if (!isset($this->factory)) { throw new \RuntimeException('setModulo needs to be called before this method'); } - $this->a = $this->factory->newInteger(\pack('H*', $a)); - $this->b = $this->factory->newInteger(\pack('H*', $b)); + $this->a = $this->factory->newInteger(pack('H*', $a)); + $this->b = $this->factory->newInteger(pack('H*', $b)); } + /** * Set x and y coordinates for the base point * @@ -104,17 +115,21 @@ public function setCoefficients($a, $b) */ public function setBasePoint($x, $y) { - switch (\true) { - case !\is_string($x) && !$x instanceof BinaryInteger: - throw new \UnexpectedValueException('Argument 1 passed to Binary::setBasePoint() must be a string or an instance of BinaryField\\Integer'); - case !\is_string($y) && !$y instanceof BinaryInteger: - throw new \UnexpectedValueException('Argument 2 passed to Binary::setBasePoint() must be a string or an instance of BinaryField\\Integer'); + switch (true) { + case !is_string($x) && !$x instanceof BinaryInteger: + throw new \UnexpectedValueException('Argument 1 passed to Binary::setBasePoint() must be a string or an instance of BinaryField\Integer'); + case !is_string($y) && !$y instanceof BinaryInteger: + throw new \UnexpectedValueException('Argument 2 passed to Binary::setBasePoint() must be a string or an instance of BinaryField\Integer'); } if (!isset($this->factory)) { throw new \RuntimeException('setModulo needs to be called before this method'); } - $this->p = [\is_string($x) ? $this->factory->newInteger(\pack('H*', $x)) : $x, \is_string($y) ? $this->factory->newInteger(\pack('H*', $y)) : $y]; + $this->p = [ + is_string($x) ? $this->factory->newInteger(pack('H*', $x)) : $x, + is_string($y) ? $this->factory->newInteger(pack('H*', $y)) : $y + ]; } + /** * Retrieve the base point as an array * @@ -132,6 +147,7 @@ public function getBasePoint() */ return $this->p; } + /** * Adds two points on the curve * @@ -142,26 +158,33 @@ public function addPoint(array $p, array $q) if (!isset($this->factory)) { throw new \RuntimeException('setModulo needs to be called before this method'); } - if (!\count($p) || !\count($q)) { - if (\count($q)) { + + if (!count($p) || !count($q)) { + if (count($q)) { return $q; } - if (\count($p)) { + if (count($p)) { return $p; } return []; } + if (!isset($p[2]) || !isset($q[2])) { throw new \RuntimeException('Affine coordinates need to be manually converted to "Jacobi" coordinates or vice versa'); } + if ($p[0]->equals($q[0])) { return !$p[1]->equals($q[1]) ? [] : $this->doublePoint($p); } + // formulas from http://hyperelliptic.org/EFD/g12o/auto-shortw-jacobian.html + list($x1, $y1, $z1) = $p; list($x2, $y2, $z2) = $q; + $o1 = $z1->multiply($z1); $b = $x2->multiply($o1); + if ($z2->equals($this->one)) { $d = $y2->multiply($o1)->multiply($z1); $e = $x1->add($b); @@ -175,8 +198,10 @@ public function addPoint(array $p, array $q) $p3 = $e->multiply($e)->multiply($e); $x3 = $p1->add($p2)->add($p3); $y3 = $i->multiply($x3)->add($g->multiply($h)); + return [$x3, $y3, $z3]; } + $o2 = $z2->multiply($z2); $a = $x1->multiply($o2); $c = $y1->multiply($o2)->multiply($z2); @@ -192,8 +217,10 @@ public function addPoint(array $p, array $q) $p3 = $e->multiply($e)->multiply($e); $x3 = $p1->add($p2)->add($p3); $y3 = $i->multiply($x3)->add($g->multiply($g)->multiply($h)); + return [$x3, $y3, $z3]; } + /** * Doubles a point on a curve * @@ -204,24 +231,32 @@ public function doublePoint(array $p) if (!isset($this->factory)) { throw new \RuntimeException('setModulo needs to be called before this method'); } - if (!\count($p)) { + + if (!count($p)) { return []; } + if (!isset($p[2])) { throw new \RuntimeException('Affine coordinates need to be manually converted to "Jacobi" coordinates or vice versa'); } + // formulas from http://hyperelliptic.org/EFD/g12o/auto-shortw-jacobian.html + list($x1, $y1, $z1) = $p; + $a = $x1->multiply($x1); $b = $a->multiply($a); + if ($z1->equals($this->one)) { $x3 = $b->add($this->b); $z3 = clone $x1; $p1 = $a->add($y1)->add($z3)->multiply($this->b); $p2 = $a->add($y1)->multiply($b); $y3 = $p1->add($p2); + return [$x3, $y3, $z3]; } + $c = $z1->multiply($z1); $d = $c->multiply($c); $x3 = $b->add($this->b->multiply($d->multiply($d))); @@ -229,8 +264,10 @@ public function doublePoint(array $p) $p1 = $b->multiply($z3); $p2 = $a->add($y1->multiply($z1))->add($z3)->multiply($x3); $y3 = $p1->add($p2); + return [$x3, $y3, $z3]; } + /** * Returns the X coordinate and the derived Y coordinate * @@ -247,6 +284,7 @@ public function derivePoint($m) { throw new \RuntimeException('Point compression on binary finite field elliptic curves is not supported'); } + /** * Tests whether or not the x / y values satisfy the equation * @@ -260,8 +298,10 @@ public function verifyPoint(array $p) $x2 = $x->multiply($x); $x3 = $x2->multiply($x); $rhs = $x3->add($this->a->multiply($x2))->add($this->b); + return $lhs->equals($rhs); } + /** * Returns the modulo * @@ -271,6 +311,7 @@ public function getModulo() { return $this->modulo; } + /** * Returns the a coefficient * @@ -280,6 +321,7 @@ public function getA() { return $this->a; } + /** * Returns the a coefficient * @@ -289,6 +331,7 @@ public function getB() { return $this->b; } + /** * Returns the affine point * @@ -306,8 +349,12 @@ public function convertToAffine(array $p) list($x, $y, $z) = $p; $z = $this->one->divide($z); $z2 = $z->multiply($z); - return [$x->multiply($z2), $y->multiply($z2)->multiply($z)]; + return [ + $x->multiply($z2), + $y->multiply($z2)->multiply($z) + ]; } + /** * Converts an affine point to a jacobian coordinate * @@ -318,8 +365,9 @@ public function convertToInternal(array $p) if (isset($p[2])) { return $p; } + $p[2] = clone $this->one; - $p['fresh'] = \true; + $p['fresh'] = true; return $p; } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/KoblitzPrime.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/KoblitzPrime.php index a3fa28c..e6550bf 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/KoblitzPrime.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/KoblitzPrime.php @@ -25,15 +25,16 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; use OCA\Libresign\Vendor\phpseclib3\Math\PrimeField; + /** * Curves over y^2 = x^3 + b * * @author Jim Wigginton - * @internal */ class KoblitzPrime extends Prime { @@ -43,15 +44,18 @@ class KoblitzPrime extends Prime * @var list */ protected $basis; + /** * Beta * * @var PrimeField\Integer */ protected $beta; + // don't overwrite setCoefficients() with one that only accepts one parameter so that // one might be able to switch between KoblitzPrime and Prime more easily (for benchmarking // purposes). + /** * Multiply and Add Points * @@ -69,81 +73,115 @@ public function multiplyAddPoints(array $points, array $scalars) $two = new BigInteger(2); $one = new BigInteger(1); } + if (!isset($this->beta)) { // get roots $inv = $this->one->divide($this->two)->negate(); $s = $this->three->negate()->squareRoot()->multiply($inv); - $betas = [$inv->add($s), $inv->subtract($s)]; + $betas = [ + $inv->add($s), + $inv->subtract($s) + ]; $this->beta = $betas[0]->compare($betas[1]) < 0 ? $betas[0] : $betas[1]; //echo strtoupper($this->beta->toHex(true)) . "\n"; exit; } + if (!isset($this->basis)) { $factory = new PrimeField($this->order); $tempOne = $factory->newInteger($one); $tempTwo = $factory->newInteger($two); $tempThree = $factory->newInteger(new BigInteger(3)); + $inv = $tempOne->divide($tempTwo)->negate(); $s = $tempThree->negate()->squareRoot()->multiply($inv); - $lambdas = [$inv->add($s), $inv->subtract($s)]; + + $lambdas = [ + $inv->add($s), + $inv->subtract($s) + ]; + $lhs = $this->multiplyPoint($this->p, $lambdas[0])[0]; $rhs = $this->p[0]->multiply($this->beta); $lambda = $lhs->equals($rhs) ? $lambdas[0] : $lambdas[1]; + $this->basis = static::extendedGCD($lambda->toBigInteger(), $this->order); ///* foreach ($this->basis as $basis) { - echo \strtoupper($basis['a']->toHex(\true)) . "\n"; - echo \strtoupper($basis['b']->toHex(\true)) . "\n\n"; + echo strtoupper($basis['a']->toHex(true)) . "\n"; + echo strtoupper($basis['b']->toHex(true)) . "\n\n"; } exit; //*/ } + $npoints = $nscalars = []; - for ($i = 0; $i < \count($points); $i++) { + for ($i = 0; $i < count($points); $i++) { $p = $points[$i]; $k = $scalars[$i]->toBigInteger(); + // begin split list($v1, $v2) = $this->basis; + $c1 = $v2['b']->multiply($k); list($c1, $r) = $c1->divide($this->order); if ($this->order->compare($r->multiply($two)) <= 0) { $c1 = $c1->add($one); } + $c2 = $v1['b']->negate()->multiply($k); list($c2, $r) = $c2->divide($this->order); if ($this->order->compare($r->multiply($two)) <= 0) { $c2 = $c2->add($one); } + $p1 = $c1->multiply($v1['a']); $p2 = $c2->multiply($v2['a']); $q1 = $c1->multiply($v1['b']); $q2 = $c2->multiply($v2['b']); + $k1 = $k->subtract($p1)->subtract($p2); $k2 = $q1->add($q2)->negate(); // end split - $beta = [$p[0]->multiply($this->beta), $p[1], clone $this->one]; + + $beta = [ + $p[0]->multiply($this->beta), + $p[1], + clone $this->one + ]; + if (isset($p['naf'])) { - $beta['naf'] = \array_map(function ($p) { - return [$p[0]->multiply($this->beta), $p[1], clone $this->one]; + $beta['naf'] = array_map(function ($p) { + return [ + $p[0]->multiply($this->beta), + $p[1], + clone $this->one + ]; }, $p['naf']); $beta['nafwidth'] = $p['nafwidth']; } + if ($k1->isNegative()) { $k1 = $k1->negate(); $p = $this->negatePoint($p); } + if ($k2->isNegative()) { $k2 = $k2->negate(); $beta = $this->negatePoint($beta); } + $pos = 2 * $i; $npoints[$pos] = $p; $nscalars[$pos] = $this->factory->newInteger($k1); + $pos++; $npoints[$pos] = $beta; $nscalars[$pos] = $this->factory->newInteger($k2); } + return parent::multiplyAddPoints($npoints, $nscalars); } + /** * Returns the numerator and denominator of the slope * @@ -155,6 +193,7 @@ protected function doublePointHelper(array $p) $denominator = $this->two->multiply($p[1]); return [$numerator, $denominator]; } + /** * Doubles a jacobian coordinate on the curve * @@ -173,10 +212,13 @@ protected function jacobianDoublePoint(array $p) $e = $this->three->multiply($a); $f = $e->multiply($e); $x3 = $f->subtract($this->two->multiply($d)); - $y3 = $e->multiply($d->subtract($x3))->subtract($this->eight->multiply($c)); + $y3 = $e->multiply($d->subtract($x3))->subtract( + $this->eight->multiply($c) + ); $z3 = $this->two->multiply($y1)->multiply($z1); return [$x3, $y3, $z3]; } + /** * Doubles a "fresh" jacobian coordinate on the curve * @@ -200,6 +242,7 @@ protected function jacobianDoublePointMixed(array $p) $z3 = $this->two->multiply($y1); return [$x3, $y3, $z3]; } + /** * Tests whether or not the x / y values satisfy the equation * @@ -211,8 +254,10 @@ public function verifyPoint(array $p) $lhs = $y->multiply($y); $temp = $x->multiply($x)->multiply($x); $rhs = $temp->add($this->b); + return $lhs->equals($rhs); } + /** * Calculates the parameters needed from the Euclidean algorithm as discussed at * http://diamond.boisestate.edu/~liljanab/MATH308/GuideToECC.pdf#page=148 @@ -225,37 +270,48 @@ protected static function extendedGCD(BigInteger $u, BigInteger $v) { $one = new BigInteger(1); $zero = new BigInteger(); + $a = clone $one; $b = clone $zero; $c = clone $zero; $d = clone $one; + $stop = $v->bitwise_rightShift($v->getLength() >> 1); + $a1 = clone $zero; $b1 = clone $zero; $a2 = clone $zero; $b2 = clone $zero; + $postGreatestIndex = 0; + while (!$v->equals($zero)) { list($q) = $u->divide($v); + $temp = $u; $u = $v; $v = $temp->subtract($v->multiply($q)); + $temp = $a; $a = $c; $c = $temp->subtract($a->multiply($q)); + $temp = $b; $b = $d; $d = $temp->subtract($b->multiply($q)); + if ($v->compare($stop) > 0) { $a0 = $v; $b0 = $c; } else { $postGreatestIndex++; } + if ($postGreatestIndex == 1) { $a1 = $v; $b1 = $c->negate(); } + if ($postGreatestIndex == 2) { $rhs = $a0->multiply($a0)->add($b0->multiply($b0)); $lhs = $v->multiply($v)->add($b->multiply($b)); @@ -266,9 +322,14 @@ protected static function extendedGCD(BigInteger $u, BigInteger $v) $a2 = $v; $b2 = $c->negate(); } + break; } } - return [['a' => $a1, 'b' => $b1], ['a' => $a2, 'b' => $b2]]; + + return [ + ['a' => $a1, 'b' => $b1], + ['a' => $a2, 'b' => $b2] + ]; } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Montgomery.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Montgomery.php index 883af97..7e6eba4 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Montgomery.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Montgomery.php @@ -21,17 +21,18 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves\Curve25519; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; use OCA\Libresign\Vendor\phpseclib3\Math\PrimeField; use OCA\Libresign\Vendor\phpseclib3\Math\PrimeField\Integer as PrimeInteger; + /** * Curves over y^2 = x^3 + a*x + x * * @author Jim Wigginton - * @internal */ class Montgomery extends Base { @@ -41,48 +42,56 @@ class Montgomery extends Base * @var PrimeField */ protected $factory; + /** * Cofficient for x * * @var object */ protected $a; + /** * Constant used for point doubling * * @var object */ protected $a24; + /** * The Number Zero * * @var object */ protected $zero; + /** * The Number One * * @var object */ protected $one; + /** * Base Point * * @var object */ protected $p; + /** * The modulo * * @var BigInteger */ protected $modulo; + /** * The Order * * @var BigInteger */ protected $order; + /** * Sets the modulo */ @@ -93,6 +102,7 @@ public function setModulo(BigInteger $modulo) $this->zero = $this->factory->newInteger(new BigInteger()); $this->one = $this->factory->newInteger(new BigInteger(1)); } + /** * Set coefficients a */ @@ -106,6 +116,7 @@ public function setCoefficients(BigInteger $a) $four = $this->factory->newInteger(new BigInteger(4)); $this->a24 = $this->a->subtract($two)->divide($four); } + /** * Set x and y coordinates for the base point * @@ -115,17 +126,21 @@ public function setCoefficients(BigInteger $a) */ public function setBasePoint($x, $y) { - switch (\true) { + switch (true) { case !$x instanceof BigInteger && !$x instanceof PrimeInteger: - throw new \UnexpectedValueException('Argument 1 passed to Prime::setBasePoint() must be an instance of either BigInteger or PrimeField\\Integer'); + throw new \UnexpectedValueException('Argument 1 passed to Prime::setBasePoint() must be an instance of either BigInteger or PrimeField\Integer'); case !$y instanceof BigInteger && !$y instanceof PrimeInteger: - throw new \UnexpectedValueException('Argument 2 passed to Prime::setBasePoint() must be an instance of either BigInteger or PrimeField\\Integer'); + throw new \UnexpectedValueException('Argument 2 passed to Prime::setBasePoint() must be an instance of either BigInteger or PrimeField\Integer'); } if (!isset($this->factory)) { throw new \RuntimeException('setModulo needs to be called before this method'); } - $this->p = [$x instanceof BigInteger ? $this->factory->newInteger($x) : $x, $y instanceof BigInteger ? $this->factory->newInteger($y) : $y]; + $this->p = [ + $x instanceof BigInteger ? $this->factory->newInteger($x) : $x, + $y instanceof BigInteger ? $this->factory->newInteger($y) : $y + ]; } + /** * Retrieve the base point as an array * @@ -143,6 +158,7 @@ public function getBasePoint() */ return $this->p; } + /** * Doubles and adds a point on a curve * @@ -155,14 +171,18 @@ private function doubleAndAddPoint(array $p, array $q, PrimeInteger $x1) if (!isset($this->factory)) { throw new \RuntimeException('setModulo needs to be called before this method'); } - if (!\count($p) || !\count($q)) { + + if (!count($p) || !count($q)) { return []; } + if (!isset($p[1])) { throw new \RuntimeException('Affine coordinates need to be manually converted to XZ coordinates'); } + list($x2, $z2) = $p; list($x3, $z3) = $q; + $a = $x2->add($z2); $aa = $a->multiply($a); $b = $x2->subtract($z2); @@ -179,8 +199,13 @@ private function doubleAndAddPoint(array $p, array $q, PrimeInteger $x1) $x4 = $aa->multiply($bb); $temp = static::class == Curve25519::class ? $bb : $aa; $z4 = $e->multiply($temp->add($this->a24->multiply($e))); - return [[$x4, $z4], [$x5, $z5]]; + + return [ + [$x4, $z4], + [$x5, $z5] + ]; } + /** * Multiply a point on the curve by a scalar * @@ -197,9 +222,10 @@ public function multiplyPoint(array $p, BigInteger $d) $alreadyInternal = isset($p[1]); $p2 = $this->convertToInternal($p); $x = $p[0]; + $b = $d->toBits(); - $b = \str_pad($b, 256, '0', \STR_PAD_LEFT); - for ($i = 0; $i < \strlen($b); $i++) { + $b = str_pad($b, 256, '0', STR_PAD_LEFT); + for ($i = 0; $i < strlen($b); $i++) { $b_i = (int) $b[$i]; if ($b_i) { list($p2, $p1) = $this->doubleAndAddPoint($p2, $p1, $x); @@ -207,8 +233,10 @@ public function multiplyPoint(array $p, BigInteger $d) list($p1, $p2) = $this->doubleAndAddPoint($p1, $p2, $x); } } + return $alreadyInternal ? $p1 : $this->convertToAffine($p1); } + /** * Converts an affine point to an XZ coordinate * @@ -225,12 +253,16 @@ public function convertToInternal(array $p) if (empty($p)) { return [clone $this->zero, clone $this->one]; } + if (isset($p[1])) { return $p; } + $p[1] = clone $this->one; + return $p; } + /** * Returns the affine point * diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Prime.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Prime.php index 49107f9..b410dd28 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Prime.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Prime.php @@ -18,6 +18,7 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves; use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; @@ -25,11 +26,11 @@ use OCA\Libresign\Vendor\phpseclib3\Math\Common\FiniteField\Integer; use OCA\Libresign\Vendor\phpseclib3\Math\PrimeField; use OCA\Libresign\Vendor\phpseclib3\Math\PrimeField\Integer as PrimeInteger; + /** * Curves over y^2 = x^3 + a*x + b * * @author Jim Wigginton - * @internal */ class Prime extends Base { @@ -39,66 +40,77 @@ class Prime extends Base * @var \phpseclib3\Math\PrimeFields */ protected $factory; + /** * Cofficient for x^1 * * @var object */ protected $a; + /** * Cofficient for x^0 * * @var object */ protected $b; + /** * Base Point * * @var object */ protected $p; + /** * The number one over the specified finite field * * @var object */ protected $one; + /** * The number two over the specified finite field * * @var object */ protected $two; + /** * The number three over the specified finite field * * @var object */ protected $three; + /** * The number four over the specified finite field * * @var object */ protected $four; + /** * The number eight over the specified finite field * * @var object */ protected $eight; + /** * The modulo * * @var BigInteger */ protected $modulo; + /** * The Order * * @var BigInteger */ protected $order; + /** * Sets the modulo */ @@ -113,6 +125,7 @@ public function setModulo(BigInteger $modulo) $this->four = $this->factory->newInteger(new BigInteger(4)); $this->eight = $this->factory->newInteger(new BigInteger(8)); } + /** * Set coefficients a and b */ @@ -124,6 +137,7 @@ public function setCoefficients(BigInteger $a, BigInteger $b) $this->a = $this->factory->newInteger($a); $this->b = $this->factory->newInteger($b); } + /** * Set x and y coordinates for the base point * @@ -133,17 +147,21 @@ public function setCoefficients(BigInteger $a, BigInteger $b) */ public function setBasePoint($x, $y) { - switch (\true) { + switch (true) { case !$x instanceof BigInteger && !$x instanceof PrimeInteger: - throw new \UnexpectedValueException('Argument 1 passed to Prime::setBasePoint() must be an instance of either BigInteger or PrimeField\\Integer'); + throw new \UnexpectedValueException('Argument 1 passed to Prime::setBasePoint() must be an instance of either BigInteger or PrimeField\Integer'); case !$y instanceof BigInteger && !$y instanceof PrimeInteger: - throw new \UnexpectedValueException('Argument 2 passed to Prime::setBasePoint() must be an instance of either BigInteger or PrimeField\\Integer'); + throw new \UnexpectedValueException('Argument 2 passed to Prime::setBasePoint() must be an instance of either BigInteger or PrimeField\Integer'); } if (!isset($this->factory)) { throw new \RuntimeException('setModulo needs to be called before this method'); } - $this->p = [$x instanceof BigInteger ? $this->factory->newInteger($x) : $x, $y instanceof BigInteger ? $this->factory->newInteger($y) : $y]; + $this->p = [ + $x instanceof BigInteger ? $this->factory->newInteger($x) : $x, + $y instanceof BigInteger ? $this->factory->newInteger($y) : $y + ]; } + /** * Retrieve the base point as an array * @@ -161,6 +179,7 @@ public function getBasePoint() */ return $this->p; } + /** * Adds two "fresh" jacobian form on the curve * @@ -183,9 +202,14 @@ protected function jacobianAddPointMixedXY(array $p, array $q) $h3 = $h2->multiply($h); $v = $u1->multiply($h2); $x3 = $r->multiply($r)->subtract($h3)->subtract($v->multiply($this->two)); - $y3 = $r->multiply($v->subtract($x3))->subtract($s1->multiply($h3)); + $y3 = $r->multiply( + $v->subtract($x3) + )->subtract( + $s1->multiply($h3) + ); return [$x3, $y3, $h]; } + /** * Adds one "fresh" jacobian form on the curve * @@ -197,7 +221,9 @@ protected function jacobianAddPointMixedX(array $p, array $q) { list($u1, $s1, $z1) = $p; list($x2, $y2) = $q; + $z12 = $z1->multiply($z1); + $u2 = $x2->multiply($z12); $s2 = $y2->multiply($z12->multiply($z1)); if ($u1->equals($u2)) { @@ -213,10 +239,15 @@ protected function jacobianAddPointMixedX(array $p, array $q) $h3 = $h2->multiply($h); $v = $u1->multiply($h2); $x3 = $r->multiply($r)->subtract($h3)->subtract($v->multiply($this->two)); - $y3 = $r->multiply($v->subtract($x3))->subtract($s1->multiply($h3)); + $y3 = $r->multiply( + $v->subtract($x3) + )->subtract( + $s1->multiply($h3) + ); $z3 = $h->multiply($z1); return [$x3, $y3, $z3]; } + /** * Adds two jacobian coordinates on the curve * @@ -226,8 +257,10 @@ protected function jacobianAddPoint(array $p, array $q) { list($x1, $y1, $z1) = $p; list($x2, $y2, $z2) = $q; + $z12 = $z1->multiply($z1); $z22 = $z2->multiply($z2); + $u1 = $x1->multiply($z22); $u2 = $x2->multiply($z12); $s1 = $y1->multiply($z22->multiply($z2)); @@ -245,10 +278,15 @@ protected function jacobianAddPoint(array $p, array $q) $h3 = $h2->multiply($h); $v = $u1->multiply($h2); $x3 = $r->multiply($r)->subtract($h3)->subtract($v->multiply($this->two)); - $y3 = $r->multiply($v->subtract($x3))->subtract($s1->multiply($h3)); + $y3 = $r->multiply( + $v->subtract($x3) + )->subtract( + $s1->multiply($h3) + ); $z3 = $h->multiply($z1)->multiply($z2); return [$x3, $y3, $z3]; } + /** * Adds two points on the curve * @@ -259,15 +297,17 @@ public function addPoint(array $p, array $q) if (!isset($this->factory)) { throw new \RuntimeException('setModulo needs to be called before this method'); } - if (!\count($p) || !\count($q)) { - if (\count($q)) { + + if (!count($p) || !count($q)) { + if (count($q)) { return $q; } - if (\count($p)) { + if (count($p)) { return $p; } return []; } + // use jacobian coordinates if (isset($p[2]) && isset($q[2])) { if (isset($p['fresh']) && isset($q['fresh'])) { @@ -281,14 +321,15 @@ public function addPoint(array $p, array $q) } return $this->jacobianAddPoint($p, $q); } + if (isset($p[2]) || isset($q[2])) { throw new \RuntimeException('Affine coordinates need to be manually converted to Jacobi coordinates or vice versa'); } + if ($p[0]->equals($q[0])) { if (!$p[1]->equals($q[1])) { return []; - } else { - // eg. doublePoint + } else { // eg. doublePoint list($numerator, $denominator) = $this->doublePointHelper($p); } } else { @@ -298,8 +339,10 @@ public function addPoint(array $p, array $q) $slope = $numerator->divide($denominator); $x = $slope->multiply($slope)->subtract($p[0])->subtract($q[0]); $y = $slope->multiply($p[0]->subtract($x))->subtract($p[1]); + return [$x, $y]; } + /** * Returns the numerator and denominator of the slope * @@ -311,6 +354,7 @@ protected function doublePointHelper(array $p) $denominator = $this->two->multiply($p[1]); return [$numerator, $denominator]; } + /** * Doubles a jacobian coordinate on the curve * @@ -327,10 +371,13 @@ protected function jacobianDoublePoint(array $p) $m2 = $this->a->multiply($z2->multiply($z2)); $m = $m1->add($m2); $x1 = $m->multiply($m)->subtract($this->two->multiply($s)); - $y1 = $m->multiply($s->subtract($x1))->subtract($this->eight->multiply($y2->multiply($y2))); + $y1 = $m->multiply($s->subtract($x1))->subtract( + $this->eight->multiply($y2->multiply($y2)) + ); $z1 = $this->two->multiply($y)->multiply($z); return [$x1, $y1, $z1]; } + /** * Doubles a "fresh" jacobian coordinate on the curve * @@ -345,10 +392,13 @@ protected function jacobianDoublePointMixed(array $p) $m1 = $this->three->multiply($x2); $m = $m1->add($this->a); $x1 = $m->multiply($m)->subtract($this->two->multiply($s)); - $y1 = $m->multiply($s->subtract($x1))->subtract($this->eight->multiply($y2->multiply($y2))); + $y1 = $m->multiply($s->subtract($x1))->subtract( + $this->eight->multiply($y2->multiply($y2)) + ); $z1 = $this->two->multiply($y); return [$x1, $y1, $z1]; } + /** * Doubles a point on a curve * @@ -359,9 +409,11 @@ public function doublePoint(array $p) if (!isset($this->factory)) { throw new \RuntimeException('setModulo needs to be called before this method'); } - if (!\count($p)) { + + if (!count($p)) { return []; } + // use jacobian coordinates if (isset($p[2])) { if (isset($p['fresh'])) { @@ -369,12 +421,17 @@ public function doublePoint(array $p) } return $this->jacobianDoublePoint($p); } + list($numerator, $denominator) = $this->doublePointHelper($p); + $slope = $numerator->divide($denominator); + $x = $slope->multiply($slope)->subtract($p[0])->subtract($p[0]); $y = $slope->multiply($p[0]->subtract($x))->subtract($p[1]); + return [$x, $y]; } + /** * Returns the X coordinate and the derived Y coordinate * @@ -382,15 +439,15 @@ public function doublePoint(array $p) */ public function derivePoint($m) { - $y = \ord(Strings::shift($m)); + $y = ord(Strings::shift($m)); $x = new BigInteger($m, 256); $xp = $this->convertInteger($x); switch ($y) { case 2: - $ypn = \false; + $ypn = false; break; case 3: - $ypn = \true; + $ypn = true; break; default: throw new \RuntimeException('Coordinate not in recognized format'); @@ -406,6 +463,7 @@ public function derivePoint($m) $yp = $ypn == $bn ? $b : $b->negate(); return [$xp, $yp]; } + /** * Tests whether or not the x / y values satisfy the equation * @@ -418,8 +476,10 @@ public function verifyPoint(array $p) $temp = $x->multiply($this->a); $temp = $x->multiply($x)->multiply($x)->add($temp); $rhs = $temp->add($this->b); + return $lhs->equals($rhs); } + /** * Returns the modulo * @@ -429,6 +489,7 @@ public function getModulo() { return $this->modulo; } + /** * Returns the a coefficient * @@ -438,6 +499,7 @@ public function getA() { return $this->a; } + /** * Returns the a coefficient * @@ -447,6 +509,7 @@ public function getB() { return $this->b; } + /** * Multiply and Add Points * @@ -457,18 +520,23 @@ public function getB() */ public function multiplyAddPoints(array $points, array $scalars) { - $length = \count($points); + $length = count($points); + foreach ($points as &$point) { $point = $this->convertToInternal($point); } + $wnd = [$this->getNAFPoints($points[0], 7)]; $wndWidth = [isset($points[0]['nafwidth']) ? $points[0]['nafwidth'] : 7]; for ($i = 1; $i < $length; $i++) { $wnd[] = $this->getNAFPoints($points[$i], 1); $wndWidth[] = isset($points[$i]['nafwidth']) ? $points[$i]['nafwidth'] : 1; } + $naf = []; + // comb all window NAFs + $max = 0; for ($i = $length - 1; $i >= 1; $i -= 2) { $a = $i - 1; @@ -476,66 +544,63 @@ public function multiplyAddPoints(array $points, array $scalars) if ($wndWidth[$a] != 1 || $wndWidth[$b] != 1) { $naf[$a] = $scalars[$a]->getNAF($wndWidth[$a]); $naf[$b] = $scalars[$b]->getNAF($wndWidth[$b]); - $max = \max(\count($naf[$a]), \count($naf[$b]), $max); + $max = max(count($naf[$a]), count($naf[$b]), $max); continue; } + $comb = [ - $points[$a], - // 1 - null, - // 3 - null, - // 5 - $points[$b], + $points[$a], // 1 + null, // 3 + null, // 5 + $points[$b] // 7 ]; + $comb[1] = $this->addPoint($points[$a], $points[$b]); $comb[2] = $this->addPoint($points[$a], $this->negatePoint($points[$b])); + $index = [ - -3, - /* -1 -1 */ - -1, - /* -1 0 */ - -5, - /* -1 1 */ - -7, - /* 0 -1 */ - 0, - /* 0 -1 */ - 7, - /* 0 1 */ - 5, - /* 1 -1 */ - 1, - /* 1 0 */ - 3, + -3, /* -1 -1 */ + -1, /* -1 0 */ + -5, /* -1 1 */ + -7, /* 0 -1 */ + 0, /* 0 -1 */ + 7, /* 0 1 */ + 5, /* 1 -1 */ + 1, /* 1 0 */ + 3 /* 1 1 */ ]; + $jsf = self::getJSFPoints($scalars[$a], $scalars[$b]); - $max = \max(\count($jsf[0]), $max); + + $max = max(count($jsf[0]), $max); if ($max > 0) { - $naf[$a] = \array_fill(0, $max, 0); - $naf[$b] = \array_fill(0, $max, 0); + $naf[$a] = array_fill(0, $max, 0); + $naf[$b] = array_fill(0, $max, 0); } else { $naf[$a] = []; $naf[$b] = []; } + for ($j = 0; $j < $max; $j++) { $ja = isset($jsf[0][$j]) ? $jsf[0][$j] : 0; $jb = isset($jsf[1][$j]) ? $jsf[1][$j] : 0; + $naf[$a][$j] = $index[3 * ($ja + 1) + $jb + 1]; $naf[$b][$j] = 0; $wnd[$a] = $comb; } } + $acc = []; $temp = [0, 0, 0, 0]; for ($i = $max; $i >= 0; $i--) { $k = 0; while ($i >= 0) { - $zero = \true; + $zero = true; for ($j = 0; $j < $length; $j++) { $temp[$j] = isset($naf[$j][$i]) ? $naf[$j][$i] : 0; if ($temp[$j] != 0) { - $zero = \false; + $zero = false; } } if (!$zero) { @@ -544,27 +609,34 @@ public function multiplyAddPoints(array $points, array $scalars) $k++; $i--; } + if ($i >= 0) { $k++; } while ($k--) { $acc = $this->doublePoint($acc); } + if ($i < 0) { break; } + for ($j = 0; $j < $length; $j++) { $z = $temp[$j]; $p = null; if ($z == 0) { continue; } - $p = $z > 0 ? $wnd[$j][$z - 1 >> 1] : $this->negatePoint($wnd[$j][-$z - 1 >> 1]); + $p = $z > 0 ? + $wnd[$j][($z - 1) >> 1] : + $this->negatePoint($wnd[$j][(-$z - 1) >> 1]); $acc = $this->addPoint($acc, $p); } } + return $this->convertToAffine($acc); } + /** * Precomputes NAF points * @@ -578,13 +650,16 @@ private function getNAFPoints(array $point, $wnd) if (isset($point['naf'])) { return $point['naf']; } + $res = [$point]; $max = (1 << $wnd) - 1; $dbl = $max == 1 ? null : $this->doublePoint($point); for ($i = 1; $i < $max; $i++) { $res[] = $this->addPoint($res[$i - 1], $dbl); } + $point['naf'] = $res; + /* $str = ''; foreach ($res as $re) { @@ -595,8 +670,10 @@ private function getNAFPoints(array $point, $wnd) file_put_contents('temp.txt', $str); exit; */ + return $res; } + /** * Precomputes points in Joint Sparse Form * @@ -611,43 +688,48 @@ private static function getJSFPoints(Integer $k1, Integer $k2) if (!isset($three)) { $three = new BigInteger(3); } + $jsf = [[], []]; $k1 = $k1->toBigInteger(); $k2 = $k2->toBigInteger(); $d1 = 0; $d2 = 0; + while ($k1->compare(new BigInteger(-$d1)) > 0 || $k2->compare(new BigInteger(-$d2)) > 0) { // first phase $m14 = $k1->testBit(0) + 2 * $k1->testBit(1); $m14 += $d1; $m14 &= 3; + $m24 = $k2->testBit(0) + 2 * $k2->testBit(1); $m24 += $d2; $m24 &= 3; + if ($m14 == 3) { $m14 = -1; } if ($m24 == 3) { $m24 = -1; } + $u1 = 0; - if ($m14 & 1) { - // if $m14 is odd + if ($m14 & 1) { // if $m14 is odd $m8 = $k1->testBit(0) + 2 * $k1->testBit(1) + 4 * $k1->testBit(2); $m8 += $d1; $m8 &= 7; $u1 = ($m8 == 3 || $m8 == 5) && $m24 == 2 ? -$m14 : $m14; } $jsf[0][] = $u1; + $u2 = 0; - if ($m24 & 1) { - // if $m24 is odd + if ($m24 & 1) { // if $m24 is odd $m8 = $k2->testBit(0) + 2 * $k2->testBit(1) + 4 * $k2->testBit(2); $m8 += $d2; $m8 &= 7; $u2 = ($m8 == 3 || $m8 == 5) && $m14 == 2 ? -$m24 : $m24; } $jsf[1][] = $u2; + // second phase if (2 * $d1 == $u1 + 1) { $d1 = 1 - $d1; @@ -658,8 +740,10 @@ private static function getJSFPoints(Integer $k1, Integer $k2) $k1 = $k1->bitwise_rightShift(1); $k2 = $k2->bitwise_rightShift(1); } + return $jsf; } + /** * Returns the affine point * @@ -677,8 +761,12 @@ public function convertToAffine(array $p) list($x, $y, $z) = $p; $z = $this->one->divide($z); $z2 = $z->multiply($z); - return [$x->multiply($z2), $y->multiply($z2)->multiply($z)]; + return [ + $x->multiply($z2), + $y->multiply($z2)->multiply($z) + ]; } + /** * Converts an affine point to a jacobian coordinate * @@ -689,8 +777,9 @@ public function convertToInternal(array $p) if (isset($p[2])) { return $p; } + $p[2] = clone $this->one; - $p['fresh'] = \true; + $p['fresh'] = true; return $p; } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/TwistedEdwards.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/TwistedEdwards.php index 36089a3..d0ed070 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/TwistedEdwards.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/TwistedEdwards.php @@ -23,16 +23,17 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; use OCA\Libresign\Vendor\phpseclib3\Math\PrimeField; use OCA\Libresign\Vendor\phpseclib3\Math\PrimeField\Integer as PrimeInteger; + /** * Curves over a*x^2 + y^2 = 1 + d*x^2*y^2 * * @author Jim Wigginton - * @internal */ class TwistedEdwards extends Base { @@ -42,42 +43,49 @@ class TwistedEdwards extends Base * @var BigInteger */ protected $modulo; + /** * Cofficient for x^2 * * @var object */ protected $a; + /** * Cofficient for x^2*y^2 * * @var object */ protected $d; + /** * Base Point * * @var object[] */ protected $p; + /** * The number zero over the specified finite field * * @var object */ protected $zero; + /** * The number one over the specified finite field * * @var object */ protected $one; + /** * The number two over the specified finite field * * @var object */ protected $two; + /** * Sets the modulo */ @@ -89,6 +97,7 @@ public function setModulo(BigInteger $modulo) $this->one = $this->factory->newInteger(new BigInteger(1)); $this->two = $this->factory->newInteger(new BigInteger(2)); } + /** * Set coefficients a and b */ @@ -100,22 +109,27 @@ public function setCoefficients(BigInteger $a, BigInteger $d) $this->a = $this->factory->newInteger($a); $this->d = $this->factory->newInteger($d); } + /** * Set x and y coordinates for the base point */ public function setBasePoint($x, $y) { - switch (\true) { + switch (true) { case !$x instanceof BigInteger && !$x instanceof PrimeInteger: - throw new \UnexpectedValueException('Argument 1 passed to Prime::setBasePoint() must be an instance of either BigInteger or PrimeField\\Integer'); + throw new \UnexpectedValueException('Argument 1 passed to Prime::setBasePoint() must be an instance of either BigInteger or PrimeField\Integer'); case !$y instanceof BigInteger && !$y instanceof PrimeInteger: - throw new \UnexpectedValueException('Argument 2 passed to Prime::setBasePoint() must be an instance of either BigInteger or PrimeField\\Integer'); + throw new \UnexpectedValueException('Argument 2 passed to Prime::setBasePoint() must be an instance of either BigInteger or PrimeField\Integer'); } if (!isset($this->factory)) { throw new \RuntimeException('setModulo needs to be called before this method'); } - $this->p = [$x instanceof BigInteger ? $this->factory->newInteger($x) : $x, $y instanceof BigInteger ? $this->factory->newInteger($y) : $y]; + $this->p = [ + $x instanceof BigInteger ? $this->factory->newInteger($x) : $x, + $y instanceof BigInteger ? $this->factory->newInteger($y) : $y + ]; } + /** * Returns the a coefficient * @@ -125,6 +139,7 @@ public function getA() { return $this->a; } + /** * Returns the a coefficient * @@ -134,6 +149,7 @@ public function getD() { return $this->d; } + /** * Retrieve the base point as an array * @@ -151,6 +167,7 @@ public function getBasePoint() */ return $this->p; } + /** * Returns the affine point * @@ -163,8 +180,12 @@ public function convertToAffine(array $p) } list($x, $y, $z) = $p; $z = $this->one->divide($z); - return [$x->multiply($z), $y->multiply($z)]; + return [ + $x->multiply($z), + $y->multiply($z) + ]; } + /** * Returns the modulo * @@ -174,6 +195,7 @@ public function getModulo() { return $this->modulo; } + /** * Tests whether or not the x / y values satisfy the equation * @@ -184,8 +206,10 @@ public function verifyPoint(array $p) list($x, $y) = $p; $x2 = $x->multiply($x); $y2 = $y->multiply($y); + $lhs = $this->a->multiply($x2)->add($y2); $rhs = $this->d->multiply($x2)->multiply($y2)->add($this->one); + return $lhs->equals($rhs); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Curve25519.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Curve25519.php index 07a55b0..75699fb 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Curve25519.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Curve25519.php @@ -10,11 +10,12 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Montgomery; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class Curve25519 extends Montgomery { public function __construct() @@ -25,6 +26,7 @@ public function __construct() $this->p = [$this->factory->newInteger(new BigInteger(9))]; // 2^252 + 0x14def9dea2f79cd65812631a5cf5d3ed $this->setOrder(new BigInteger('1000000000000000000000000000000014DEF9DEA2F79CD65812631A5CF5D3ED', 16)); + /* $this->setCoefficients( new BigInteger('486662'), // a @@ -35,6 +37,7 @@ public function __construct() ); */ } + /** * Multiply a point on the curve by a scalar * @@ -46,13 +49,16 @@ public function multiplyPoint(array $p, BigInteger $d) { //$r = strrev(sodium_crypto_scalarmult($d->toBytes(), strrev($p[0]->toBytes()))); //return [$this->factory->newInteger(new BigInteger($r, 256))]; + $d = $d->toBytes(); - $d &= "\xf8" . \str_repeat("\xff", 30) . ""; - $d = \strrev($d); - $d |= "@"; + $d &= "\xF8" . str_repeat("\xFF", 30) . "\x7F"; + $d = strrev($d); + $d |= "\x40"; $d = new BigInteger($d, -256); + return parent::multiplyPoint($p, $d); } + /** * Creates a random scalar multiplier * @@ -62,6 +68,7 @@ public function createRandomMultiplier() { return BigInteger::random(256); } + /** * Performs range check */ diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Curve448.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Curve448.php index 55d13a8..1da0448 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Curve448.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Curve448.php @@ -10,21 +10,31 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Montgomery; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class Curve448 extends Montgomery { public function __construct() { // 2^448 - 2^224 - 1 - $this->setModulo(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE' . 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', 16)); + $this->setModulo(new BigInteger( + 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE' . + 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', + 16 + )); $this->a24 = $this->factory->newInteger(new BigInteger('39081')); $this->p = [$this->factory->newInteger(new BigInteger(5))]; // 2^446 - 0x8335dc163bb124b65129c96fde933d8d723a70aadc873d6d54a7bb0d - $this->setOrder(new BigInteger('3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' . '7CCA23E9C44EDB49AED63690216CC2728DC58F552378C292AB5844F3', 16)); + $this->setOrder(new BigInteger( + '3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' . + '7CCA23E9C44EDB49AED63690216CC2728DC58F552378C292AB5844F3', + 16 + )); + /* $this->setCoefficients( new BigInteger('156326'), // a @@ -38,6 +48,7 @@ public function __construct() ); */ } + /** * Multiply a point on the curve by a scalar * @@ -49,13 +60,16 @@ public function multiplyPoint(array $p, BigInteger $d) { //$r = strrev(sodium_crypto_scalarmult($d->toBytes(), strrev($p[0]->toBytes()))); //return [$this->factory->newInteger(new BigInteger($r, 256))]; + $d = $d->toBytes(); - $d[0] = $d[0] & "\xfc"; - $d = \strrev($d); + $d[0] = $d[0] & "\xFC"; + $d = strrev($d); $d |= "\x80"; $d = new BigInteger($d, 256); + return parent::multiplyPoint($p, $d); } + /** * Creates a random scalar multiplier * @@ -65,6 +79,7 @@ public function createRandomMultiplier() { return BigInteger::random(446); } + /** * Performs range check */ diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Ed25519.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Ed25519.php index 73253f2..f91a230 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Ed25519.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Ed25519.php @@ -9,54 +9,58 @@ * @copyright 2017 Jim Wigginton * @license http://www.opensource.org/licenses/mit-license.html MIT License */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\TwistedEdwards; use OCA\Libresign\Vendor\phpseclib3\Crypt\Hash; use OCA\Libresign\Vendor\phpseclib3\Crypt\Random; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class Ed25519 extends TwistedEdwards { const HASH = 'sha512'; /* Per https://tools.ietf.org/html/rfc8032#page-6 EdDSA has several parameters, one of which is b: - + 2. An integer b with 2^(b-1) > p. EdDSA public keys have exactly b bits, and EdDSA signatures have exactly 2*b bits. b is recommended to be a multiple of 8, so public key and signature lengths are an integral number of octets. - + SIZE corresponds to b */ const SIZE = 32; + public function __construct() { // 2^255 - 19 $this->setModulo(new BigInteger('7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED', 16)); $this->setCoefficients( // -1 - new BigInteger('7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC', 16), - // a + new BigInteger('7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC', 16), // a // -121665/121666 - new BigInteger('52036CEE2B6FFE738CC740797779E89800700A4D4141D8AB75EB4DCA135978A3', 16) + new BigInteger('52036CEE2B6FFE738CC740797779E89800700A4D4141D8AB75EB4DCA135978A3', 16) // d + ); + $this->setBasePoint( + new BigInteger('216936D3CD6E53FEC0A4E231FDD6DC5C692CC7609525A7B2C9562D608F25D51A', 16), + new BigInteger('6666666666666666666666666666666666666666666666666666666666666658', 16) ); - $this->setBasePoint(new BigInteger('216936D3CD6E53FEC0A4E231FDD6DC5C692CC7609525A7B2C9562D608F25D51A', 16), new BigInteger('6666666666666666666666666666666666666666666666666666666666666658', 16)); $this->setOrder(new BigInteger('1000000000000000000000000000000014DEF9DEA2F79CD65812631A5CF5D3ED', 16)); // algorithm 14.47 from http://cacr.uwaterloo.ca/hac/about/chap14.pdf#page=16 /* $this->setReduction(function($x) { $parts = $x->bitwise_split(255); $className = $this->className; - + if (count($parts) > 2) { list(, $r) = $x->divide($className::$modulo); return $r; } - + $zero = new BigInteger(); $c = new BigInteger(19); - + switch (count($parts)) { case 2: list($qi, $ri) = $parts; @@ -69,7 +73,7 @@ public function __construct() return $zero; } $r = $ri; - + while ($qi->compare($zero) > 0) { $temp = $qi->multiply($c)->bitwise_split(255); if (count($temp) == 2) { @@ -80,7 +84,7 @@ public function __construct() } $r = $r->add($ri); } - + while ($r->compare($className::$modulo) > 0) { $r = $r->subtract($className::$modulo); } @@ -88,6 +92,7 @@ public function __construct() }); */ } + /** * Recover X from Y * @@ -102,6 +107,7 @@ public function __construct() public function recoverX(BigInteger $y, $sign) { $y = $this->factory->newInteger($y); + $y2 = $y->multiply($y); $u = $y2->subtract($this->one); $v = $this->d->multiply($y2)->add($this->one); @@ -114,16 +120,17 @@ public function recoverX(BigInteger $y, $sign) } // find the square root /* we don't do $x2->squareRoot() because, quoting from - https://tools.ietf.org/html/rfc8032#section-5.1.1: - - "For point decoding or "decompression", square roots modulo p are - needed. They can be computed using the Tonelli-Shanks algorithm or - the special case for p = 5 (mod 8). To find a square root of a, - first compute the candidate root x = a^((p+3)/8) (mod p)." - */ + https://tools.ietf.org/html/rfc8032#section-5.1.1: + + "For point decoding or "decompression", square roots modulo p are + needed. They can be computed using the Tonelli-Shanks algorithm or + the special case for p = 5 (mod 8). To find a square root of a, + first compute the candidate root x = a^((p+3)/8) (mod p)." + */ $exp = $this->getModulo()->add(new BigInteger(3)); $exp = $exp->bitwise_rightShift(3); $x = $x2->pow($exp); + // If v x^2 = -u (mod p), set x <-- x * 2^((p-1)/4), which is a square root. if (!$x->multiply($x)->subtract($x2)->equals($this->zero)) { $temp = $this->getModulo()->subtract(new BigInteger(1)); @@ -137,8 +144,10 @@ public function recoverX(BigInteger $y, $sign) if ($x->isOdd() != $sign) { $x = $x->negate(); } + return [$x, $y]; } + /** * Extract Secret Scalar * @@ -151,7 +160,7 @@ public function recoverX(BigInteger $y, $sign) */ public function extractSecret($str) { - if (\strlen($str) != 32) { + if (strlen($str) != 32) { throw new \LengthException('Private Key should be 32-bytes long'); } // 1. Hash the 32-byte private key using SHA-512, storing the digest in @@ -159,18 +168,23 @@ public function extractSecret($str) // used for generating the public key. $hash = new Hash('sha512'); $h = $hash->hash($str); - $h = \substr($h, 0, 32); + $h = substr($h, 0, 32); // 2. Prune the buffer: The lowest three bits of the first octet are // cleared, the highest bit of the last octet is cleared, and the // second highest bit of the last octet is set. - $h[0] = $h[0] & \chr(0xf8); - $h = \strrev($h); - $h[0] = $h[0] & \chr(0x3f) | \chr(0x40); + $h[0] = $h[0] & chr(0xF8); + $h = strrev($h); + $h[0] = ($h[0] & chr(0x3F)) | chr(0x40); // 3. Interpret the buffer as the little-endian integer, forming a // secret scalar s. $dA = new BigInteger($h, 256); - return ['dA' => $dA, 'secret' => $str]; + + return [ + 'dA' => $dA, + 'secret' => $str + ]; } + /** * Encode a point as a string * @@ -181,13 +195,15 @@ public function encodePoint($point) { list($x, $y) = $point; $y = $y->toBytes(); - $y[0] = $y[0] & \chr(0x7f); + $y[0] = $y[0] & chr(0x7F); if ($x->isOdd()) { - $y[0] = $y[0] | \chr(0x80); + $y[0] = $y[0] | chr(0x80); } - $y = \strrev($y); + $y = strrev($y); + return $y; } + /** * Creates a random scalar multiplier * @@ -197,6 +213,7 @@ public function createRandomMultiplier() { return $this->extractSecret(Random::string(32))['dA']; } + /** * Converts an affine point to an extended homogeneous coordinate * @@ -212,13 +229,17 @@ public function convertToInternal(array $p) if (empty($p)) { return [clone $this->zero, clone $this->one, clone $this->one, clone $this->zero]; } + if (isset($p[2])) { return $p; } + $p[2] = clone $this->one; $p[3] = $p[0]->multiply($p[1]); + return $p; } + /** * Doubles a point on a curve * @@ -229,14 +250,19 @@ public function doublePoint(array $p) if (!isset($this->factory)) { throw new \RuntimeException('setModulo needs to be called before this method'); } - if (!\count($p)) { + + if (!count($p)) { return []; } + if (!isset($p[2])) { throw new \RuntimeException('Affine coordinates need to be manually converted to "Jacobi" coordinates or vice versa'); } + // from https://tools.ietf.org/html/rfc8032#page-12 + list($x1, $y1, $z1, $t1) = $p; + $a = $x1->multiply($x1); $b = $y1->multiply($y1); $c = $this->two->multiply($z1)->multiply($z1); @@ -245,12 +271,15 @@ public function doublePoint(array $p) $e = $h->subtract($temp->multiply($temp)); $g = $a->subtract($b); $f = $c->add($g); + $x3 = $e->multiply($f); $y3 = $g->multiply($h); $t3 = $e->multiply($h); $z3 = $f->multiply($g); + return [$x3, $y3, $z3, $t3]; } + /** * Adds two points on the curve * @@ -261,24 +290,30 @@ public function addPoint(array $p, array $q) if (!isset($this->factory)) { throw new \RuntimeException('setModulo needs to be called before this method'); } - if (!\count($p) || !\count($q)) { - if (\count($q)) { + + if (!count($p) || !count($q)) { + if (count($q)) { return $q; } - if (\count($p)) { + if (count($p)) { return $p; } return []; } + if (!isset($p[2]) || !isset($q[2])) { throw new \RuntimeException('Affine coordinates need to be manually converted to "Jacobi" coordinates or vice versa'); } + if ($p[0]->equals($q[0])) { return !$p[1]->equals($q[1]) ? [] : $this->doublePoint($p); } + // from https://tools.ietf.org/html/rfc8032#page-12 + list($x1, $y1, $z1, $t1) = $p; list($x2, $y2, $z2, $t2) = $q; + $a = $y1->subtract($x1)->multiply($y2->subtract($x2)); $b = $y1->add($x1)->multiply($y2->add($x2)); $c = $t1->multiply($this->two)->multiply($this->d)->multiply($t2); @@ -287,10 +322,12 @@ public function addPoint(array $p, array $q) $f = $d->subtract($c); $g = $d->add($c); $h = $b->add($a); + $x3 = $e->multiply($f); $y3 = $g->multiply($h); $t3 = $e->multiply($h); $z3 = $f->multiply($g); + return [$x3, $y3, $z3, $t3]; } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Ed448.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Ed448.php index f66c308..5b75ded 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Ed448.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Ed448.php @@ -9,29 +9,46 @@ * @copyright 2017 Jim Wigginton * @license http://www.opensource.org/licenses/mit-license.html MIT License */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\TwistedEdwards; use OCA\Libresign\Vendor\phpseclib3\Crypt\Hash; use OCA\Libresign\Vendor\phpseclib3\Crypt\Random; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class Ed448 extends TwistedEdwards { const HASH = 'shake256-912'; const SIZE = 57; + public function __construct() { // 2^448 - 2^224 - 1 - $this->setModulo(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE' . 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', 16)); + $this->setModulo(new BigInteger( + 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE' . + 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', + 16 + )); $this->setCoefficients( new BigInteger(1), // -39081 - new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE' . 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6756', 16) + new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE' . + 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6756', 16) ); - $this->setBasePoint(new BigInteger('4F1970C66BED0DED221D15A622BF36DA9E146570470F1767EA6DE324' . 'A3D3A46412AE1AF72AB66511433B80E18B00938E2626A82BC70CC05E', 16), new BigInteger('693F46716EB6BC248876203756C9C7624BEA73736CA3984087789C1E' . '05A0C2D73AD3FF1CE67C39C4FDBD132C4ED7C8AD9808795BF230FA14', 16)); - $this->setOrder(new BigInteger('3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' . '7CCA23E9C44EDB49AED63690216CC2728DC58F552378C292AB5844F3', 16)); + $this->setBasePoint( + new BigInteger('4F1970C66BED0DED221D15A622BF36DA9E146570470F1767EA6DE324' . + 'A3D3A46412AE1AF72AB66511433B80E18B00938E2626A82BC70CC05E', 16), + new BigInteger('693F46716EB6BC248876203756C9C7624BEA73736CA3984087789C1E' . + '05A0C2D73AD3FF1CE67C39C4FDBD132C4ED7C8AD9808795BF230FA14', 16) + ); + $this->setOrder(new BigInteger( + '3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' . + '7CCA23E9C44EDB49AED63690216CC2728DC58F552378C292AB5844F3', + 16 + )); } + /** * Recover X from Y * @@ -46,6 +63,7 @@ public function __construct() public function recoverX(BigInteger $y, $sign) { $y = $this->factory->newInteger($y); + $y2 = $y->multiply($y); $u = $y2->subtract($this->one); $v = $this->d->multiply($y2)->subtract($this->one); @@ -60,14 +78,17 @@ public function recoverX(BigInteger $y, $sign) $exp = $this->getModulo()->add(new BigInteger(1)); $exp = $exp->bitwise_rightShift(2); $x = $x2->pow($exp); + if (!$x->multiply($x)->subtract($x2)->equals($this->zero)) { throw new \RuntimeException('Unable to recover X coordinate'); } if ($x->isOdd() != $sign) { $x = $x->negate(); } + return [$x, $y]; } + /** * Extract Secret Scalar * @@ -80,7 +101,7 @@ public function recoverX(BigInteger $y, $sign) */ public function extractSecret($str) { - if (\strlen($str) != 57) { + if (strlen($str) != 57) { throw new \LengthException('Private Key should be 57-bytes long'); } // 1. Hash the 57-byte private key using SHAKE256(x, 114), storing the @@ -88,21 +109,27 @@ public function extractSecret($str) // bytes are used for generating the public key. $hash = new Hash('shake256-912'); $h = $hash->hash($str); - $h = \substr($h, 0, 57); + $h = substr($h, 0, 57); // 2. Prune the buffer: The two least significant bits of the first // octet are cleared, all eight bits the last octet are cleared, and // the highest bit of the second to last octet is set. - $h[0] = $h[0] & \chr(0xfc); - $h = \strrev($h); - $h[0] = "\x00"; - $h[1] = $h[1] | \chr(0x80); + $h[0] = $h[0] & chr(0xFC); + $h = strrev($h); + $h[0] = "\0"; + $h[1] = $h[1] | chr(0x80); // 3. Interpret the buffer as the little-endian integer, forming a // secret scalar s. $dA = new BigInteger($h, 256); - return ['dA' => $dA, 'secret' => $str]; + + return [ + 'dA' => $dA, + 'secret' => $str + ]; + $dA->secret = $str; return $dA; } + /** * Encode a point as a string * @@ -112,13 +139,15 @@ public function extractSecret($str) public function encodePoint($point) { list($x, $y) = $point; - $y = "\x00" . $y->toBytes(); + $y = "\0" . $y->toBytes(); if ($x->isOdd()) { - $y[0] = $y[0] | \chr(0x80); + $y[0] = $y[0] | chr(0x80); } - $y = \strrev($y); + $y = strrev($y); + return $y; } + /** * Creates a random scalar multiplier * @@ -128,6 +157,7 @@ public function createRandomMultiplier() { return $this->extractSecret(Random::string(57))['dA']; } + /** * Converts an affine point to an extended homogeneous coordinate * @@ -143,12 +173,16 @@ public function convertToInternal(array $p) if (empty($p)) { return [clone $this->zero, clone $this->one, clone $this->one]; } + if (isset($p[2])) { return $p; } + $p[2] = clone $this->one; + return $p; } + /** * Doubles a point on a curve * @@ -159,14 +193,19 @@ public function doublePoint(array $p) if (!isset($this->factory)) { throw new \RuntimeException('setModulo needs to be called before this method'); } - if (!\count($p)) { + + if (!count($p)) { return []; } + if (!isset($p[2])) { throw new \RuntimeException('Affine coordinates need to be manually converted to "Jacobi" coordinates or vice versa'); } + // from https://tools.ietf.org/html/rfc8032#page-18 + list($x1, $y1, $z1) = $p; + $b = $x1->add($y1); $b = $b->multiply($b); $c = $x1->multiply($x1); @@ -174,11 +213,14 @@ public function doublePoint(array $p) $e = $c->add($d); $h = $z1->multiply($z1); $j = $e->subtract($this->two->multiply($h)); + $x3 = $b->subtract($e)->multiply($j); $y3 = $c->subtract($d)->multiply($e); $z3 = $e->multiply($j); + return [$x3, $y3, $z3]; } + /** * Adds two points on the curve * @@ -189,24 +231,30 @@ public function addPoint(array $p, array $q) if (!isset($this->factory)) { throw new \RuntimeException('setModulo needs to be called before this method'); } - if (!\count($p) || !\count($q)) { - if (\count($q)) { + + if (!count($p) || !count($q)) { + if (count($q)) { return $q; } - if (\count($p)) { + if (count($p)) { return $p; } return []; } + if (!isset($p[2]) || !isset($q[2])) { throw new \RuntimeException('Affine coordinates need to be manually converted to "Jacobi" coordinates or vice versa'); } + if ($p[0]->equals($q[0])) { return !$p[1]->equals($q[1]) ? [] : $this->doublePoint($p); } + // from https://tools.ietf.org/html/rfc8032#page-17 + list($x1, $y1, $z1) = $p; list($x2, $y2, $z2) = $q; + $a = $z1->multiply($z2); $b = $a->multiply($a); $c = $x1->multiply($x2); @@ -215,9 +263,11 @@ public function addPoint(array $p, array $q) $f = $b->subtract($e); $g = $b->add($e); $h = $x1->add($y1)->multiply($x2->add($y2)); + $x3 = $a->multiply($f)->multiply($h->subtract($c)->subtract($d)); $y3 = $a->multiply($g)->multiply($d->subtract($c)); $z3 = $f->multiply($g); + return [$x3, $y3, $z3]; } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP160r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP160r1.php index 0f65865..337d89b 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP160r1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP160r1.php @@ -10,18 +10,25 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class brainpoolP160r1 extends Prime { public function __construct() { $this->setModulo(new BigInteger('E95E4A5F737059DC60DFC7AD95B3D8139515620F', 16)); - $this->setCoefficients(new BigInteger('340E7BE2A280EB74E2BE61BADA745D97E8F7C300', 16), new BigInteger('1E589A8595423412134FAA2DBDEC95C8D8675E58', 16)); - $this->setBasePoint(new BigInteger('BED5AF16EA3F6A4F62938C4631EB5AF7BDBCDBC3', 16), new BigInteger('1667CB477A1A8EC338F94741669C976316DA6321', 16)); + $this->setCoefficients( + new BigInteger('340E7BE2A280EB74E2BE61BADA745D97E8F7C300', 16), + new BigInteger('1E589A8595423412134FAA2DBDEC95C8D8675E58', 16) + ); + $this->setBasePoint( + new BigInteger('BED5AF16EA3F6A4F62938C4631EB5AF7BDBCDBC3', 16), + new BigInteger('1667CB477A1A8EC338F94741669C976316DA6321', 16) + ); $this->setOrder(new BigInteger('E95E4A5F737059DC60DF5991D45029409E60FC09', 16)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP160t1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP160t1.php index dba6e10..19bdb80 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP160t1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP160t1.php @@ -23,22 +23,25 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class brainpoolP160t1 extends Prime { public function __construct() { $this->setModulo(new BigInteger('E95E4A5F737059DC60DFC7AD95B3D8139515620F', 16)); $this->setCoefficients( - new BigInteger('E95E4A5F737059DC60DFC7AD95B3D8139515620C', 16), - // eg. -3 + new BigInteger('E95E4A5F737059DC60DFC7AD95B3D8139515620C', 16), // eg. -3 new BigInteger('7A556B6DAE535B7B51ED2C4D7DAA7A0B5C55F380', 16) ); - $this->setBasePoint(new BigInteger('B199B13B9B34EFC1397E64BAEB05ACC265FF2378', 16), new BigInteger('ADD6718B7C7C1961F0991B842443772152C9E0AD', 16)); + $this->setBasePoint( + new BigInteger('B199B13B9B34EFC1397E64BAEB05ACC265FF2378', 16), + new BigInteger('ADD6718B7C7C1961F0991B842443772152C9E0AD', 16) + ); $this->setOrder(new BigInteger('E95E4A5F737059DC60DF5991D45029409E60FC09', 16)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP192r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP192r1.php index 19a8e93..678dc40 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP192r1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP192r1.php @@ -10,18 +10,25 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class brainpoolP192r1 extends Prime { public function __construct() { $this->setModulo(new BigInteger('C302F41D932A36CDA7A3463093D18DB78FCE476DE1A86297', 16)); - $this->setCoefficients(new BigInteger('6A91174076B1E0E19C39C031FE8685C1CAE040E5C69A28EF', 16), new BigInteger('469A28EF7C28CCA3DC721D044F4496BCCA7EF4146FBF25C9', 16)); - $this->setBasePoint(new BigInteger('C0A0647EAAB6A48753B033C56CB0F0900A2F5C4853375FD6', 16), new BigInteger('14B690866ABD5BB88B5F4828C1490002E6773FA2FA299B8F', 16)); + $this->setCoefficients( + new BigInteger('6A91174076B1E0E19C39C031FE8685C1CAE040E5C69A28EF', 16), + new BigInteger('469A28EF7C28CCA3DC721D044F4496BCCA7EF4146FBF25C9', 16) + ); + $this->setBasePoint( + new BigInteger('C0A0647EAAB6A48753B033C56CB0F0900A2F5C4853375FD6', 16), + new BigInteger('14B690866ABD5BB88B5F4828C1490002E6773FA2FA299B8F', 16) + ); $this->setOrder(new BigInteger('C302F41D932A36CDA7A3462F9E9E916B5BE8F1029AC4ACC1', 16)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP192t1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP192t1.php index 968674a..abd3d40 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP192t1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP192t1.php @@ -10,22 +10,25 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class brainpoolP192t1 extends Prime { public function __construct() { $this->setModulo(new BigInteger('C302F41D932A36CDA7A3463093D18DB78FCE476DE1A86297', 16)); $this->setCoefficients( - new BigInteger('C302F41D932A36CDA7A3463093D18DB78FCE476DE1A86294', 16), - // eg. -3 + new BigInteger('C302F41D932A36CDA7A3463093D18DB78FCE476DE1A86294', 16), // eg. -3 new BigInteger('13D56FFAEC78681E68F9DEB43B35BEC2FB68542E27897B79', 16) ); - $this->setBasePoint(new BigInteger('3AE9E58C82F63C30282E1FE7BBF43FA72C446AF6F4618129', 16), new BigInteger('097E2C5667C2223A902AB5CA449D0084B7E5B3DE7CCC01C9', 16)); + $this->setBasePoint( + new BigInteger('3AE9E58C82F63C30282E1FE7BBF43FA72C446AF6F4618129', 16), + new BigInteger('097E2C5667C2223A902AB5CA449D0084B7E5B3DE7CCC01C9', 16) + ); $this->setOrder(new BigInteger('C302F41D932A36CDA7A3462F9E9E916B5BE8F1029AC4ACC1', 16)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP224r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP224r1.php index 31490af..900b809 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP224r1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP224r1.php @@ -10,18 +10,25 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class brainpoolP224r1 extends Prime { public function __construct() { $this->setModulo(new BigInteger('D7C134AA264366862A18302575D1D787B09F075797DA89F57EC8C0FF', 16)); - $this->setCoefficients(new BigInteger('68A5E62CA9CE6C1C299803A6C1530B514E182AD8B0042A59CAD29F43', 16), new BigInteger('2580F63CCFE44138870713B1A92369E33E2135D266DBB372386C400B', 16)); - $this->setBasePoint(new BigInteger('0D9029AD2C7E5CF4340823B2A87DC68C9E4CE3174C1E6EFDEE12C07D', 16), new BigInteger('58AA56F772C0726F24C6B89E4ECDAC24354B9E99CAA3F6D3761402CD', 16)); + $this->setCoefficients( + new BigInteger('68A5E62CA9CE6C1C299803A6C1530B514E182AD8B0042A59CAD29F43', 16), + new BigInteger('2580F63CCFE44138870713B1A92369E33E2135D266DBB372386C400B', 16) + ); + $this->setBasePoint( + new BigInteger('0D9029AD2C7E5CF4340823B2A87DC68C9E4CE3174C1E6EFDEE12C07D', 16), + new BigInteger('58AA56F772C0726F24C6B89E4ECDAC24354B9E99CAA3F6D3761402CD', 16) + ); $this->setOrder(new BigInteger('D7C134AA264366862A18302575D0FB98D116BC4B6DDEBCA3A5A7939F', 16)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP224t1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP224t1.php index a3eb6ca..8bb13fd 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP224t1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP224t1.php @@ -10,22 +10,25 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class brainpoolP224t1 extends Prime { public function __construct() { $this->setModulo(new BigInteger('D7C134AA264366862A18302575D1D787B09F075797DA89F57EC8C0FF', 16)); $this->setCoefficients( - new BigInteger('D7C134AA264366862A18302575D1D787B09F075797DA89F57EC8C0FC', 16), - // eg. -3 + new BigInteger('D7C134AA264366862A18302575D1D787B09F075797DA89F57EC8C0FC', 16), // eg. -3 new BigInteger('4B337D934104CD7BEF271BF60CED1ED20DA14C08B3BB64F18A60888D', 16) ); - $this->setBasePoint(new BigInteger('6AB1E344CE25FF3896424E7FFE14762ECB49F8928AC0C76029B4D580', 16), new BigInteger('0374E9F5143E568CD23F3F4D7C0D4B1E41C8CC0D1C6ABD5F1A46DB4C', 16)); + $this->setBasePoint( + new BigInteger('6AB1E344CE25FF3896424E7FFE14762ECB49F8928AC0C76029B4D580', 16), + new BigInteger('0374E9F5143E568CD23F3F4D7C0D4B1E41C8CC0D1C6ABD5F1A46DB4C', 16) + ); $this->setOrder(new BigInteger('D7C134AA264366862A18302575D0FB98D116BC4B6DDEBCA3A5A7939F', 16)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP256r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP256r1.php index 12d94b6..5394cc6 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP256r1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP256r1.php @@ -10,18 +10,25 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class brainpoolP256r1 extends Prime { public function __construct() { $this->setModulo(new BigInteger('A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377', 16)); - $this->setCoefficients(new BigInteger('7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9', 16), new BigInteger('26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6', 16)); - $this->setBasePoint(new BigInteger('8BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262', 16), new BigInteger('547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997', 16)); + $this->setCoefficients( + new BigInteger('7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9', 16), + new BigInteger('26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6', 16) + ); + $this->setBasePoint( + new BigInteger('8BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262', 16), + new BigInteger('547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997', 16) + ); $this->setOrder(new BigInteger('A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7', 16)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP256t1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP256t1.php index da4b127..6ac0a3f 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP256t1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP256t1.php @@ -10,22 +10,25 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class brainpoolP256t1 extends Prime { public function __construct() { $this->setModulo(new BigInteger('A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377', 16)); $this->setCoefficients( - new BigInteger('A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5374', 16), - // eg. -3 + new BigInteger('A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5374', 16), // eg. -3 new BigInteger('662C61C430D84EA4FE66A7733D0B76B7BF93EBC4AF2F49256AE58101FEE92B04', 16) ); - $this->setBasePoint(new BigInteger('A3E8EB3CC1CFE7B7732213B23A656149AFA142C47AAFBC2B79A191562E1305F4', 16), new BigInteger('2D996C823439C56D7F7B22E14644417E69BCB6DE39D027001DABE8F35B25C9BE', 16)); + $this->setBasePoint( + new BigInteger('A3E8EB3CC1CFE7B7732213B23A656149AFA142C47AAFBC2B79A191562E1305F4', 16), + new BigInteger('2D996C823439C56D7F7B22E14644417E69BCB6DE39D027001DABE8F35B25C9BE', 16) + ); $this->setOrder(new BigInteger('A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7', 16)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP320r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP320r1.php index ce65414..5caa214 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP320r1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP320r1.php @@ -10,18 +10,31 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class brainpoolP320r1 extends Prime { public function __construct() { - $this->setModulo(new BigInteger('D35E472036BC4FB7E13C785ED201E065F98FCFA6F6F40DEF4F9' . '2B9EC7893EC28FCD412B1F1B32E27', 16)); - $this->setCoefficients(new BigInteger('3EE30B568FBAB0F883CCEBD46D3F3BB8A2A73513F5EB79DA66190EB085FFA9F4' . '92F375A97D860EB4', 16), new BigInteger('520883949DFDBC42D3AD198640688A6FE13F41349554B49ACC31DCCD88453981' . '6F5EB4AC8FB1F1A6', 16)); - $this->setBasePoint(new BigInteger('43BD7E9AFB53D8B85289BCC48EE5BFE6F20137D10A087EB6E7871E2A10A599C7' . '10AF8D0D39E20611', 16), new BigInteger('14FDD05545EC1CC8AB4093247F77275E0743FFED117182EAA9C77877AAAC6AC7' . 'D35245D1692E8EE1', 16)); - $this->setOrder(new BigInteger('D35E472036BC4FB7E13C785ED201E065F98FCFA5B68F12A32D4' . '82EC7EE8658E98691555B44C59311', 16)); + $this->setModulo(new BigInteger('D35E472036BC4FB7E13C785ED201E065F98FCFA6F6F40DEF4F9' . + '2B9EC7893EC28FCD412B1F1B32E27', 16)); + $this->setCoefficients( + new BigInteger('3EE30B568FBAB0F883CCEBD46D3F3BB8A2A73513F5EB79DA66190EB085FFA9F4' . + '92F375A97D860EB4', 16), + new BigInteger('520883949DFDBC42D3AD198640688A6FE13F41349554B49ACC31DCCD88453981' . + '6F5EB4AC8FB1F1A6', 16) + ); + $this->setBasePoint( + new BigInteger('43BD7E9AFB53D8B85289BCC48EE5BFE6F20137D10A087EB6E7871E2A10A599C7' . + '10AF8D0D39E20611', 16), + new BigInteger('14FDD05545EC1CC8AB4093247F77275E0743FFED117182EAA9C77877AAAC6AC7' . + 'D35245D1692E8EE1', 16) + ); + $this->setOrder(new BigInteger('D35E472036BC4FB7E13C785ED201E065F98FCFA5B68F12A32D4' . + '82EC7EE8658E98691555B44C59311', 16)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP320t1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP320t1.php index 1ec41ed..986027c 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP320t1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP320t1.php @@ -10,22 +10,31 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class brainpoolP320t1 extends Prime { public function __construct() { - $this->setModulo(new BigInteger('D35E472036BC4FB7E13C785ED201E065F98FCFA6F6F40DEF4F9' . '2B9EC7893EC28FCD412B1F1B32E27', 16)); + $this->setModulo(new BigInteger('D35E472036BC4FB7E13C785ED201E065F98FCFA6F6F40DEF4F9' . + '2B9EC7893EC28FCD412B1F1B32E27', 16)); $this->setCoefficients( - new BigInteger('D35E472036BC4FB7E13C785ED201E065F98FCFA6F6F40DEF4F92B9EC7893EC28' . 'FCD412B1F1B32E24', 16), - // eg. -3 - new BigInteger('A7F561E038EB1ED560B3D147DB782013064C19F27ED27C6780AAF77FB8A547CE' . 'B5B4FEF422340353', 16) + new BigInteger('D35E472036BC4FB7E13C785ED201E065F98FCFA6F6F40DEF4F92B9EC7893EC28' . + 'FCD412B1F1B32E24', 16), // eg. -3 + new BigInteger('A7F561E038EB1ED560B3D147DB782013064C19F27ED27C6780AAF77FB8A547CE' . + 'B5B4FEF422340353', 16) + ); + $this->setBasePoint( + new BigInteger('925BE9FB01AFC6FB4D3E7D4990010F813408AB106C4F09CB7EE07868CC136FFF' . + '3357F624A21BED52', 16), + new BigInteger('63BA3A7A27483EBF6671DBEF7ABB30EBEE084E58A0B077AD42A5A0989D1EE71B' . + '1B9BC0455FB0D2C3', 16) ); - $this->setBasePoint(new BigInteger('925BE9FB01AFC6FB4D3E7D4990010F813408AB106C4F09CB7EE07868CC136FFF' . '3357F624A21BED52', 16), new BigInteger('63BA3A7A27483EBF6671DBEF7ABB30EBEE084E58A0B077AD42A5A0989D1EE71B' . '1B9BC0455FB0D2C3', 16)); - $this->setOrder(new BigInteger('D35E472036BC4FB7E13C785ED201E065F98FCFA5B68F12A32D4' . '82EC7EE8658E98691555B44C59311', 16)); + $this->setOrder(new BigInteger('D35E472036BC4FB7E13C785ED201E065F98FCFA5B68F12A32D4' . + '82EC7EE8658E98691555B44C59311', 16)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP384r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP384r1.php index 5dc391d..9e9933c 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP384r1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP384r1.php @@ -10,18 +10,49 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class brainpoolP384r1 extends Prime { public function __construct() { - $this->setModulo(new BigInteger('8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123ACD3A729901D1A7' . '1874700133107EC53', 16)); - $this->setCoefficients(new BigInteger('7BC382C63D8C150C3C72080ACE05AFA0C2BEA28E4FB22787139165EFBA91F90F8AA5814A503' . 'AD4EB04A8C7DD22CE2826', 16), new BigInteger('4A8C7DD22CE28268B39B55416F0447C2FB77DE107DCD2A62E880EA53EEB62D57CB4390295DB' . 'C9943AB78696FA504C11', 16)); - $this->setBasePoint(new BigInteger('1D1C64F068CF45FFA2A63A81B7C13F6B8847A3E77EF14FE3DB7FCAFE0CBD10E8E826E03436D' . '646AAEF87B2E247D4AF1E', 16), new BigInteger('8ABE1D7520F9C2A45CB1EB8E95CFD55262B70B29FEEC5864E19C054FF99129280E464621779' . '1811142820341263C5315', 16)); - $this->setOrder(new BigInteger('8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B31F166E6CAC0425A7CF3AB6AF6B7FC31' . '03B883202E9046565', 16)); + $this->setModulo(new BigInteger( + '8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123ACD3A729901D1A7' . + '1874700133107EC53', + 16 + )); + $this->setCoefficients( + new BigInteger( + '7BC382C63D8C150C3C72080ACE05AFA0C2BEA28E4FB22787139165EFBA91F90F8AA5814A503' . + 'AD4EB04A8C7DD22CE2826', + 16 + ), + new BigInteger( + '4A8C7DD22CE28268B39B55416F0447C2FB77DE107DCD2A62E880EA53EEB62D57CB4390295DB' . + 'C9943AB78696FA504C11', + 16 + ) + ); + $this->setBasePoint( + new BigInteger( + '1D1C64F068CF45FFA2A63A81B7C13F6B8847A3E77EF14FE3DB7FCAFE0CBD10E8E826E03436D' . + '646AAEF87B2E247D4AF1E', + 16 + ), + new BigInteger( + '8ABE1D7520F9C2A45CB1EB8E95CFD55262B70B29FEEC5864E19C054FF99129280E464621779' . + '1811142820341263C5315', + 16 + ) + ); + $this->setOrder(new BigInteger( + '8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B31F166E6CAC0425A7CF3AB6AF6B7FC31' . + '03B883202E9046565', + 16 + )); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP384t1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP384t1.php index a70ba47..8a70473 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP384t1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP384t1.php @@ -10,22 +10,49 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class brainpoolP384t1 extends Prime { public function __construct() { - $this->setModulo(new BigInteger('8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123ACD3A729901D1A7' . '1874700133107EC53', 16)); + $this->setModulo(new BigInteger( + '8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123ACD3A729901D1A7' . + '1874700133107EC53', + 16 + )); $this->setCoefficients( - new BigInteger('8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123ACD3A729901' . 'D1A71874700133107EC50', 16), - // eg. -3 - new BigInteger('7F519EADA7BDA81BD826DBA647910F8C4B9346ED8CCDC64E4B1ABD11756DCE1D2074AA263B8' . '8805CED70355A33B471EE', 16) + new BigInteger( + '8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123ACD3A729901' . + 'D1A71874700133107EC50', + 16 + ), // eg. -3 + new BigInteger( + '7F519EADA7BDA81BD826DBA647910F8C4B9346ED8CCDC64E4B1ABD11756DCE1D2074AA263B8' . + '8805CED70355A33B471EE', + 16 + ) + ); + $this->setBasePoint( + new BigInteger( + '18DE98B02DB9A306F2AFCD7235F72A819B80AB12EBD653172476FECD462AABFFC4FF191B946' . + 'A5F54D8D0AA2F418808CC', + 16 + ), + new BigInteger( + '25AB056962D30651A114AFD2755AD336747F93475B7A1FCA3B88F2B6A208CCFE469408584DC' . + '2B2912675BF5B9E582928', + 16 + ) ); - $this->setBasePoint(new BigInteger('18DE98B02DB9A306F2AFCD7235F72A819B80AB12EBD653172476FECD462AABFFC4FF191B946' . 'A5F54D8D0AA2F418808CC', 16), new BigInteger('25AB056962D30651A114AFD2755AD336747F93475B7A1FCA3B88F2B6A208CCFE469408584DC' . '2B2912675BF5B9E582928', 16)); - $this->setOrder(new BigInteger('8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B31F166E6CAC0425A7CF3AB6AF6B7FC31' . '03B883202E9046565', 16)); + $this->setOrder(new BigInteger( + '8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B31F166E6CAC0425A7CF3AB6AF6B7FC31' . + '03B883202E9046565', + 16 + )); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP512r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP512r1.php index c1ca4a5..c3c07dc 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP512r1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP512r1.php @@ -10,18 +10,49 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class brainpoolP512r1 extends Prime { public function __construct() { - $this->setModulo(new BigInteger('AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308717D4D9B009BC' . '66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F3', 16)); - $this->setCoefficients(new BigInteger('7830A3318B603B89E2327145AC234CC594CBDD8D3DF91610A83441CAEA9863BC2DED5D5AA82' . '53AA10A2EF1C98B9AC8B57F1117A72BF2C7B9E7C1AC4D77FC94CA', 16), new BigInteger('3DF91610A83441CAEA9863BC2DED5D5AA8253AA10A2EF1C98B9AC8B57F1117A72BF2C7B9E7C' . '1AC4D77FC94CADC083E67984050B75EBAE5DD2809BD638016F723', 16)); - $this->setBasePoint(new BigInteger('81AEE4BDD82ED9645A21322E9C4C6A9385ED9F70B5D916C1B43B62EEF4D0098EFF3B1F78E2D' . '0D48D50D1687B93B97D5F7C6D5047406A5E688B352209BCB9F822', 16), new BigInteger('7DDE385D566332ECC0EABFA9CF7822FDF209F70024A57B1AA000C55B881F8111B2DCDE494A5' . 'F485E5BCA4BD88A2763AED1CA2B2FA8F0540678CD1E0F3AD80892', 16)); - $this->setOrder(new BigInteger('AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA70330870553E5C414CA' . '92619418661197FAC10471DB1D381085DDADDB58796829CA90069', 16)); + $this->setModulo(new BigInteger( + 'AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308717D4D9B009BC' . + '66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F3', + 16 + )); + $this->setCoefficients( + new BigInteger( + '7830A3318B603B89E2327145AC234CC594CBDD8D3DF91610A83441CAEA9863BC2DED5D5AA82' . + '53AA10A2EF1C98B9AC8B57F1117A72BF2C7B9E7C1AC4D77FC94CA', + 16 + ), + new BigInteger( + '3DF91610A83441CAEA9863BC2DED5D5AA8253AA10A2EF1C98B9AC8B57F1117A72BF2C7B9E7C' . + '1AC4D77FC94CADC083E67984050B75EBAE5DD2809BD638016F723', + 16 + ) + ); + $this->setBasePoint( + new BigInteger( + '81AEE4BDD82ED9645A21322E9C4C6A9385ED9F70B5D916C1B43B62EEF4D0098EFF3B1F78E2D' . + '0D48D50D1687B93B97D5F7C6D5047406A5E688B352209BCB9F822', + 16 + ), + new BigInteger( + '7DDE385D566332ECC0EABFA9CF7822FDF209F70024A57B1AA000C55B881F8111B2DCDE494A5' . + 'F485E5BCA4BD88A2763AED1CA2B2FA8F0540678CD1E0F3AD80892', + 16 + ) + ); + $this->setOrder(new BigInteger( + 'AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA70330870553E5C414CA' . + '92619418661197FAC10471DB1D381085DDADDB58796829CA90069', + 16 + )); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP512t1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP512t1.php index 97cc314..e981e2c 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP512t1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP512t1.php @@ -10,22 +10,49 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class brainpoolP512t1 extends Prime { public function __construct() { - $this->setModulo(new BigInteger('AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308717D4D9B009BC' . '66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F3', 16)); + $this->setModulo(new BigInteger( + 'AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308717D4D9B009BC' . + '66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F3', + 16 + )); $this->setCoefficients( - new BigInteger('AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308717D4D9B009BC' . '66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F0', 16), - // eg. -3 - new BigInteger('7CBBBCF9441CFAB76E1890E46884EAE321F70C0BCB4981527897504BEC3E36A62BCDFA23049' . '76540F6450085F2DAE145C22553B465763689180EA2571867423E', 16) + new BigInteger( + 'AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308717D4D9B009BC' . + '66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F0', + 16 + ), // eg. -3 + new BigInteger( + '7CBBBCF9441CFAB76E1890E46884EAE321F70C0BCB4981527897504BEC3E36A62BCDFA23049' . + '76540F6450085F2DAE145C22553B465763689180EA2571867423E', + 16 + ) + ); + $this->setBasePoint( + new BigInteger( + '640ECE5C12788717B9C1BA06CBC2A6FEBA85842458C56DDE9DB1758D39C0313D82BA51735CD' . + 'B3EA499AA77A7D6943A64F7A3F25FE26F06B51BAA2696FA9035DA', + 16 + ), + new BigInteger( + '5B534BD595F5AF0FA2C892376C84ACE1BB4E3019B71634C01131159CAE03CEE9D9932184BEE' . + 'F216BD71DF2DADF86A627306ECFF96DBB8BACE198B61E00F8B332', + 16 + ) ); - $this->setBasePoint(new BigInteger('640ECE5C12788717B9C1BA06CBC2A6FEBA85842458C56DDE9DB1758D39C0313D82BA51735CD' . 'B3EA499AA77A7D6943A64F7A3F25FE26F06B51BAA2696FA9035DA', 16), new BigInteger('5B534BD595F5AF0FA2C892376C84ACE1BB4E3019B71634C01131159CAE03CEE9D9932184BEE' . 'F216BD71DF2DADF86A627306ECFF96DBB8BACE198B61E00F8B332', 16)); - $this->setOrder(new BigInteger('AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA70330870553E5C414CA' . '92619418661197FAC10471DB1D381085DDADDB58796829CA90069', 16)); + $this->setOrder(new BigInteger( + 'AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA70330870553E5C414CA' . + '92619418661197FAC10471DB1D381085DDADDB58796829CA90069', + 16 + )); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistb233.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistb233.php index ecdf714..f73ebe2 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistb233.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistb233.php @@ -10,9 +10,9 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; -/** @internal */ final class nistb233 extends sect233r1 { } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistb409.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistb409.php index bf83d36..efe8de3 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistb409.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistb409.php @@ -10,9 +10,9 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; -/** @internal */ final class nistb409 extends sect409r1 { } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk163.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk163.php index 9849576..66e4252 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk163.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk163.php @@ -10,9 +10,9 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; -/** @internal */ final class nistk163 extends sect163k1 { } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk233.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk233.php index eb1ecc1..49ff2ba 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk233.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk233.php @@ -10,9 +10,9 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; -/** @internal */ final class nistk233 extends sect233k1 { } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk283.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk283.php index df5a5aa..dca9830 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk283.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk283.php @@ -10,9 +10,9 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; -/** @internal */ final class nistk283 extends sect283k1 { } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk409.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk409.php index 56de09b..3785547 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk409.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk409.php @@ -10,9 +10,9 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; -/** @internal */ final class nistk409 extends sect409k1 { } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp192.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp192.php index 5460420..31b67a5 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp192.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp192.php @@ -10,9 +10,9 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; -/** @internal */ final class nistp192 extends secp192r1 { } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp224.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp224.php index 59d955a..9408dd5 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp224.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp224.php @@ -10,9 +10,9 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; -/** @internal */ final class nistp224 extends secp224r1 { } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp256.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp256.php index fdcd4cc..4952be4 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp256.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp256.php @@ -10,9 +10,9 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; -/** @internal */ final class nistp256 extends secp256r1 { } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp384.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp384.php index e8b5909..05425c7 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp384.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp384.php @@ -10,9 +10,9 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; -/** @internal */ final class nistp384 extends secp384r1 { } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp521.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp521.php index c63c3e6..b17e173 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp521.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp521.php @@ -10,9 +10,9 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; -/** @internal */ final class nistp521 extends secp521r1 { } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistt571.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistt571.php index 8cf990e..f650785 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistt571.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistt571.php @@ -10,9 +10,9 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; -/** @internal */ final class nistt571 extends sect571k1 { } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v1.php index 88aa77f..583eedd 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v1.php @@ -10,9 +10,9 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; -/** @internal */ final class prime192v1 extends secp192r1 { } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v2.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v2.php index 1fa6261..594ea66 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v2.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v2.php @@ -10,18 +10,25 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class prime192v2 extends Prime { public function __construct() { $this->setModulo(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF', 16)); - $this->setCoefficients(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC', 16), new BigInteger('CC22D6DFB95C6B25E49C0D6364A4E5980C393AA21668D953', 16)); - $this->setBasePoint(new BigInteger('EEA2BAE7E1497842F2DE7769CFE9C989C072AD696F48034A', 16), new BigInteger('6574D11D69B6EC7A672BB82A083DF2F2B0847DE970B2DE15', 16)); + $this->setCoefficients( + new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC', 16), + new BigInteger('CC22D6DFB95C6B25E49C0D6364A4E5980C393AA21668D953', 16) + ); + $this->setBasePoint( + new BigInteger('EEA2BAE7E1497842F2DE7769CFE9C989C072AD696F48034A', 16), + new BigInteger('6574D11D69B6EC7A672BB82A083DF2F2B0847DE970B2DE15', 16) + ); $this->setOrder(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFE5FB1A724DC80418648D8DD31', 16)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v3.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v3.php index bc827d8..b4a6867 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v3.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v3.php @@ -10,18 +10,25 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class prime192v3 extends Prime { public function __construct() { $this->setModulo(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF', 16)); - $this->setCoefficients(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC', 16), new BigInteger('22123DC2395A05CAA7423DAECCC94760A7D462256BD56916', 16)); - $this->setBasePoint(new BigInteger('7D29778100C65A1DA1783716588DCE2B8B4AEE8E228F1896', 16), new BigInteger('38A90F22637337334B49DCB66A6DC8F9978ACA7648A943B0', 16)); + $this->setCoefficients( + new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC', 16), + new BigInteger('22123DC2395A05CAA7423DAECCC94760A7D462256BD56916', 16) + ); + $this->setBasePoint( + new BigInteger('7D29778100C65A1DA1783716588DCE2B8B4AEE8E228F1896', 16), + new BigInteger('38A90F22637337334B49DCB66A6DC8F9978ACA7648A943B0', 16) + ); $this->setOrder(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFF7A62D031C83F4294F640EC13', 16)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v1.php index 3603b7f..08b7f82 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v1.php @@ -10,18 +10,25 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class prime239v1 extends Prime { public function __construct() { $this->setModulo(new BigInteger('7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF', 16)); - $this->setCoefficients(new BigInteger('7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC', 16), new BigInteger('6B016C3BDCF18941D0D654921475CA71A9DB2FB27D1D37796185C2942C0A', 16)); - $this->setBasePoint(new BigInteger('0FFA963CDCA8816CCC33B8642BEDF905C3D358573D3F27FBBD3B3CB9AAAF', 16), new BigInteger('7DEBE8E4E90A5DAE6E4054CA530BA04654B36818CE226B39FCCB7B02F1AE', 16)); + $this->setCoefficients( + new BigInteger('7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC', 16), + new BigInteger('6B016C3BDCF18941D0D654921475CA71A9DB2FB27D1D37796185C2942C0A', 16) + ); + $this->setBasePoint( + new BigInteger('0FFA963CDCA8816CCC33B8642BEDF905C3D358573D3F27FBBD3B3CB9AAAF', 16), + new BigInteger('7DEBE8E4E90A5DAE6E4054CA530BA04654B36818CE226B39FCCB7B02F1AE', 16) + ); $this->setOrder(new BigInteger('7FFFFFFFFFFFFFFFFFFFFFFF7FFFFF9E5E9A9F5D9071FBD1522688909D0B', 16)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v2.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v2.php index 9b9546f..19a03a4 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v2.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v2.php @@ -10,18 +10,25 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class prime239v2 extends Prime { public function __construct() { $this->setModulo(new BigInteger('7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF', 16)); - $this->setCoefficients(new BigInteger('7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC', 16), new BigInteger('617FAB6832576CBBFED50D99F0249C3FEE58B94BA0038C7AE84C8C832F2C', 16)); - $this->setBasePoint(new BigInteger('38AF09D98727705120C921BB5E9E26296A3CDCF2F35757A0EAFD87B830E7', 16), new BigInteger('5B0125E4DBEA0EC7206DA0FC01D9B081329FB555DE6EF460237DFF8BE4BA', 16)); + $this->setCoefficients( + new BigInteger('7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC', 16), + new BigInteger('617FAB6832576CBBFED50D99F0249C3FEE58B94BA0038C7AE84C8C832F2C', 16) + ); + $this->setBasePoint( + new BigInteger('38AF09D98727705120C921BB5E9E26296A3CDCF2F35757A0EAFD87B830E7', 16), + new BigInteger('5B0125E4DBEA0EC7206DA0FC01D9B081329FB555DE6EF460237DFF8BE4BA', 16) + ); $this->setOrder(new BigInteger('7FFFFFFFFFFFFFFFFFFFFFFF800000CFA7E8594377D414C03821BC582063', 16)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v3.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v3.php index 9e16fd8..f179a24 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v3.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v3.php @@ -10,18 +10,25 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class prime239v3 extends Prime { public function __construct() { $this->setModulo(new BigInteger('7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF', 16)); - $this->setCoefficients(new BigInteger('7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC', 16), new BigInteger('255705FA2A306654B1F4CB03D6A750A30C250102D4988717D9BA15AB6D3E', 16)); - $this->setBasePoint(new BigInteger('6768AE8E18BB92CFCF005C949AA2C6D94853D0E660BBF854B1C9505FE95A', 16), new BigInteger('1607E6898F390C06BC1D552BAD226F3B6FCFE48B6E818499AF18E3ED6CF3', 16)); + $this->setCoefficients( + new BigInteger('7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC', 16), + new BigInteger('255705FA2A306654B1F4CB03D6A750A30C250102D4988717D9BA15AB6D3E', 16) + ); + $this->setBasePoint( + new BigInteger('6768AE8E18BB92CFCF005C949AA2C6D94853D0E660BBF854B1C9505FE95A', 16), + new BigInteger('1607E6898F390C06BC1D552BAD226F3B6FCFE48B6E818499AF18E3ED6CF3', 16) + ); $this->setOrder(new BigInteger('7FFFFFFFFFFFFFFFFFFFFFFF7FFFFF975DEB41B3A6057C3C432146526551', 16)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime256v1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime256v1.php index 9184d44..abb42dc 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime256v1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime256v1.php @@ -10,9 +10,9 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; -/** @internal */ final class prime256v1 extends secp256r1 { } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp112r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp112r1.php index 746e054..c7b009d 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp112r1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp112r1.php @@ -10,18 +10,25 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class secp112r1 extends Prime { public function __construct() { $this->setModulo(new BigInteger('DB7C2ABF62E35E668076BEAD208B', 16)); - $this->setCoefficients(new BigInteger('DB7C2ABF62E35E668076BEAD2088', 16), new BigInteger('659EF8BA043916EEDE8911702B22', 16)); - $this->setBasePoint(new BigInteger('09487239995A5EE76B55F9C2F098', 16), new BigInteger('A89CE5AF8724C0A23E0E0FF77500', 16)); + $this->setCoefficients( + new BigInteger('DB7C2ABF62E35E668076BEAD2088', 16), + new BigInteger('659EF8BA043916EEDE8911702B22', 16) + ); + $this->setBasePoint( + new BigInteger('09487239995A5EE76B55F9C2F098', 16), + new BigInteger('A89CE5AF8724C0A23E0E0FF77500', 16) + ); $this->setOrder(new BigInteger('DB7C2ABF62E35E7628DFAC6561C5', 16)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp112r2.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp112r2.php index a42ff96..3d25c86 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp112r2.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp112r2.php @@ -10,19 +10,26 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class secp112r2 extends Prime { public function __construct() { // same modulo as secp112r1 $this->setModulo(new BigInteger('DB7C2ABF62E35E668076BEAD208B', 16)); - $this->setCoefficients(new BigInteger('6127C24C05F38A0AAAF65C0EF02C', 16), new BigInteger('51DEF1815DB5ED74FCC34C85D709', 16)); - $this->setBasePoint(new BigInteger('4BA30AB5E892B4E1649DD0928643', 16), new BigInteger('ADCD46F5882E3747DEF36E956E97', 16)); + $this->setCoefficients( + new BigInteger('6127C24C05F38A0AAAF65C0EF02C', 16), + new BigInteger('51DEF1815DB5ED74FCC34C85D709', 16) + ); + $this->setBasePoint( + new BigInteger('4BA30AB5E892B4E1649DD0928643', 16), + new BigInteger('ADCD46F5882E3747DEF36E956E97', 16) + ); $this->setOrder(new BigInteger('36DF0AAFD8B8D7597CA10520D04B', 16)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp128r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp128r1.php index 63ba722..dbfe501 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp128r1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp128r1.php @@ -10,18 +10,25 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class secp128r1 extends Prime { public function __construct() { $this->setModulo(new BigInteger('FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF', 16)); - $this->setCoefficients(new BigInteger('FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFC', 16), new BigInteger('E87579C11079F43DD824993C2CEE5ED3', 16)); - $this->setBasePoint(new BigInteger('161FF7528B899B2D0C28607CA52C5B86', 16), new BigInteger('CF5AC8395BAFEB13C02DA292DDED7A83', 16)); + $this->setCoefficients( + new BigInteger('FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFC', 16), + new BigInteger('E87579C11079F43DD824993C2CEE5ED3', 16) + ); + $this->setBasePoint( + new BigInteger('161FF7528B899B2D0C28607CA52C5B86', 16), + new BigInteger('CF5AC8395BAFEB13C02DA292DDED7A83', 16) + ); $this->setOrder(new BigInteger('FFFFFFFE0000000075A30D1B9038A115', 16)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp128r2.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp128r2.php index 4f6b762..3e818d9 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp128r2.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp128r2.php @@ -10,19 +10,26 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class secp128r2 extends Prime { public function __construct() { // same as secp128r1 $this->setModulo(new BigInteger('FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF', 16)); - $this->setCoefficients(new BigInteger('D6031998D1B3BBFEBF59CC9BBFF9AEE1', 16), new BigInteger('5EEEFCA380D02919DC2C6558BB6D8A5D', 16)); - $this->setBasePoint(new BigInteger('7B6AA5D85E572983E6FB32A7CDEBC140', 16), new BigInteger('27B6916A894D3AEE7106FE805FC34B44', 16)); + $this->setCoefficients( + new BigInteger('D6031998D1B3BBFEBF59CC9BBFF9AEE1', 16), + new BigInteger('5EEEFCA380D02919DC2C6558BB6D8A5D', 16) + ); + $this->setBasePoint( + new BigInteger('7B6AA5D85E572983E6FB32A7CDEBC140', 16), + new BigInteger('27B6916A894D3AEE7106FE805FC34B44', 16) + ); $this->setOrder(new BigInteger('3FFFFFFF7FFFFFFFBE0024720613B5A3', 16)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160k1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160k1.php index 4dfe411..bf44312 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160k1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160k1.php @@ -10,23 +10,37 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\KoblitzPrime; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class secp160k1 extends KoblitzPrime { public function __construct() { // same as secp160r2 $this->setModulo(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73', 16)); - $this->setCoefficients(new BigInteger('0000000000000000000000000000000000000000', 16), new BigInteger('0000000000000000000000000000000000000007', 16)); - $this->setBasePoint(new BigInteger('3B4C382CE37AA192A4019E763036F4F5DD4D7EBB', 16), new BigInteger('938CF935318FDCED6BC28286531733C3F03C4FEE', 16)); + $this->setCoefficients( + new BigInteger('0000000000000000000000000000000000000000', 16), + new BigInteger('0000000000000000000000000000000000000007', 16) + ); + $this->setBasePoint( + new BigInteger('3B4C382CE37AA192A4019E763036F4F5DD4D7EBB', 16), + new BigInteger('938CF935318FDCED6BC28286531733C3F03C4FEE', 16) + ); $this->setOrder(new BigInteger('0100000000000000000001B8FA16DFAB9ACA16B6B3', 16)); + $this->basis = []; - $this->basis[] = ['a' => new BigInteger('0096341F1138933BC2F505', -16), 'b' => new BigInteger('FF6E9D0418C67BB8D5F562', -16)]; - $this->basis[] = ['a' => new BigInteger('01BDCB3A09AAAABEAFF4A8', -16), 'b' => new BigInteger('04D12329FF0EF498EA67', -16)]; + $this->basis[] = [ + 'a' => new BigInteger('0096341F1138933BC2F505', -16), + 'b' => new BigInteger('FF6E9D0418C67BB8D5F562', -16) + ]; + $this->basis[] = [ + 'a' => new BigInteger('01BDCB3A09AAAABEAFF4A8', -16), + 'b' => new BigInteger('04D12329FF0EF498EA67', -16) + ]; $this->beta = $this->factory->newInteger(new BigInteger('645B7345A143464942CC46D7CF4D5D1E1E6CBB68', -16)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160r1.php index 005eb53..605a93e 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160r1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160r1.php @@ -10,18 +10,25 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class secp160r1 extends Prime { public function __construct() { $this->setModulo(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF', 16)); - $this->setCoefficients(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC', 16), new BigInteger('1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45', 16)); - $this->setBasePoint(new BigInteger('4A96B5688EF573284664698968C38BB913CBFC82', 16), new BigInteger('23A628553168947D59DCC912042351377AC5FB32', 16)); + $this->setCoefficients( + new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC', 16), + new BigInteger('1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45', 16) + ); + $this->setBasePoint( + new BigInteger('4A96B5688EF573284664698968C38BB913CBFC82', 16), + new BigInteger('23A628553168947D59DCC912042351377AC5FB32', 16) + ); $this->setOrder(new BigInteger('0100000000000000000001F4C8F927AED3CA752257', 16)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160r2.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160r2.php index cb21ba6..7c1bb48 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160r2.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160r2.php @@ -10,19 +10,26 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class secp160r2 extends Prime { public function __construct() { // same as secp160k1 $this->setModulo(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73', 16)); - $this->setCoefficients(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC70', 16), new BigInteger('B4E134D3FB59EB8BAB57274904664D5AF50388BA', 16)); - $this->setBasePoint(new BigInteger('52DCB034293A117E1F4FF11B30F7199D3144CE6D', 16), new BigInteger('FEAFFEF2E331F296E071FA0DF9982CFEA7D43F2E', 16)); + $this->setCoefficients( + new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC70', 16), + new BigInteger('B4E134D3FB59EB8BAB57274904664D5AF50388BA', 16) + ); + $this->setBasePoint( + new BigInteger('52DCB034293A117E1F4FF11B30F7199D3144CE6D', 16), + new BigInteger('FEAFFEF2E331F296E071FA0DF9982CFEA7D43F2E', 16) + ); $this->setOrder(new BigInteger('0100000000000000000000351EE786A818F3A1A16B', 16)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp192k1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp192k1.php index 2de5e2e..762add3 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp192k1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp192k1.php @@ -10,22 +10,36 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\KoblitzPrime; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class secp192k1 extends KoblitzPrime { public function __construct() { $this->setModulo(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37', 16)); - $this->setCoefficients(new BigInteger('000000000000000000000000000000000000000000000000', 16), new BigInteger('000000000000000000000000000000000000000000000003', 16)); - $this->setBasePoint(new BigInteger('DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D', 16), new BigInteger('9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D', 16)); + $this->setCoefficients( + new BigInteger('000000000000000000000000000000000000000000000000', 16), + new BigInteger('000000000000000000000000000000000000000000000003', 16) + ); + $this->setBasePoint( + new BigInteger('DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D', 16), + new BigInteger('9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D', 16) + ); $this->setOrder(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D', 16)); + $this->basis = []; - $this->basis[] = ['a' => new BigInteger('00B3FB3400DEC5C4ADCEB8655C', -16), 'b' => new BigInteger('8EE96418CCF4CFC7124FDA0F', -16)]; - $this->basis[] = ['a' => new BigInteger('01D90D03E8F096B9948B20F0A9', -16), 'b' => new BigInteger('42E49819ABBA9474E1083F6B', -16)]; + $this->basis[] = [ + 'a' => new BigInteger('00B3FB3400DEC5C4ADCEB8655C', -16), + 'b' => new BigInteger('8EE96418CCF4CFC7124FDA0F', -16) + ]; + $this->basis[] = [ + 'a' => new BigInteger('01D90D03E8F096B9948B20F0A9', -16), + 'b' => new BigInteger('42E49819ABBA9474E1083F6B', -16) + ]; $this->beta = $this->factory->newInteger(new BigInteger('447A96E6C647963E2F7809FEAAB46947F34B0AA3CA0BBA74', -16)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp192r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp192r1.php index 5613b96..600be25 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp192r1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp192r1.php @@ -12,58 +12,67 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class secp192r1 extends Prime { public function __construct() { $modulo = new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF', 16); $this->setModulo($modulo); + // algorithm 2.27 from http://diamond.boisestate.edu/~liljanab/MATH308/GuideToECC.pdf#page=66 /* in theory this should be faster than regular modular reductions save for one small issue. - to convert to / from base-2**8 with BCMath you have to call bcmul() and bcdiv() a lot. - to convert to / from base-2**8 with PHP64 you have to call base256_rshift() a lot. - in short, converting to / from base-2**8 is pretty expensive and that expense is - enough to offset whatever else might be gained by a simplified reduction algorithm. - now, if PHP supported unsigned integers things might be different. no bit-shifting - would be required for the PHP engine and it'd be a lot faster. but as is, BigInteger - uses base-2**31 or base-2**26 depending on whether or not the system is has a 32-bit - or a 64-bit OS. - */ + to convert to / from base-2**8 with BCMath you have to call bcmul() and bcdiv() a lot. + to convert to / from base-2**8 with PHP64 you have to call base256_rshift() a lot. + in short, converting to / from base-2**8 is pretty expensive and that expense is + enough to offset whatever else might be gained by a simplified reduction algorithm. + now, if PHP supported unsigned integers things might be different. no bit-shifting + would be required for the PHP engine and it'd be a lot faster. but as is, BigInteger + uses base-2**31 or base-2**26 depending on whether or not the system is has a 32-bit + or a 64-bit OS. + */ /* $m_length = $this->getLengthInBytes(); $this->setReduction(function($c) use ($m_length) { $cBytes = $c->toBytes(); $className = $this->className; - + if (strlen($cBytes) > 2 * $m_length) { list(, $r) = $c->divide($className::$modulo); return $r; } - + $c = str_pad($cBytes, 48, "\0", STR_PAD_LEFT); $c = array_reverse(str_split($c, 8)); - + $null = "\0\0\0\0\0\0\0\0"; $s1 = new BigInteger($c[2] . $c[1] . $c[0], 256); $s2 = new BigInteger($null . $c[3] . $c[3], 256); $s3 = new BigInteger($c[4] . $c[4] . $null, 256); $s4 = new BigInteger($c[5] . $c[5] . $c[5], 256); - + $r = $s1->add($s2)->add($s3)->add($s4); while ($r->compare($className::$modulo) >= 0) { $r = $r->subtract($className::$modulo); } - + return $r; }); */ - $this->setCoefficients(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC', 16), new BigInteger('64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1', 16)); - $this->setBasePoint(new BigInteger('188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012', 16), new BigInteger('07192B95FFC8DA78631011ED6B24CDD573F977A11E794811', 16)); + + $this->setCoefficients( + new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC', 16), + new BigInteger('64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1', 16) + ); + $this->setBasePoint( + new BigInteger('188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012', 16), + new BigInteger('07192B95FFC8DA78631011ED6B24CDD573F977A11E794811', 16) + ); $this->setOrder(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831', 16)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp224k1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp224k1.php index da9a54d..3447a82 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp224k1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp224k1.php @@ -10,22 +10,36 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\KoblitzPrime; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class secp224k1 extends KoblitzPrime { public function __construct() { $this->setModulo(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFE56D', 16)); - $this->setCoefficients(new BigInteger('00000000000000000000000000000000000000000000000000000000', 16), new BigInteger('00000000000000000000000000000000000000000000000000000005', 16)); - $this->setBasePoint(new BigInteger('A1455B334DF099DF30FC28A169A467E9E47075A90F7E650EB6B7A45C', 16), new BigInteger('7E089FED7FBA344282CAFBD6F7E319F7C0B0BD59E2CA4BDB556D61A5', 16)); + $this->setCoefficients( + new BigInteger('00000000000000000000000000000000000000000000000000000000', 16), + new BigInteger('00000000000000000000000000000000000000000000000000000005', 16) + ); + $this->setBasePoint( + new BigInteger('A1455B334DF099DF30FC28A169A467E9E47075A90F7E650EB6B7A45C', 16), + new BigInteger('7E089FED7FBA344282CAFBD6F7E319F7C0B0BD59E2CA4BDB556D61A5', 16) + ); $this->setOrder(new BigInteger('010000000000000000000000000001DCE8D2EC6184CAF0A971769FB1F7', 16)); + $this->basis = []; - $this->basis[] = ['a' => new BigInteger('00B8ADF1378A6EB73409FA6C9C637D', -16), 'b' => new BigInteger('94730F82B358A3776A826298FA6F', -16)]; - $this->basis[] = ['a' => new BigInteger('01DCE8D2EC6184CAF0A972769FCC8B', -16), 'b' => new BigInteger('4D2100BA3DC75AAB747CCF355DEC', -16)]; + $this->basis[] = [ + 'a' => new BigInteger('00B8ADF1378A6EB73409FA6C9C637D', -16), + 'b' => new BigInteger('94730F82B358A3776A826298FA6F', -16) + ]; + $this->basis[] = [ + 'a' => new BigInteger('01DCE8D2EC6184CAF0A972769FCC8B', -16), + 'b' => new BigInteger('4D2100BA3DC75AAB747CCF355DEC', -16) + ]; $this->beta = $this->factory->newInteger(new BigInteger('01F178FFA4B17C89E6F73AECE2AAD57AF4C0A748B63C830947B27E04', -16)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp224r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp224r1.php index 0572960..8d03d31 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp224r1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp224r1.php @@ -10,18 +10,25 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class secp224r1 extends Prime { public function __construct() { $this->setModulo(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001', 16)); - $this->setCoefficients(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE', 16), new BigInteger('B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4', 16)); - $this->setBasePoint(new BigInteger('B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21', 16), new BigInteger('BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34', 16)); + $this->setCoefficients( + new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE', 16), + new BigInteger('B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4', 16) + ); + $this->setBasePoint( + new BigInteger('B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21', 16), + new BigInteger('BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34', 16) + ); $this->setOrder(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D', 16)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp256k1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp256k1.php index ca49a81..29c829a 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp256k1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp256k1.php @@ -12,24 +12,38 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; -//use phpseclib3\Crypt\EC\BaseCurves\Prime; +//use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\KoblitzPrime; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + //class secp256k1 extends Prime -/** @internal */ class secp256k1 extends KoblitzPrime { public function __construct() { $this->setModulo(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F', 16)); - $this->setCoefficients(new BigInteger('0000000000000000000000000000000000000000000000000000000000000000', 16), new BigInteger('0000000000000000000000000000000000000000000000000000000000000007', 16)); + $this->setCoefficients( + new BigInteger('0000000000000000000000000000000000000000000000000000000000000000', 16), + new BigInteger('0000000000000000000000000000000000000000000000000000000000000007', 16) + ); $this->setOrder(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141', 16)); - $this->setBasePoint(new BigInteger('79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798', 16), new BigInteger('483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8', 16)); + $this->setBasePoint( + new BigInteger('79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798', 16), + new BigInteger('483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8', 16) + ); + $this->basis = []; - $this->basis[] = ['a' => new BigInteger('3086D221A7D46BCDE86C90E49284EB15', -16), 'b' => new BigInteger('FF1BBC8129FEF177D790AB8056F5401B3D', -16)]; - $this->basis[] = ['a' => new BigInteger('114CA50F7A8E2F3F657C1108D9D44CFD8', -16), 'b' => new BigInteger('3086D221A7D46BCDE86C90E49284EB15', -16)]; + $this->basis[] = [ + 'a' => new BigInteger('3086D221A7D46BCDE86C90E49284EB15', -16), + 'b' => new BigInteger('FF1BBC8129FEF177D790AB8056F5401B3D', -16) + ]; + $this->basis[] = [ + 'a' => new BigInteger('114CA50F7A8E2F3F657C1108D9D44CFD8', -16), + 'b' => new BigInteger('3086D221A7D46BCDE86C90E49284EB15', -16) + ]; $this->beta = $this->factory->newInteger(new BigInteger('7AE96A2B657C07106E64479EAC3434E99CF0497512F58995C1396C28719501EE', -16)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp256r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp256r1.php index 3ac8004..0f29334 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp256r1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp256r1.php @@ -10,18 +10,25 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class secp256r1 extends Prime { public function __construct() { $this->setModulo(new BigInteger('FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF', 16)); - $this->setCoefficients(new BigInteger('FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC', 16), new BigInteger('5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B', 16)); - $this->setBasePoint(new BigInteger('6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296', 16), new BigInteger('4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5', 16)); + $this->setCoefficients( + new BigInteger('FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC', 16), + new BigInteger('5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B', 16) + ); + $this->setBasePoint( + new BigInteger('6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296', 16), + new BigInteger('4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5', 16) + ); $this->setOrder(new BigInteger('FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551', 16)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp384r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp384r1.php index 52118cf..d15ba31 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp384r1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp384r1.php @@ -10,18 +10,43 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class secp384r1 extends Prime { public function __construct() { - $this->setModulo(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF', 16)); - $this->setCoefficients(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC', 16), new BigInteger('B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF', 16)); - $this->setBasePoint(new BigInteger('AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7', 16), new BigInteger('3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F', 16)); - $this->setOrder(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973', 16)); + $this->setModulo(new BigInteger( + 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF', + 16 + )); + $this->setCoefficients( + new BigInteger( + 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC', + 16 + ), + new BigInteger( + 'B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF', + 16 + ) + ); + $this->setBasePoint( + new BigInteger( + 'AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7', + 16 + ), + new BigInteger( + '3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F', + 16 + ) + ); + $this->setOrder(new BigInteger( + 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973', + 16 + )); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp521r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp521r1.php index 65e387e..1640a32 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp521r1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp521r1.php @@ -10,18 +10,37 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class secp521r1 extends Prime { public function __construct() { - $this->setModulo(new BigInteger('01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' . 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' . 'FFFF', 16)); - $this->setCoefficients(new BigInteger('01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' . 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' . 'FFFC', 16), new BigInteger('0051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF1' . '09E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B50' . '3F00', 16)); - $this->setBasePoint(new BigInteger('00C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D' . '3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5' . 'BD66', 16), new BigInteger('011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E' . '662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD1' . '6650', 16)); - $this->setOrder(new BigInteger('01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' . 'FFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E9138' . '6409', 16)); + $this->setModulo(new BigInteger('01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' . + 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' . + 'FFFF', 16)); + $this->setCoefficients( + new BigInteger('01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' . + 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' . + 'FFFC', 16), + new BigInteger('0051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF1' . + '09E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B50' . + '3F00', 16) + ); + $this->setBasePoint( + new BigInteger('00C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D' . + '3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5' . + 'BD66', 16), + new BigInteger('011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E' . + '662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD1' . + '6650', 16) + ); + $this->setOrder(new BigInteger('01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' . + 'FFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E9138' . + '6409', 16)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect113r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect113r1.php index 9b0bb41..ac6c810 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect113r1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect113r1.php @@ -10,18 +10,25 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Binary; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class sect113r1 extends Binary { public function __construct() { $this->setModulo(113, 9, 0); - $this->setCoefficients('003088250CA6E7C7FE649CE85820F7', '00E8BEE4D3E2260744188BE0E9C723'); - $this->setBasePoint('009D73616F35F4AB1407D73562C10F', '00A52830277958EE84D1315ED31886'); + $this->setCoefficients( + '003088250CA6E7C7FE649CE85820F7', + '00E8BEE4D3E2260744188BE0E9C723' + ); + $this->setBasePoint( + '009D73616F35F4AB1407D73562C10F', + '00A52830277958EE84D1315ED31886' + ); $this->setOrder(new BigInteger('0100000000000000D9CCEC8A39E56F', 16)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect113r2.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect113r2.php index da5aebb..667fa0e 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect113r2.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect113r2.php @@ -10,18 +10,25 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Binary; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class sect113r2 extends Binary { public function __construct() { $this->setModulo(113, 9, 0); - $this->setCoefficients('00689918DBEC7E5A0DD6DFC0AA55C7', '0095E9A9EC9B297BD4BF36E059184F'); - $this->setBasePoint('01A57A6A7B26CA5EF52FCDB8164797', '00B3ADC94ED1FE674C06E695BABA1D'); + $this->setCoefficients( + '00689918DBEC7E5A0DD6DFC0AA55C7', + '0095E9A9EC9B297BD4BF36E059184F' + ); + $this->setBasePoint( + '01A57A6A7B26CA5EF52FCDB8164797', + '00B3ADC94ED1FE674C06E695BABA1D' + ); $this->setOrder(new BigInteger('010000000000000108789B2496AF93', 16)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect131r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect131r1.php index 83874fd..cb6e9f9 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect131r1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect131r1.php @@ -10,18 +10,25 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Binary; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class sect131r1 extends Binary { public function __construct() { $this->setModulo(131, 8, 3, 2, 0); - $this->setCoefficients('07A11B09A76B562144418FF3FF8C2570B8', '0217C05610884B63B9C6C7291678F9D341'); - $this->setBasePoint('0081BAF91FDF9833C40F9C181343638399', '078C6E7EA38C001F73C8134B1B4EF9E150'); + $this->setCoefficients( + '07A11B09A76B562144418FF3FF8C2570B8', + '0217C05610884B63B9C6C7291678F9D341' + ); + $this->setBasePoint( + '0081BAF91FDF9833C40F9C181343638399', + '078C6E7EA38C001F73C8134B1B4EF9E150' + ); $this->setOrder(new BigInteger('0400000000000000023123953A9464B54D', 16)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect131r2.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect131r2.php index 0456919..8b98a44 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect131r2.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect131r2.php @@ -10,18 +10,25 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Binary; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class sect131r2 extends Binary { public function __construct() { $this->setModulo(131, 8, 3, 2, 0); - $this->setCoefficients('03E5A88919D7CAFCBF415F07C2176573B2', '04B8266A46C55657AC734CE38F018F2192'); - $this->setBasePoint('0356DCD8F2F95031AD652D23951BB366A8', '0648F06D867940A5366D9E265DE9EB240F'); + $this->setCoefficients( + '03E5A88919D7CAFCBF415F07C2176573B2', + '04B8266A46C55657AC734CE38F018F2192' + ); + $this->setBasePoint( + '0356DCD8F2F95031AD652D23951BB366A8', + '0648F06D867940A5366D9E265DE9EB240F' + ); $this->setOrder(new BigInteger('0400000000000000016954A233049BA98F', 16)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163k1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163k1.php index 99b480a..0ab77aa 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163k1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163k1.php @@ -10,18 +10,25 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Binary; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class sect163k1 extends Binary { public function __construct() { $this->setModulo(163, 7, 6, 3, 0); - $this->setCoefficients('000000000000000000000000000000000000000001', '000000000000000000000000000000000000000001'); - $this->setBasePoint('02FE13C0537BBC11ACAA07D793DE4E6D5E5C94EEE8', '0289070FB05D38FF58321F2E800536D538CCDAA3D9'); + $this->setCoefficients( + '000000000000000000000000000000000000000001', + '000000000000000000000000000000000000000001' + ); + $this->setBasePoint( + '02FE13C0537BBC11ACAA07D793DE4E6D5E5C94EEE8', + '0289070FB05D38FF58321F2E800536D538CCDAA3D9' + ); $this->setOrder(new BigInteger('04000000000000000000020108A2E0CC0D99F8A5EF', 16)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163r1.php index 418d18e..4e6bd53 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163r1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163r1.php @@ -10,18 +10,25 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Binary; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class sect163r1 extends Binary { public function __construct() { $this->setModulo(163, 7, 6, 3, 0); - $this->setCoefficients('07B6882CAAEFA84F9554FF8428BD88E246D2782AE2', '0713612DCDDCB40AAB946BDA29CA91F73AF958AFD9'); - $this->setBasePoint('0369979697AB43897789566789567F787A7876A654', '00435EDB42EFAFB2989D51FEFCE3C80988F41FF883'); + $this->setCoefficients( + '07B6882CAAEFA84F9554FF8428BD88E246D2782AE2', + '0713612DCDDCB40AAB946BDA29CA91F73AF958AFD9' + ); + $this->setBasePoint( + '0369979697AB43897789566789567F787A7876A654', + '00435EDB42EFAFB2989D51FEFCE3C80988F41FF883' + ); $this->setOrder(new BigInteger('03FFFFFFFFFFFFFFFFFFFF48AAB689C29CA710279B', 16)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163r2.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163r2.php index e330f64..0eabf0d 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163r2.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163r2.php @@ -10,18 +10,25 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Binary; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class sect163r2 extends Binary { public function __construct() { $this->setModulo(163, 7, 6, 3, 0); - $this->setCoefficients('000000000000000000000000000000000000000001', '020A601907B8C953CA1481EB10512F78744A3205FD'); - $this->setBasePoint('03F0EBA16286A2D57EA0991168D4994637E8343E36', '00D51FBC6C71A0094FA2CDD545B11C5C0C797324F1'); + $this->setCoefficients( + '000000000000000000000000000000000000000001', + '020A601907B8C953CA1481EB10512F78744A3205FD' + ); + $this->setBasePoint( + '03F0EBA16286A2D57EA0991168D4994637E8343E36', + '00D51FBC6C71A0094FA2CDD545B11C5C0C797324F1' + ); $this->setOrder(new BigInteger('040000000000000000000292FE77E70C12A4234C33', 16)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect193r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect193r1.php index 42e06dd..2e09e4f 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect193r1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect193r1.php @@ -10,18 +10,25 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Binary; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class sect193r1 extends Binary { public function __construct() { $this->setModulo(193, 15, 0); - $this->setCoefficients('0017858FEB7A98975169E171F77B4087DE098AC8A911DF7B01', '00FDFB49BFE6C3A89FACADAA7A1E5BBC7CC1C2E5D831478814'); - $this->setBasePoint('01F481BC5F0FF84A74AD6CDF6FDEF4BF6179625372D8C0C5E1', '0025E399F2903712CCF3EA9E3A1AD17FB0B3201B6AF7CE1B05'); + $this->setCoefficients( + '0017858FEB7A98975169E171F77B4087DE098AC8A911DF7B01', + '00FDFB49BFE6C3A89FACADAA7A1E5BBC7CC1C2E5D831478814' + ); + $this->setBasePoint( + '01F481BC5F0FF84A74AD6CDF6FDEF4BF6179625372D8C0C5E1', + '0025E399F2903712CCF3EA9E3A1AD17FB0B3201B6AF7CE1B05' + ); $this->setOrder(new BigInteger('01000000000000000000000000C7F34A778F443ACC920EBA49', 16)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect193r2.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect193r2.php index 14b766e..4a98cc0 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect193r2.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect193r2.php @@ -10,18 +10,25 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Binary; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class sect193r2 extends Binary { public function __construct() { $this->setModulo(193, 15, 0); - $this->setCoefficients('0163F35A5137C2CE3EA6ED8667190B0BC43ECD69977702709B', '00C9BB9E8927D4D64C377E2AB2856A5B16E3EFB7F61D4316AE'); - $this->setBasePoint('00D9B67D192E0367C803F39E1A7E82CA14A651350AAE617E8F', '01CE94335607C304AC29E7DEFBD9CA01F596F927224CDECF6C'); + $this->setCoefficients( + '0163F35A5137C2CE3EA6ED8667190B0BC43ECD69977702709B', + '00C9BB9E8927D4D64C377E2AB2856A5B16E3EFB7F61D4316AE' + ); + $this->setBasePoint( + '00D9B67D192E0367C803F39E1A7E82CA14A651350AAE617E8F', + '01CE94335607C304AC29E7DEFBD9CA01F596F927224CDECF6C' + ); $this->setOrder(new BigInteger('010000000000000000000000015AAB561B005413CCD4EE99D5', 16)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect233k1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect233k1.php index 74a4bd2..ac5bf54 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect233k1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect233k1.php @@ -10,18 +10,25 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Binary; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class sect233k1 extends Binary { public function __construct() { $this->setModulo(233, 74, 0); - $this->setCoefficients('000000000000000000000000000000000000000000000000000000000000', '000000000000000000000000000000000000000000000000000000000001'); - $this->setBasePoint('017232BA853A7E731AF129F22FF4149563A419C26BF50A4C9D6EEFAD6126', '01DB537DECE819B7F70F555A67C427A8CD9BF18AEB9B56E0C11056FAE6A3'); + $this->setCoefficients( + '000000000000000000000000000000000000000000000000000000000000', + '000000000000000000000000000000000000000000000000000000000001' + ); + $this->setBasePoint( + '017232BA853A7E731AF129F22FF4149563A419C26BF50A4C9D6EEFAD6126', + '01DB537DECE819B7F70F555A67C427A8CD9BF18AEB9B56E0C11056FAE6A3' + ); $this->setOrder(new BigInteger('8000000000000000000000000000069D5BB915BCD46EFB1AD5F173ABDF', 16)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect233r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect233r1.php index 6e3af4a..17fd4c8 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect233r1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect233r1.php @@ -10,18 +10,25 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Binary; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class sect233r1 extends Binary { public function __construct() { $this->setModulo(233, 74, 0); - $this->setCoefficients('000000000000000000000000000000000000000000000000000000000001', '0066647EDE6C332C7F8C0923BB58213B333B20E9CE4281FE115F7D8F90AD'); - $this->setBasePoint('00FAC9DFCBAC8313BB2139F1BB755FEF65BC391F8B36F8F8EB7371FD558B', '01006A08A41903350678E58528BEBF8A0BEFF867A7CA36716F7E01F81052'); + $this->setCoefficients( + '000000000000000000000000000000000000000000000000000000000001', + '0066647EDE6C332C7F8C0923BB58213B333B20E9CE4281FE115F7D8F90AD' + ); + $this->setBasePoint( + '00FAC9DFCBAC8313BB2139F1BB755FEF65BC391F8B36F8F8EB7371FD558B', + '01006A08A41903350678E58528BEBF8A0BEFF867A7CA36716F7E01F81052' + ); $this->setOrder(new BigInteger('01000000000000000000000000000013E974E72F8A6922031D2603CFE0D7', 16)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect239k1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect239k1.php index 6f6634a..f3ccbf9 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect239k1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect239k1.php @@ -10,18 +10,25 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Binary; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class sect239k1 extends Binary { public function __construct() { $this->setModulo(239, 158, 0); - $this->setCoefficients('000000000000000000000000000000000000000000000000000000000000', '000000000000000000000000000000000000000000000000000000000001'); - $this->setBasePoint('29A0B6A887A983E9730988A68727A8B2D126C44CC2CC7B2A6555193035DC', '76310804F12E549BDB011C103089E73510ACB275FC312A5DC6B76553F0CA'); + $this->setCoefficients( + '000000000000000000000000000000000000000000000000000000000000', + '000000000000000000000000000000000000000000000000000000000001' + ); + $this->setBasePoint( + '29A0B6A887A983E9730988A68727A8B2D126C44CC2CC7B2A6555193035DC', + '76310804F12E549BDB011C103089E73510ACB275FC312A5DC6B76553F0CA' + ); $this->setOrder(new BigInteger('2000000000000000000000000000005A79FEC67CB6E91F1C1DA800E478A5', 16)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect283k1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect283k1.php index 61e088b..cbace47 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect283k1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect283k1.php @@ -10,18 +10,25 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Binary; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class sect283k1 extends Binary { public function __construct() { $this->setModulo(283, 12, 7, 5, 0); - $this->setCoefficients('000000000000000000000000000000000000000000000000000000000000000000000000', '000000000000000000000000000000000000000000000000000000000000000000000001'); - $this->setBasePoint('0503213F78CA44883F1A3B8162F188E553CD265F23C1567A16876913B0C2AC2458492836', '01CCDA380F1C9E318D90F95D07E5426FE87E45C0E8184698E45962364E34116177DD2259'); + $this->setCoefficients( + '000000000000000000000000000000000000000000000000000000000000000000000000', + '000000000000000000000000000000000000000000000000000000000000000000000001' + ); + $this->setBasePoint( + '0503213F78CA44883F1A3B8162F188E553CD265F23C1567A16876913B0C2AC2458492836', + '01CCDA380F1C9E318D90F95D07E5426FE87E45C0E8184698E45962364E34116177DD2259' + ); $this->setOrder(new BigInteger('01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9AE2ED07577265DFF7F94451E061E163C61', 16)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect283r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect283r1.php index 5eca04b..7a33684 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect283r1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect283r1.php @@ -10,18 +10,25 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Binary; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class sect283r1 extends Binary { public function __construct() { $this->setModulo(283, 12, 7, 5, 0); - $this->setCoefficients('000000000000000000000000000000000000000000000000000000000000000000000001', '027B680AC8B8596DA5A4AF8A19A0303FCA97FD7645309FA2A581485AF6263E313B79A2F5'); - $this->setBasePoint('05F939258DB7DD90E1934F8C70B0DFEC2EED25B8557EAC9C80E2E198F8CDBECD86B12053', '03676854FE24141CB98FE6D4B20D02B4516FF702350EDDB0826779C813F0DF45BE8112F4'); + $this->setCoefficients( + '000000000000000000000000000000000000000000000000000000000000000000000001', + '027B680AC8B8596DA5A4AF8A19A0303FCA97FD7645309FA2A581485AF6263E313B79A2F5' + ); + $this->setBasePoint( + '05F939258DB7DD90E1934F8C70B0DFEC2EED25B8557EAC9C80E2E198F8CDBECD86B12053', + '03676854FE24141CB98FE6D4B20D02B4516FF702350EDDB0826779C813F0DF45BE8112F4' + ); $this->setOrder(new BigInteger('03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF90399660FC938A90165B042A7CEFADB307', 16)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect409k1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect409k1.php index 7cff9d0..850540f 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect409k1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect409k1.php @@ -10,18 +10,29 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Binary; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class sect409k1 extends Binary { public function __construct() { $this->setModulo(409, 87, 0); - $this->setCoefficients('00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001'); - $this->setBasePoint('0060F05F658F49C1AD3AB1890F7184210EFD0987E307C84C27ACCFB8F9F67CC2C460189EB5AAAA62EE222EB1B35540CFE9023746', '01E369050B7C4E42ACBA1DACBF04299C3460782F918EA427E6325165E9EA10E3DA5F6C42E9C55215AA9CA27A5863EC48D8E0286B'); - $this->setOrder(new BigInteger('7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5F' . '83B2D4EA20400EC4557D5ED3E3E7CA5B4B5C83B8E01E5FCF', 16)); + $this->setCoefficients( + '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001' + ); + $this->setBasePoint( + '0060F05F658F49C1AD3AB1890F7184210EFD0987E307C84C27ACCFB8F9F67CC2C460189EB5AAAA62EE222EB1B35540CFE9023746', + '01E369050B7C4E42ACBA1DACBF04299C3460782F918EA427E6325165E9EA10E3DA5F6C42E9C55215AA9CA27A5863EC48D8E0286B' + ); + $this->setOrder(new BigInteger( + '7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5F' . + '83B2D4EA20400EC4557D5ED3E3E7CA5B4B5C83B8E01E5FCF', + 16 + )); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect409r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect409r1.php index 60a9c9b..7ace1d2 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect409r1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect409r1.php @@ -10,18 +10,29 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Binary; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class sect409r1 extends Binary { public function __construct() { $this->setModulo(409, 87, 0); - $this->setCoefficients('00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001', '0021A5C2C8EE9FEB5C4B9A753B7B476B7FD6422EF1F3DD674761FA99D6AC27C8A9A197B272822F6CD57A55AA4F50AE317B13545F'); - $this->setBasePoint('015D4860D088DDB3496B0C6064756260441CDE4AF1771D4DB01FFE5B34E59703DC255A868A1180515603AEAB60794E54BB7996A7', '0061B1CFAB6BE5F32BBFA78324ED106A7636B9C5A7BD198D0158AA4F5488D08F38514F1FDF4B4F40D2181B3681C364BA0273C706'); - $this->setOrder(new BigInteger('010000000000000000000000000000000000000000000000000001E2' . 'AAD6A612F33307BE5FA47C3C9E052F838164CD37D9A21173', 16)); + $this->setCoefficients( + '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001', + '0021A5C2C8EE9FEB5C4B9A753B7B476B7FD6422EF1F3DD674761FA99D6AC27C8A9A197B272822F6CD57A55AA4F50AE317B13545F' + ); + $this->setBasePoint( + '015D4860D088DDB3496B0C6064756260441CDE4AF1771D4DB01FFE5B34E59703DC255A868A1180515603AEAB60794E54BB7996A7', + '0061B1CFAB6BE5F32BBFA78324ED106A7636B9C5A7BD198D0158AA4F5488D08F38514F1FDF4B4F40D2181B3681C364BA0273C706' + ); + $this->setOrder(new BigInteger( + '010000000000000000000000000000000000000000000000000001E2' . + 'AAD6A612F33307BE5FA47C3C9E052F838164CD37D9A21173', + 16 + )); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect571k1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect571k1.php index 5d15f2a..bc1e250 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect571k1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect571k1.php @@ -10,18 +10,33 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Binary; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class sect571k1 extends Binary { public function __construct() { $this->setModulo(571, 10, 5, 2, 0); - $this->setCoefficients('000000000000000000000000000000000000000000000000000000000000000000000000' . '000000000000000000000000000000000000000000000000000000000000000000000000', '000000000000000000000000000000000000000000000000000000000000000000000000' . '000000000000000000000000000000000000000000000000000000000000000000000001'); - $this->setBasePoint('026EB7A859923FBC82189631F8103FE4AC9CA2970012D5D46024804801841CA443709584' . '93B205E647DA304DB4CEB08CBBD1BA39494776FB988B47174DCA88C7E2945283A01C8972', '0349DC807F4FBF374F4AEADE3BCA95314DD58CEC9F307A54FFC61EFC006D8A2C9D4979C0' . 'AC44AEA74FBEBBB9F772AEDCB620B01A7BA7AF1B320430C8591984F601CD4C143EF1C7A3'); - $this->setOrder(new BigInteger('020000000000000000000000000000000000000000000000000000000000000000000000' . '131850E1F19A63E4B391A8DB917F4138B630D84BE5D639381E91DEB45CFE778F637C1001', 16)); + $this->setCoefficients( + '000000000000000000000000000000000000000000000000000000000000000000000000' . + '000000000000000000000000000000000000000000000000000000000000000000000000', + '000000000000000000000000000000000000000000000000000000000000000000000000' . + '000000000000000000000000000000000000000000000000000000000000000000000001' + ); + $this->setBasePoint( + '026EB7A859923FBC82189631F8103FE4AC9CA2970012D5D46024804801841CA443709584' . + '93B205E647DA304DB4CEB08CBBD1BA39494776FB988B47174DCA88C7E2945283A01C8972', + '0349DC807F4FBF374F4AEADE3BCA95314DD58CEC9F307A54FFC61EFC006D8A2C9D4979C0' . + 'AC44AEA74FBEBBB9F772AEDCB620B01A7BA7AF1B320430C8591984F601CD4C143EF1C7A3' + ); + $this->setOrder(new BigInteger( + '020000000000000000000000000000000000000000000000000000000000000000000000' . + '131850E1F19A63E4B391A8DB917F4138B630D84BE5D639381E91DEB45CFE778F637C1001', + 16 + )); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect571r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect571r1.php index 82c28d3..68effee 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect571r1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect571r1.php @@ -10,18 +10,33 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Binary; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -/** @internal */ + class sect571r1 extends Binary { public function __construct() { $this->setModulo(571, 10, 5, 2, 0); - $this->setCoefficients('000000000000000000000000000000000000000000000000000000000000000000000000' . '000000000000000000000000000000000000000000000000000000000000000000000001', '02F40E7E2221F295DE297117B7F3D62F5C6A97FFCB8CEFF1CD6BA8CE4A9A18AD84FFABBD' . '8EFA59332BE7AD6756A66E294AFD185A78FF12AA520E4DE739BACA0C7FFEFF7F2955727A'); - $this->setBasePoint('0303001D34B856296C16C0D40D3CD7750A93D1D2955FA80AA5F40FC8DB7B2ABDBDE53950' . 'F4C0D293CDD711A35B67FB1499AE60038614F1394ABFA3B4C850D927E1E7769C8EEC2D19', '037BF27342DA639B6DCCFFFEB73D69D78C6C27A6009CBBCA1980F8533921E8A684423E43' . 'BAB08A576291AF8F461BB2A8B3531D2F0485C19B16E2F1516E23DD3C1A4827AF1B8AC15B'); - $this->setOrder(new BigInteger('03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' . 'E661CE18FF55987308059B186823851EC7DD9CA1161DE93D5174D66E8382E9BB2FE84E47', 16)); + $this->setCoefficients( + '000000000000000000000000000000000000000000000000000000000000000000000000' . + '000000000000000000000000000000000000000000000000000000000000000000000001', + '02F40E7E2221F295DE297117B7F3D62F5C6A97FFCB8CEFF1CD6BA8CE4A9A18AD84FFABBD' . + '8EFA59332BE7AD6756A66E294AFD185A78FF12AA520E4DE739BACA0C7FFEFF7F2955727A' + ); + $this->setBasePoint( + '0303001D34B856296C16C0D40D3CD7750A93D1D2955FA80AA5F40FC8DB7B2ABDBDE53950' . + 'F4C0D293CDD711A35B67FB1499AE60038614F1394ABFA3B4C850D927E1E7769C8EEC2D19', + '037BF27342DA639B6DCCFFFEB73D69D78C6C27A6009CBBCA1980F8533921E8A684423E43' . + 'BAB08A576291AF8F461BB2A8B3531D2F0485C19B16E2F1516E23DD3C1A4827AF1B8AC15B' + ); + $this->setOrder(new BigInteger( + '03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' . + 'E661CE18FF55987308059B186823851EC7DD9CA1161DE93D5174D66E8382E9BB2FE84E47', + 16 + )); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/Common.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/Common.php index e08906b..f3a5c10 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/Common.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/Common.php @@ -10,6 +10,7 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Formats\Keys; use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; @@ -21,11 +22,11 @@ use OCA\Libresign\Vendor\phpseclib3\File\ASN1; use OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * Generic EC Key Parsing Helper functions * * @author Jim Wigginton - * @internal */ trait Common { @@ -35,18 +36,21 @@ trait Common * @var array */ private static $curveOIDs = []; + /** * Child OIDs loaded * * @var bool */ - protected static $childOIDsLoaded = \false; + protected static $childOIDsLoaded = false; + /** * Use Named Curves * * @var bool */ - private static $useNamedCurves = \true; + private static $useNamedCurves = true; + /** * Initialize static variables */ @@ -60,55 +64,37 @@ private static function initialize_static_variables() // brainpool*r* curves are regular prime finite field curves // brainpool*t* curves are twisted versions of the brainpool*r* curves self::$curveOIDs = [ - 'prime192v1' => '1.2.840.10045.3.1.1', - // J.5.1, example 1 (aka secp192r1) - 'prime192v2' => '1.2.840.10045.3.1.2', - // J.5.1, example 2 - 'prime192v3' => '1.2.840.10045.3.1.3', - // J.5.1, example 3 - 'prime239v1' => '1.2.840.10045.3.1.4', - // J.5.2, example 1 - 'prime239v2' => '1.2.840.10045.3.1.5', - // J.5.2, example 2 - 'prime239v3' => '1.2.840.10045.3.1.6', - // J.5.2, example 3 - 'prime256v1' => '1.2.840.10045.3.1.7', - // J.5.3, example 1 (aka secp256r1) + 'prime192v1' => '1.2.840.10045.3.1.1', // J.5.1, example 1 (aka secp192r1) + 'prime192v2' => '1.2.840.10045.3.1.2', // J.5.1, example 2 + 'prime192v3' => '1.2.840.10045.3.1.3', // J.5.1, example 3 + 'prime239v1' => '1.2.840.10045.3.1.4', // J.5.2, example 1 + 'prime239v2' => '1.2.840.10045.3.1.5', // J.5.2, example 2 + 'prime239v3' => '1.2.840.10045.3.1.6', // J.5.2, example 3 + 'prime256v1' => '1.2.840.10045.3.1.7', // J.5.3, example 1 (aka secp256r1) + // https://tools.ietf.org/html/rfc5656#section-10 - 'nistp256' => '1.2.840.10045.3.1.7', - // aka secp256r1 - 'nistp384' => '1.3.132.0.34', - // aka secp384r1 - 'nistp521' => '1.3.132.0.35', - // aka secp521r1 - 'nistk163' => '1.3.132.0.1', - // aka sect163k1 - 'nistp192' => '1.2.840.10045.3.1.1', - // aka secp192r1 - 'nistp224' => '1.3.132.0.33', - // aka secp224r1 - 'nistk233' => '1.3.132.0.26', - // aka sect233k1 - 'nistb233' => '1.3.132.0.27', - // aka sect233r1 - 'nistk283' => '1.3.132.0.16', - // aka sect283k1 - 'nistk409' => '1.3.132.0.36', - // aka sect409k1 - 'nistb409' => '1.3.132.0.37', - // aka sect409r1 - 'nistt571' => '1.3.132.0.38', - // aka sect571k1 + 'nistp256' => '1.2.840.10045.3.1.7', // aka secp256r1 + 'nistp384' => '1.3.132.0.34', // aka secp384r1 + 'nistp521' => '1.3.132.0.35', // aka secp521r1 + + 'nistk163' => '1.3.132.0.1', // aka sect163k1 + 'nistp192' => '1.2.840.10045.3.1.1', // aka secp192r1 + 'nistp224' => '1.3.132.0.33', // aka secp224r1 + 'nistk233' => '1.3.132.0.26', // aka sect233k1 + 'nistb233' => '1.3.132.0.27', // aka sect233r1 + 'nistk283' => '1.3.132.0.16', // aka sect283k1 + 'nistk409' => '1.3.132.0.36', // aka sect409k1 + 'nistb409' => '1.3.132.0.37', // aka sect409r1 + 'nistt571' => '1.3.132.0.38', // aka sect571k1 + // from https://tools.ietf.org/html/rfc5915 - 'secp192r1' => '1.2.840.10045.3.1.1', - // aka prime192v1 + 'secp192r1' => '1.2.840.10045.3.1.1', // aka prime192v1 'sect163k1' => '1.3.132.0.1', 'sect163r2' => '1.3.132.0.15', 'secp224r1' => '1.3.132.0.33', 'sect233k1' => '1.3.132.0.26', 'sect233r1' => '1.3.132.0.27', - 'secp256r1' => '1.2.840.10045.3.1.7', - // aka prime256v1 + 'secp256r1' => '1.2.840.10045.3.1.7', // aka prime256v1 'sect283k1' => '1.3.132.0.16', 'sect283r1' => '1.3.132.0.17', 'secp384r1' => '1.3.132.0.34', @@ -128,6 +114,7 @@ private static function initialize_static_variables() 'secp192k1' => '1.3.132.0.31', 'secp224k1' => '1.3.132.0.32', 'secp256k1' => '1.3.132.0.10', + 'sect113r1' => '1.3.132.0.4', 'sect113r2' => '1.3.132.0.5', 'sect131r1' => '1.3.132.0.22', @@ -136,6 +123,7 @@ private static function initialize_static_variables() 'sect193r1' => '1.3.132.0.24', 'sect193r2' => '1.3.132.0.25', 'sect239k1' => '1.3.132.0.3', + // from http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.202.2977&rep=rep1&type=pdf#page=36 /* 'c2pnb163v1' => '1.2.840.10045.3.0.1', // J.4.1, example 1 @@ -159,6 +147,7 @@ private static function initialize_static_variables() 'c2pnb368w1' => '1.2.840.10045.3.0.19', // J.4.9, example 1 'c2tnb431r1' => '1.2.840.10045.3.0.20', // J.4.10, example 1 */ + // http://www.ecc-brainpool.org/download/Domain-parameters.pdf // https://tools.ietf.org/html/rfc5639 'brainpoolP160r1' => '1.3.36.3.3.2.8.1.1.1', @@ -174,21 +163,20 @@ private static function initialize_static_variables() 'brainpoolP384r1' => '1.3.36.3.3.2.8.1.1.11', 'brainpoolP384t1' => '1.3.36.3.3.2.8.1.1.12', 'brainpoolP512r1' => '1.3.36.3.3.2.8.1.1.13', - 'brainpoolP512t1' => '1.3.36.3.3.2.8.1.1.14', + 'brainpoolP512t1' => '1.3.36.3.3.2.8.1.1.14' ]; ASN1::loadOIDs([ 'prime-field' => '1.2.840.10045.1.1', 'characteristic-two-field' => '1.2.840.10045.1.2', 'characteristic-two-basis' => '1.2.840.10045.1.2.3', // per http://www.secg.org/SEC1-Ver-1.0.pdf#page=84, gnBasis "not used here" - 'gnBasis' => '1.2.840.10045.1.2.3.1', - // NULL - 'tpBasis' => '1.2.840.10045.1.2.3.2', - // Trinomial - 'ppBasis' => '1.2.840.10045.1.2.3.3', + 'gnBasis' => '1.2.840.10045.1.2.3.1', // NULL + 'tpBasis' => '1.2.840.10045.1.2.3.2', // Trinomial + 'ppBasis' => '1.2.840.10045.1.2.3.3' // Pentanomial ] + self::$curveOIDs); } } + /** * Explicitly set the curve * @@ -201,6 +189,7 @@ public static function setImplicitCurve(BaseCurve $curve) { self::$implicitCurve = $curve; } + /** * Returns an instance of \phpseclib3\Crypt\EC\BaseCurves\Base based * on the curve parameters @@ -210,12 +199,12 @@ public static function setImplicitCurve(BaseCurve $curve) */ protected static function loadCurveByParam(array $params) { - if (\count($params) > 1) { + if (count($params) > 1) { throw new \RuntimeException('No parameters are present'); } if (isset($params['namedCurve'])) { - $curve = '\\OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\' . $params['namedCurve']; - if (!\class_exists($curve)) { + $curve = '\phpseclib3\Crypt\EC\Curves\\' . $params['namedCurve']; + if (!class_exists($curve)) { throw new UnsupportedCurveException('Named Curve of ' . $params['namedCurve'] . ' is not supported'); } return new $curve(); @@ -232,8 +221,11 @@ protected static function loadCurveByParam(array $params) case 'prime-field': $curve = new PrimeCurve(); $curve->setModulo($data['fieldID']['parameters']); - $curve->setCoefficients(new BigInteger($data['curve']['a'], 256), new BigInteger($data['curve']['b'], 256)); - $point = self::extractPoint("\x00" . $data['base'], $curve); + $curve->setCoefficients( + new BigInteger($data['curve']['a'], 256), + new BigInteger($data['curve']['b'], 256) + ); + $point = self::extractPoint("\0" . $data['base'], $curve); $curve->setBasePoint(...$point); $curve->setOrder($data['order']); return $curve; @@ -255,9 +247,12 @@ protected static function loadCurveByParam(array $params) } $modulo[] = 0; $curve->setModulo(...$modulo); - $len = \ceil($modulo[0] / 8); - $curve->setCoefficients(Strings::bin2hex($data['curve']['a']), Strings::bin2hex($data['curve']['b'])); - $point = self::extractPoint("\x00" . $data['base'], $curve); + $len = ceil($modulo[0] / 8); + $curve->setCoefficients( + Strings::bin2hex($data['curve']['a']), + Strings::bin2hex($data['curve']['b']) + ); + $point = self::extractPoint("\0" . $data['base'], $curve); $curve->setBasePoint(...$point); $curve->setOrder($data['order']); return $curve; @@ -267,6 +262,7 @@ protected static function loadCurveByParam(array $params) } throw new \RuntimeException('No valid parameters are present'); } + /** * Extract points from a string * @@ -283,9 +279,9 @@ public static function extractPoint($str, BaseCurve $curve) // https://tools.ietf.org/html/rfc8032#section-5.1.3 // https://tools.ietf.org/html/rfc8032#section-5.2.3 $y = $str; - $y = \strrev($y); - $sign = (bool) (\ord($y[0]) & 0x80); - $y[0] = $y[0] & \chr(0x7f); + $y = strrev($y); + $sign = (bool) (ord($y[0]) & 0x80); + $y[0] = $y[0] & chr(0x7F); $y = new BigInteger($y, 256); if ($y->compare($curve->getModulo()) >= 0) { throw new \RuntimeException('The Y coordinate should not be >= the modulo'); @@ -296,35 +292,45 @@ public static function extractPoint($str, BaseCurve $curve) } return $point; } + // the first byte of a bit string represents the number of bits in the last byte that are to be ignored but, // currently, bit strings wanting a non-zero amount of bits trimmed are not supported - if (($val = Strings::shift($str)) != "\x00") { + if (($val = Strings::shift($str)) != "\0") { throw new \UnexpectedValueException('extractPoint expects the first byte to be null - not ' . Strings::bin2hex($val)); } - if ($str == "\x00") { + if ($str == "\0") { return []; } - $keylen = \strlen($str); + + $keylen = strlen($str); $order = $curve->getLengthInBytes(); // point compression is being used if ($keylen == $order + 1) { return $curve->derivePoint($str); } + // point compression is not being used if ($keylen == 2 * $order + 1) { - \preg_match("#(.)(.{{$order}})(.{{$order}})#s", $str, $matches); + preg_match("#(.)(.{{$order}})(.{{$order}})#s", $str, $matches); list(, $w, $x, $y) = $matches; - if ($w != "\x04") { + if ($w != "\4") { throw new \UnexpectedValueException('The first byte of an uncompressed point should be 04 - not ' . Strings::bin2hex($val)); } - $point = [$curve->convertInteger(new BigInteger($x, 256)), $curve->convertInteger(new BigInteger($y, 256))]; + $point = [ + $curve->convertInteger(new BigInteger($x, 256)), + $curve->convertInteger(new BigInteger($y, 256)) + ]; + if (!$curve->verifyPoint($point)) { throw new \RuntimeException('Unable to verify that point exists on curve'); } + return $point; } + throw new \UnexpectedValueException('The string representation of the points is not of an appropriate length'); } + /** * Encode Parameters * @@ -334,9 +340,10 @@ public static function extractPoint($str, BaseCurve $curve) * @param array $options optional * @return string|false */ - private static function encodeParameters(BaseCurve $curve, $returnArray = \false, array $options = []) + private static function encodeParameters(BaseCurve $curve, $returnArray = false, array $options = []) { $useNamedCurves = isset($options['namedCurve']) ? $options['namedCurve'] : self::$useNamedCurves; + $reflect = new \ReflectionClass($curve); $name = $reflect->getShortName(); if ($useNamedCurves) { @@ -345,14 +352,16 @@ private static function encodeParameters(BaseCurve $curve, $returnArray = \false $reflect = $reflect->getParentClass(); $name = $reflect->getShortName(); } - return $returnArray ? ['namedCurve' => $name] : ASN1::encodeDER(['namedCurve' => $name], Maps\ECParameters::MAP); + return $returnArray ? + ['namedCurve' => $name] : + ASN1::encodeDER(['namedCurve' => $name], Maps\ECParameters::MAP); } foreach (new \DirectoryIterator(__DIR__ . '/../../Curves/') as $file) { if ($file->getExtension() != 'php') { continue; } $testName = $file->getBasename('.php'); - $class = '\\OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\' . $testName; + $class = '\OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves\\' . $testName; $reflect = new \ReflectionClass($class); if ($reflect->isFinal()) { continue; @@ -372,6 +381,7 @@ private static function encodeParameters(BaseCurve $curve, $returnArray = \false if ($candidate->getB()->toBytes() != $curve->getB()->toBytes()) { break; } + list($candidateX, $candidateY) = $candidate->getBasePoint(); list($curveX, $curveY) = $curve->getBasePoint(); if ($candidateX->toBytes() != $curveX->toBytes()) { @@ -380,7 +390,10 @@ private static function encodeParameters(BaseCurve $curve, $returnArray = \false if ($candidateY->toBytes() != $curveY->toBytes()) { break; } - return $returnArray ? ['namedCurve' => $testName] : ASN1::encodeDER(['namedCurve' => $testName], Maps\ECParameters::MAP); + + return $returnArray ? + ['namedCurve' => $testName] : + ASN1::encodeDER(['namedCurve' => $testName], Maps\ECParameters::MAP); case 'Binary': if (!$candidate instanceof BinaryCurve) { break; @@ -394,6 +407,7 @@ private static function encodeParameters(BaseCurve $curve, $returnArray = \false if ($candidate->getB()->toBytes() != $curve->getB()->toBytes()) { break; } + list($candidateX, $candidateY) = $candidate->getBasePoint(); list($curveX, $curveY) = $curve->getBasePoint(); if ($candidateX->toBytes() != $curveX->toBytes()) { @@ -402,10 +416,14 @@ private static function encodeParameters(BaseCurve $curve, $returnArray = \false if ($candidateY->toBytes() != $curveY->toBytes()) { break; } - return $returnArray ? ['namedCurve' => $testName] : ASN1::encodeDER(['namedCurve' => $testName], Maps\ECParameters::MAP); + + return $returnArray ? + ['namedCurve' => $testName] : + ASN1::encodeDER(['namedCurve' => $testName], Maps\ECParameters::MAP); } } } + $order = $curve->getOrder(); // we could try to calculate the order thusly: // https://crypto.stackexchange.com/a/27914/4520 @@ -416,6 +434,7 @@ private static function encodeParameters(BaseCurve $curve, $returnArray = \false $point = $curve->getBasePoint(); $x = $point[0]->toBytes(); $y = $point[1]->toBytes(); + if ($curve instanceof PrimeCurve) { /* * valid versions are: @@ -429,15 +448,29 @@ private static function encodeParameters(BaseCurve $curve, $returnArray = \false */ // other (optional) parameters can be calculated using the methods discused at // https://crypto.stackexchange.com/q/28947/4520 - $data = ['version' => 'ecdpVer1', 'fieldID' => ['fieldType' => 'prime-field', 'parameters' => $curve->getModulo()], 'curve' => ['a' => $curve->getA()->toBytes(), 'b' => $curve->getB()->toBytes()], 'base' => "\x04" . $x . $y, 'order' => $order]; - return $returnArray ? ['specifiedCurve' => $data] : ASN1::encodeDER(['specifiedCurve' => $data], Maps\ECParameters::MAP); + $data = [ + 'version' => 'ecdpVer1', + 'fieldID' => [ + 'fieldType' => 'prime-field', + 'parameters' => $curve->getModulo() + ], + 'curve' => [ + 'a' => $curve->getA()->toBytes(), + 'b' => $curve->getB()->toBytes() + ], + 'base' => "\4" . $x . $y, + 'order' => $order + ]; + + return $returnArray ? + ['specifiedCurve' => $data] : + ASN1::encodeDER(['specifiedCurve' => $data], Maps\ECParameters::MAP); } if ($curve instanceof BinaryCurve) { $modulo = $curve->getModulo(); - $basis = \count($modulo); - $m = \array_shift($modulo); - \array_pop($modulo); - // the last parameter should always be 0 + $basis = count($modulo); + $m = array_shift($modulo); + array_pop($modulo); // the last parameter should always be 0 //rsort($modulo); switch ($basis) { case 3: @@ -447,25 +480,50 @@ private static function encodeParameters(BaseCurve $curve, $returnArray = \false case 5: $basis = 'ppBasis'; // these should be in strictly ascending order (hence the commented out rsort above) - $modulo = ['k1' => new BigInteger($modulo[2]), 'k2' => new BigInteger($modulo[1]), 'k3' => new BigInteger($modulo[0])]; + $modulo = [ + 'k1' => new BigInteger($modulo[2]), + 'k2' => new BigInteger($modulo[1]), + 'k3' => new BigInteger($modulo[0]) + ]; $modulo = ASN1::encodeDER($modulo, Maps\Pentanomial::MAP); $modulo = new ASN1\Element($modulo); } - $params = ASN1::encodeDER(['m' => new BigInteger($m), 'basis' => $basis, 'parameters' => $modulo], Maps\Characteristic_two::MAP); + $params = ASN1::encodeDER([ + 'm' => new BigInteger($m), + 'basis' => $basis, + 'parameters' => $modulo + ], Maps\Characteristic_two::MAP); $params = new ASN1\Element($params); - $a = \ltrim($curve->getA()->toBytes(), "\x00"); - if (!\strlen($a)) { - $a = "\x00"; + $a = ltrim($curve->getA()->toBytes(), "\0"); + if (!strlen($a)) { + $a = "\0"; } - $b = \ltrim($curve->getB()->toBytes(), "\x00"); - if (!\strlen($b)) { - $b = "\x00"; + $b = ltrim($curve->getB()->toBytes(), "\0"); + if (!strlen($b)) { + $b = "\0"; } - $data = ['version' => 'ecdpVer1', 'fieldID' => ['fieldType' => 'characteristic-two-field', 'parameters' => $params], 'curve' => ['a' => $a, 'b' => $b], 'base' => "\x04" . $x . $y, 'order' => $order]; - return $returnArray ? ['specifiedCurve' => $data] : ASN1::encodeDER(['specifiedCurve' => $data], Maps\ECParameters::MAP); + $data = [ + 'version' => 'ecdpVer1', + 'fieldID' => [ + 'fieldType' => 'characteristic-two-field', + 'parameters' => $params + ], + 'curve' => [ + 'a' => $a, + 'b' => $b + ], + 'base' => "\4" . $x . $y, + 'order' => $order + ]; + + return $returnArray ? + ['specifiedCurve' => $data] : + ASN1::encodeDER(['specifiedCurve' => $data], Maps\ECParameters::MAP); } + throw new UnsupportedCurveException('Curve cannot be serialized'); } + /** * Use Specified Curve * @@ -474,8 +532,9 @@ private static function encodeParameters(BaseCurve $curve, $returnArray = \false */ public static function useSpecifiedCurve() { - self::$useNamedCurves = \false; + self::$useNamedCurves = false; } + /** * Use Named Curve * @@ -485,6 +544,6 @@ public static function useSpecifiedCurve() */ public static function useNamedCurve() { - self::$useNamedCurves = \true; + self::$useNamedCurves = true; } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/JWK.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/JWK.php index 97fa2bc..52c1512 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/JWK.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/JWK.php @@ -10,6 +10,7 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Formats\Keys; use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; @@ -23,15 +24,16 @@ use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves\secp521r1; use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedCurveException; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * JWK Formatted EC Handler * * @author Jim Wigginton - * @internal */ abstract class JWK extends Progenitor { use Common; + /** * Break a public or private key down into its constituent components * @@ -42,6 +44,7 @@ abstract class JWK extends Progenitor public static function load($key, $password = '') { $key = parent::load($key, $password); + switch ($key->kty) { case 'EC': switch ($key->crv) { @@ -66,27 +69,39 @@ public static function load($key, $password = '') default: throw new \Exception('Only EC and OKP JWK keys are supported'); } - $curve = '\\OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\' . \str_replace('P-', 'nistp', $key->crv); + + $curve = '\phpseclib3\Crypt\EC\Curves\\' . str_replace('P-', 'nistp', $key->crv); $curve = new $curve(); + if ($curve instanceof TwistedEdwardsCurve) { $QA = self::extractPoint(Strings::base64url_decode($key->x), $curve); if (!isset($key->d)) { - return \compact('curve', 'QA'); + return compact('curve', 'QA'); } $arr = $curve->extractSecret(Strings::base64url_decode($key->d)); - return \compact('curve', 'QA') + $arr; + return compact('curve', 'QA') + $arr; } - $QA = [$curve->convertInteger(new BigInteger(Strings::base64url_decode($key->x), 256)), $curve->convertInteger(new BigInteger(Strings::base64url_decode($key->y), 256))]; + + $QA = [ + $curve->convertInteger(new BigInteger(Strings::base64url_decode($key->x), 256)), + $curve->convertInteger(new BigInteger(Strings::base64url_decode($key->y), 256)) + ]; + if (!$curve->verifyPoint($QA)) { throw new \RuntimeException('Unable to verify that point exists on curve'); } + if (!isset($key->d)) { - return \compact('curve', 'QA'); + return compact('curve', 'QA'); } + $dA = new BigInteger(Strings::base64url_decode($key->d), 256); + $curve->rangeCheck($dA); - return \compact('curve', 'dA', 'QA'); + + return compact('curve', 'dA', 'QA'); } + /** * Returns the alias that corresponds to a curve * @@ -94,7 +109,7 @@ public static function load($key, $password = '') */ private static function getAlias(BaseCurve $curve) { - switch (\true) { + switch (true) { case $curve instanceof secp256r1: return 'P-256'; case $curve instanceof secp384r1: @@ -104,10 +119,14 @@ private static function getAlias(BaseCurve $curve) case $curve instanceof secp256k1: return 'secp256k1'; } + $reflect = new \ReflectionClass($curve); - $curveName = $reflect->isFinal() ? $reflect->getParentClass()->getShortName() : $reflect->getShortName(); - throw new UnsupportedCurveException("{$curveName} is not a supported curve"); + $curveName = $reflect->isFinal() ? + $reflect->getParentClass()->getShortName() : + $reflect->getShortName(); + throw new UnsupportedCurveException("$curveName is not a supported curve"); } + /** * Return the array superstructure for an EC public key * @@ -118,10 +137,21 @@ private static function getAlias(BaseCurve $curve) private static function savePublicKeyHelper(BaseCurve $curve, array $publicKey) { if ($curve instanceof TwistedEdwardsCurve) { - return ['kty' => 'OKP', 'crv' => $curve instanceof Ed25519 ? 'Ed25519' : 'Ed448', 'x' => Strings::base64url_encode($curve->encodePoint($publicKey))]; + return [ + 'kty' => 'OKP', + 'crv' => $curve instanceof Ed25519 ? 'Ed25519' : 'Ed448', + 'x' => Strings::base64url_encode($curve->encodePoint($publicKey)) + ]; } - return ['kty' => 'EC', 'crv' => self::getAlias($curve), 'x' => Strings::base64url_encode($publicKey[0]->toBytes()), 'y' => Strings::base64url_encode($publicKey[1]->toBytes())]; + + return [ + 'kty' => 'EC', + 'crv' => self::getAlias($curve), + 'x' => Strings::base64url_encode($publicKey[0]->toBytes()), + 'y' => Strings::base64url_encode($publicKey[1]->toBytes()) + ]; } + /** * Convert an EC public key to the appropriate format * @@ -133,8 +163,10 @@ private static function savePublicKeyHelper(BaseCurve $curve, array $publicKey) public static function savePublicKey(BaseCurve $curve, array $publicKey, array $options = []) { $key = self::savePublicKeyHelper($curve, $publicKey); + return self::wrapKey($key, $options); } + /** * Convert a private key to the appropriate format. * @@ -151,6 +183,7 @@ public static function savePrivateKey(BigInteger $privateKey, BaseCurve $curve, $key = self::savePublicKeyHelper($curve, $publicKey); $key['d'] = $curve instanceof TwistedEdwardsCurve ? $secret : $privateKey->toBytes(); $key['d'] = Strings::base64url_encode($key['d']); + return self::wrapKey($key, $options); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/MontgomeryPrivate.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/MontgomeryPrivate.php index f656f51..e977cd3 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/MontgomeryPrivate.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/MontgomeryPrivate.php @@ -17,6 +17,7 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Formats\Keys; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Montgomery as MontgomeryCurve; @@ -24,11 +25,11 @@ use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves\Curve448; use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedFormatException; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * Montgomery Curve Private Key Handler * * @author Jim Wigginton - * @internal */ abstract class MontgomeryPrivate { @@ -36,7 +37,8 @@ abstract class MontgomeryPrivate * Is invisible flag * */ - const IS_INVISIBLE = \true; + const IS_INVISIBLE = true; + /** * Break a public or private key down into its constituent components * @@ -46,7 +48,7 @@ abstract class MontgomeryPrivate */ public static function load($key, $password = '') { - switch (\strlen($key)) { + switch (strlen($key)) { case 32: $curve = new Curve25519(); break; @@ -56,13 +58,16 @@ public static function load($key, $password = '') default: throw new \LengthException('The only supported lengths are 32 and 56'); } + $components = ['curve' => $curve]; $components['dA'] = new BigInteger($key, 256); $curve->rangeCheck($components['dA']); // note that EC::getEncodedCoordinates does some additional "magic" (it does strrev on the result) $components['QA'] = $components['curve']->multiplyPoint($components['curve']->getBasePoint(), $components['dA']); + return $components; } + /** * Convert an EC public key to the appropriate format * @@ -72,8 +77,9 @@ public static function load($key, $password = '') */ public static function savePublicKey(MontgomeryCurve $curve, array $publicKey) { - return \strrev($publicKey[0]->toBytes()); + return strrev($publicKey[0]->toBytes()); } + /** * Convert a private key to the appropriate format. * @@ -86,9 +92,10 @@ public static function savePublicKey(MontgomeryCurve $curve, array $publicKey) */ public static function savePrivateKey(BigInteger $privateKey, MontgomeryCurve $curve, array $publicKey, $secret = null, $password = '') { - if (!empty($password) && \is_string($password)) { + if (!empty($password) && is_string($password)) { throw new UnsupportedFormatException('MontgomeryPrivate private keys do not support encryption'); } + return $privateKey->toBytes(); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/MontgomeryPublic.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/MontgomeryPublic.php index e4d8e6a..458913d 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/MontgomeryPublic.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/MontgomeryPublic.php @@ -10,17 +10,18 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Formats\Keys; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Montgomery as MontgomeryCurve; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves\Curve25519; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves\Curve448; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * Montgomery Public Key Handler * * @author Jim Wigginton - * @internal */ abstract class MontgomeryPublic { @@ -28,7 +29,8 @@ abstract class MontgomeryPublic * Is invisible flag * */ - const IS_INVISIBLE = \true; + const IS_INVISIBLE = true; + /** * Break a public or private key down into its constituent components * @@ -38,7 +40,7 @@ abstract class MontgomeryPublic */ public static function load($key, $password = '') { - switch (\strlen($key)) { + switch (strlen($key)) { case 32: $curve = new Curve25519(); break; @@ -48,10 +50,13 @@ public static function load($key, $password = '') default: throw new \LengthException('The only supported lengths are 32 and 56'); } + $components = ['curve' => $curve]; - $components['QA'] = [$components['curve']->convertInteger(new BigInteger(\strrev($key), 256))]; + $components['QA'] = [$components['curve']->convertInteger(new BigInteger(strrev($key), 256))]; + return $components; } + /** * Convert an EC public key to the appropriate format * @@ -61,6 +66,6 @@ public static function load($key, $password = '') */ public static function savePublicKey(MontgomeryCurve $curve, array $publicKey) { - return \strrev($publicKey[0]->toBytes()); + return strrev($publicKey[0]->toBytes()); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/OpenSSH.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/OpenSSH.php index e7f57e0..cc9be0b 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/OpenSSH.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/OpenSSH.php @@ -12,6 +12,7 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Formats\Keys; use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; @@ -20,21 +21,28 @@ use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves\Ed25519; use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedCurveException; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * OpenSSH Formatted EC Key Handler * * @author Jim Wigginton - * @internal */ abstract class OpenSSH extends Progenitor { use Common; + /** * Supported Key Types * * @var array */ - protected static $types = ['ecdsa-sha2-nistp256', 'ecdsa-sha2-nistp384', 'ecdsa-sha2-nistp521', 'ssh-ed25519']; + protected static $types = [ + 'ecdsa-sha2-nistp256', + 'ecdsa-sha2-nistp384', + 'ecdsa-sha2-nistp521', + 'ssh-ed25519' + ]; + /** * Break a public or private key down into its constituent components * @@ -45,11 +53,12 @@ abstract class OpenSSH extends Progenitor public static function load($key, $password = '') { $parsed = parent::load($key, $password); + if (isset($parsed['paddedKey'])) { $paddedKey = $parsed['paddedKey']; list($type) = Strings::unpackSSH2('s', $paddedKey); if ($type != $parsed['type']) { - throw new \RuntimeException("The public and private keys are not of the same type ({$type} vs {$parsed['type']})"); + throw new \RuntimeException("The public and private keys are not of the same type ($type vs $parsed[type])"); } if ($type == 'ssh-ed25519') { list(, $key, $comment) = Strings::unpackSSH2('sss', $paddedKey); @@ -60,22 +69,36 @@ public static function load($key, $password = '') list($curveName, $publicKey, $privateKey, $comment) = Strings::unpackSSH2('ssis', $paddedKey); $curve = self::loadCurveByParam(['namedCurve' => $curveName]); $curve->rangeCheck($privateKey); - return ['curve' => $curve, 'dA' => $privateKey, 'QA' => self::extractPoint("\x00{$publicKey}", $curve), 'comment' => $comment]; + return [ + 'curve' => $curve, + 'dA' => $privateKey, + 'QA' => self::extractPoint("\0$publicKey", $curve), + 'comment' => $comment + ]; } + if ($parsed['type'] == 'ssh-ed25519') { - if (Strings::shift($parsed['publicKey'], 4) != "\x00\x00\x00 ") { + if (Strings::shift($parsed['publicKey'], 4) != "\0\0\0\x20") { throw new \RuntimeException('Length of ssh-ed25519 key should be 32'); } + $curve = new Ed25519(); $qa = self::extractPoint($parsed['publicKey'], $curve); } else { list($curveName, $publicKey) = Strings::unpackSSH2('ss', $parsed['publicKey']); - $curveName = '\\OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\' . $curveName; + $curveName = '\phpseclib3\Crypt\EC\Curves\\' . $curveName; $curve = new $curveName(); - $qa = self::extractPoint("\x00" . $publicKey, $curve); + + $qa = self::extractPoint("\0" . $publicKey, $curve); } - return ['curve' => $curve, 'QA' => $qa, 'comment' => $parsed['comment']]; + + return [ + 'curve' => $curve, + 'QA' => $qa, + 'comment' => $parsed['comment'] + ]; } + /** * Returns the alias that corresponds to a curve * @@ -84,24 +107,30 @@ public static function load($key, $password = '') private static function getAlias(BaseCurve $curve) { self::initialize_static_variables(); + $reflect = new \ReflectionClass($curve); $name = $reflect->getShortName(); + $oid = self::$curveOIDs[$name]; - $aliases = \array_filter(self::$curveOIDs, function ($v) use($oid) { + $aliases = array_filter(self::$curveOIDs, function ($v) use ($oid) { return $v == $oid; }); - $aliases = \array_keys($aliases); - for ($i = 0; $i < \count($aliases); $i++) { - if (\in_array('ecdsa-sha2-' . $aliases[$i], self::$types)) { + $aliases = array_keys($aliases); + + for ($i = 0; $i < count($aliases); $i++) { + if (in_array('ecdsa-sha2-' . $aliases[$i], self::$types)) { $alias = $aliases[$i]; break; } } + if (!isset($alias)) { throw new UnsupportedCurveException($name . ' is not a curve that the OpenSSH plugin supports'); } + return $alias; } + /** * Convert an EC public key to the appropriate format * @@ -113,23 +142,32 @@ private static function getAlias(BaseCurve $curve) public static function savePublicKey(BaseCurve $curve, array $publicKey, array $options = []) { $comment = isset($options['comment']) ? $options['comment'] : self::$comment; + if ($curve instanceof Ed25519) { $key = Strings::packSSH2('ss', 'ssh-ed25519', $curve->encodePoint($publicKey)); + if (isset($options['binary']) ? $options['binary'] : self::$binary) { return $key; } - $key = 'ssh-ed25519 ' . \base64_encode($key) . ' ' . $comment; + + $key = 'ssh-ed25519 ' . base64_encode($key) . ' ' . $comment; return $key; } + $alias = self::getAlias($curve); - $points = "\x04" . $publicKey[0]->toBytes() . $publicKey[1]->toBytes(); + + $points = "\4" . $publicKey[0]->toBytes() . $publicKey[1]->toBytes(); $key = Strings::packSSH2('sss', 'ecdsa-sha2-' . $alias, $alias, $points); + if (isset($options['binary']) ? $options['binary'] : self::$binary) { return $key; } - $key = 'ecdsa-sha2-' . $alias . ' ' . \base64_encode($key) . ' ' . $comment; + + $key = 'ecdsa-sha2-' . $alias . ' ' . base64_encode($key) . ' ' . $comment; + return $key; } + /** * Convert a private key to the appropriate format. * @@ -147,18 +185,25 @@ public static function savePrivateKey(BigInteger $privateKey, BaseCurve $curve, if (!isset($secret)) { throw new \RuntimeException('Private Key does not have a secret set'); } - if (\strlen($secret) != 32) { + if (strlen($secret) != 32) { throw new \RuntimeException('Private Key secret is not of the correct length'); } + $pubKey = $curve->encodePoint($publicKey); + $publicKey = Strings::packSSH2('ss', 'ssh-ed25519', $pubKey); $privateKey = Strings::packSSH2('sss', 'ssh-ed25519', $pubKey, $secret . $pubKey); + return self::wrapPrivateKey($publicKey, $privateKey, $password, $options); } + $alias = self::getAlias($curve); - $points = "\x04" . $publicKey[0]->toBytes() . $publicKey[1]->toBytes(); - $publicKey = self::savePublicKey($curve, $publicKey, ['binary' => \true]); + + $points = "\4" . $publicKey[0]->toBytes() . $publicKey[1]->toBytes(); + $publicKey = self::savePublicKey($curve, $publicKey, ['binary' => true]); + $privateKey = Strings::packSSH2('sssi', 'ecdsa-sha2-' . $alias, $alias, $points, $privateKey); + return self::wrapPrivateKey($publicKey, $privateKey, $password, $options); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PKCS1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PKCS1.php index 3f60297..d716db3 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PKCS1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PKCS1.php @@ -22,6 +22,7 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Formats\Keys; use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; @@ -33,15 +34,16 @@ use OCA\Libresign\Vendor\phpseclib3\File\ASN1; use OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * "PKCS1" (RFC5915) Formatted EC Key Handler * * @author Jim Wigginton - * @internal */ abstract class PKCS1 extends Progenitor { use Common; + /** * Break a public or private key down into its constituent components * @@ -52,70 +54,91 @@ abstract class PKCS1 extends Progenitor public static function load($key, $password = '') { self::initialize_static_variables(); + if (!Strings::is_stringable($key)) { - throw new \UnexpectedValueException('Key should be a string - not a ' . \gettype($key)); + throw new \UnexpectedValueException('Key should be a string - not a ' . gettype($key)); } - if (\strpos($key, 'BEGIN EC PARAMETERS') && \strpos($key, 'BEGIN EC PRIVATE KEY')) { + + if (strpos($key, 'BEGIN EC PARAMETERS') && strpos($key, 'BEGIN EC PRIVATE KEY')) { $components = []; - \preg_match('#-*BEGIN EC PRIVATE KEY-*[^-]*-*END EC PRIVATE KEY-*#s', $key, $matches); + + preg_match('#-*BEGIN EC PRIVATE KEY-*[^-]*-*END EC PRIVATE KEY-*#s', $key, $matches); $decoded = parent::load($matches[0], $password); $decoded = ASN1::decodeBER($decoded); if (!$decoded) { throw new \RuntimeException('Unable to decode BER'); } + $ecPrivate = ASN1::asn1map($decoded[0], Maps\ECPrivateKey::MAP); - if (!\is_array($ecPrivate)) { + if (!is_array($ecPrivate)) { throw new \RuntimeException('Unable to perform ASN1 mapping'); } + if (isset($ecPrivate['parameters'])) { $components['curve'] = self::loadCurveByParam($ecPrivate['parameters']); } - \preg_match('#-*BEGIN EC PARAMETERS-*[^-]*-*END EC PARAMETERS-*#s', $key, $matches); + + preg_match('#-*BEGIN EC PARAMETERS-*[^-]*-*END EC PARAMETERS-*#s', $key, $matches); $decoded = parent::load($matches[0], ''); $decoded = ASN1::decodeBER($decoded); if (!$decoded) { throw new \RuntimeException('Unable to decode BER'); } $ecParams = ASN1::asn1map($decoded[0], Maps\ECParameters::MAP); - if (!\is_array($ecParams)) { + if (!is_array($ecParams)) { throw new \RuntimeException('Unable to perform ASN1 mapping'); } $ecParams = self::loadCurveByParam($ecParams); + // comparing $ecParams and $components['curve'] directly won't work because they'll have different Math\Common\FiniteField classes // even if the modulo is the same - if (isset($components['curve']) && self::encodeParameters($ecParams, \false, []) != self::encodeParameters($components['curve'], \false, [])) { + if (isset($components['curve']) && self::encodeParameters($ecParams, false, []) != self::encodeParameters($components['curve'], false, [])) { throw new \RuntimeException('EC PARAMETERS does not correspond to EC PRIVATE KEY'); } + if (!isset($components['curve'])) { $components['curve'] = $ecParams; } + $components['dA'] = new BigInteger($ecPrivate['privateKey'], 256); $components['curve']->rangeCheck($components['dA']); - $components['QA'] = isset($ecPrivate['publicKey']) ? self::extractPoint($ecPrivate['publicKey'], $components['curve']) : $components['curve']->multiplyPoint($components['curve']->getBasePoint(), $components['dA']); + $components['QA'] = isset($ecPrivate['publicKey']) ? + self::extractPoint($ecPrivate['publicKey'], $components['curve']) : + $components['curve']->multiplyPoint($components['curve']->getBasePoint(), $components['dA']); + return $components; } + $key = parent::load($key, $password); + $decoded = ASN1::decodeBER($key); if (!$decoded) { throw new \RuntimeException('Unable to decode BER'); } + $key = ASN1::asn1map($decoded[0], Maps\ECParameters::MAP); - if (\is_array($key)) { + if (is_array($key)) { return ['curve' => self::loadCurveByParam($key)]; } + $key = ASN1::asn1map($decoded[0], Maps\ECPrivateKey::MAP); - if (!\is_array($key)) { + if (!is_array($key)) { throw new \RuntimeException('Unable to perform ASN1 mapping'); } if (!isset($key['parameters'])) { throw new \RuntimeException('Key cannot be loaded without parameters'); } + $components = []; $components['curve'] = self::loadCurveByParam($key['parameters']); $components['dA'] = new BigInteger($key['privateKey'], 256); - $components['QA'] = isset($ecPrivate['publicKey']) ? self::extractPoint($ecPrivate['publicKey'], $components['curve']) : $components['curve']->multiplyPoint($components['curve']->getBasePoint(), $components['dA']); + $components['QA'] = isset($ecPrivate['publicKey']) ? + self::extractPoint($ecPrivate['publicKey'], $components['curve']) : + $components['curve']->multiplyPoint($components['curve']->getBasePoint(), $components['dA']); + return $components; } + /** * Convert EC parameters to the appropriate format * @@ -124,12 +147,18 @@ public static function load($key, $password = '') public static function saveParameters(BaseCurve $curve, array $options = []) { self::initialize_static_variables(); + if ($curve instanceof TwistedEdwardsCurve || $curve instanceof MontgomeryCurve) { throw new UnsupportedCurveException('TwistedEdwards and Montgomery Curves are not supported'); } - $key = self::encodeParameters($curve, \false, $options); - return "-----BEGIN EC PARAMETERS-----\r\n" . \chunk_split(Strings::base64_encode($key), 64) . "-----END EC PARAMETERS-----\r\n"; + + $key = self::encodeParameters($curve, false, $options); + + return "-----BEGIN EC PARAMETERS-----\r\n" . + chunk_split(Strings::base64_encode($key), 64) . + "-----END EC PARAMETERS-----\r\n"; } + /** * Convert a private key to the appropriate format. * @@ -144,12 +173,22 @@ public static function saveParameters(BaseCurve $curve, array $options = []) public static function savePrivateKey(BigInteger $privateKey, BaseCurve $curve, array $publicKey, $secret = null, $password = '', array $options = []) { self::initialize_static_variables(); - if ($curve instanceof TwistedEdwardsCurve || $curve instanceof MontgomeryCurve) { + + if ($curve instanceof TwistedEdwardsCurve || $curve instanceof MontgomeryCurve) { throw new UnsupportedCurveException('TwistedEdwards Curves are not supported'); } - $publicKey = "\x04" . $publicKey[0]->toBytes() . $publicKey[1]->toBytes(); - $key = ['version' => 'ecPrivkeyVer1', 'privateKey' => $privateKey->toBytes(), 'parameters' => new ASN1\Element(self::encodeParameters($curve)), 'publicKey' => "\x00" . $publicKey]; + + $publicKey = "\4" . $publicKey[0]->toBytes() . $publicKey[1]->toBytes(); + + $key = [ + 'version' => 'ecPrivkeyVer1', + 'privateKey' => $privateKey->toBytes(), + 'parameters' => new ASN1\Element(self::encodeParameters($curve)), + 'publicKey' => "\0" . $publicKey + ]; + $key = ASN1::encodeDER($key, Maps\ECPrivateKey::MAP); + return self::wrapPrivateKey($key, 'EC', $password, $options); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PKCS8.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PKCS8.php index 8469f3f..770b6ec 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PKCS8.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PKCS8.php @@ -20,6 +20,7 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Formats\Keys; use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Keys\PKCS8 as Progenitor; @@ -32,27 +33,30 @@ use OCA\Libresign\Vendor\phpseclib3\File\ASN1; use OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * PKCS#8 Formatted EC Key Handler * * @author Jim Wigginton - * @internal */ abstract class PKCS8 extends Progenitor { use Common; + /** * OID Name * * @var array */ const OID_NAME = ['id-ecPublicKey', 'id-Ed25519', 'id-Ed448']; + /** * OID Value * * @var string */ const OID_VALUE = ['1.2.840.10045.2.1', '1.3.101.112', '1.3.101.113']; + /** * Break a public or private key down into its constituent components * @@ -68,27 +72,35 @@ public static function load($key, $password = '') // in the parent class as needed and in the context of the parent it's the parent // one that's called self::initialize_static_variables(); + $key = parent::load($key, $password); + $type = isset($key['privateKey']) ? 'privateKey' : 'publicKey'; + switch ($key[$type . 'Algorithm']['algorithm']) { case 'id-Ed25519': case 'id-Ed448': return self::loadEdDSA($key); } + $decoded = ASN1::decodeBER($key[$type . 'Algorithm']['parameters']->element); if (!$decoded) { throw new \RuntimeException('Unable to decode BER'); } $params = ASN1::asn1map($decoded[0], Maps\ECParameters::MAP); if (!$params) { - throw new \RuntimeException('Unable to decode the parameters using Maps\\ECParameters'); + throw new \RuntimeException('Unable to decode the parameters using Maps\ECParameters'); } + $components = []; $components['curve'] = self::loadCurveByParam($params); + if ($type == 'publicKey') { - $components['QA'] = self::extractPoint("\x00" . $key['publicKey'], $components['curve']); + $components['QA'] = self::extractPoint("\0" . $key['publicKey'], $components['curve']); + return $components; } + $decoded = ASN1::decodeBER($key['privateKey']); if (!$decoded) { throw new \RuntimeException('Unable to decode BER'); @@ -97,11 +109,16 @@ public static function load($key, $password = '') if (isset($key['parameters']) && $params != $key['parameters']) { throw new \RuntimeException('The PKCS8 parameter field does not match the private key parameter field'); } + $components['dA'] = new BigInteger($key['privateKey'], 256); $components['curve']->rangeCheck($components['dA']); - $components['QA'] = isset($key['publicKey']) ? self::extractPoint($key['publicKey'], $components['curve']) : $components['curve']->multiplyPoint($components['curve']->getBasePoint(), $components['dA']); + $components['QA'] = isset($key['publicKey']) ? + self::extractPoint($key['publicKey'], $components['curve']) : + $components['curve']->multiplyPoint($components['curve']->getBasePoint(), $components['dA']); + return $components; } + /** * Break a public or private EdDSA key down into its constituent components * @@ -110,27 +127,37 @@ public static function load($key, $password = '') private static function loadEdDSA(array $key) { $components = []; + if (isset($key['privateKey'])) { $components['curve'] = $key['privateKeyAlgorithm']['algorithm'] == 'id-Ed25519' ? new Ed25519() : new Ed448(); - $expected = \chr(ASN1::TYPE_OCTET_STRING) . ASN1::encodeLength($components['curve']::SIZE); - if (\substr($key['privateKey'], 0, 2) != $expected) { - throw new \RuntimeException('The first two bytes of the ' . $key['privateKeyAlgorithm']['algorithm'] . ' private key field should be 0x' . \bin2hex($expected)); + $expected = chr(ASN1::TYPE_OCTET_STRING) . ASN1::encodeLength($components['curve']::SIZE); + if (substr($key['privateKey'], 0, 2) != $expected) { + throw new \RuntimeException( + 'The first two bytes of the ' . + $key['privateKeyAlgorithm']['algorithm'] . + ' private key field should be 0x' . bin2hex($expected) + ); } - $arr = $components['curve']->extractSecret(\substr($key['privateKey'], 2)); + $arr = $components['curve']->extractSecret(substr($key['privateKey'], 2)); $components['dA'] = $arr['dA']; $components['secret'] = $arr['secret']; } + if (isset($key['publicKey'])) { if (!isset($components['curve'])) { $components['curve'] = $key['publicKeyAlgorithm']['algorithm'] == 'id-Ed25519' ? new Ed25519() : new Ed448(); } + $components['QA'] = self::extractPoint($key['publicKey'], $components['curve']); } + if (isset($key['privateKey']) && !isset($components['QA'])) { $components['QA'] = $components['curve']->multiplyPoint($components['curve']->getBasePoint(), $components['dA']); } + return $components; } + /** * Convert an EC public key to the appropriate format * @@ -142,16 +169,27 @@ private static function loadEdDSA(array $key) public static function savePublicKey(BaseCurve $curve, array $publicKey, array $options = []) { self::initialize_static_variables(); + if ($curve instanceof MontgomeryCurve) { throw new UnsupportedCurveException('Montgomery Curves are not supported'); } + if ($curve instanceof TwistedEdwardsCurve) { - return self::wrapPublicKey($curve->encodePoint($publicKey), null, $curve instanceof Ed25519 ? 'id-Ed25519' : 'id-Ed448', $options); + return self::wrapPublicKey( + $curve->encodePoint($publicKey), + null, + $curve instanceof Ed25519 ? 'id-Ed25519' : 'id-Ed448', + $options + ); } - $params = new ASN1\Element(self::encodeParameters($curve, \false, $options)); - $key = "\x04" . $publicKey[0]->toBytes() . $publicKey[1]->toBytes(); + + $params = new ASN1\Element(self::encodeParameters($curve, false, $options)); + + $key = "\4" . $publicKey[0]->toBytes() . $publicKey[1]->toBytes(); + return self::wrapPublicKey($key, $params, 'id-ecPublicKey', $options); } + /** * Convert a private key to the appropriate format. * @@ -166,21 +204,34 @@ public static function savePublicKey(BaseCurve $curve, array $publicKey, array $ public static function savePrivateKey(BigInteger $privateKey, BaseCurve $curve, array $publicKey, $secret = null, $password = '', array $options = []) { self::initialize_static_variables(); + if ($curve instanceof MontgomeryCurve) { throw new UnsupportedCurveException('Montgomery Curves are not supported'); } + if ($curve instanceof TwistedEdwardsCurve) { - return self::wrapPrivateKey(\chr(ASN1::TYPE_OCTET_STRING) . ASN1::encodeLength($curve::SIZE) . $secret, [], null, $password, $curve instanceof Ed25519 ? 'id-Ed25519' : 'id-Ed448'); + return self::wrapPrivateKey( + chr(ASN1::TYPE_OCTET_STRING) . ASN1::encodeLength($curve::SIZE) . $secret, + [], + null, + $password, + $curve instanceof Ed25519 ? 'id-Ed25519' : 'id-Ed448' + ); } - $publicKey = "\x04" . $publicKey[0]->toBytes() . $publicKey[1]->toBytes(); - $params = new ASN1\Element(self::encodeParameters($curve, \false, $options)); + + $publicKey = "\4" . $publicKey[0]->toBytes() . $publicKey[1]->toBytes(); + + $params = new ASN1\Element(self::encodeParameters($curve, false, $options)); + $key = [ 'version' => 'ecPrivkeyVer1', 'privateKey' => $privateKey->toBytes(), //'parameters' => $params, - 'publicKey' => "\x00" . $publicKey, + 'publicKey' => "\0" . $publicKey ]; + $key = ASN1::encodeDER($key, Maps\ECPrivateKey::MAP); + return self::wrapPrivateKey($key, [], $params, $password, 'id-ecPublicKey', '', $options); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PuTTY.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PuTTY.php index 7917665..bf98f5a 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PuTTY.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PuTTY.php @@ -10,6 +10,7 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Formats\Keys; use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; @@ -17,27 +18,35 @@ use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Base as BaseCurve; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\TwistedEdwards as TwistedEdwardsCurve; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * PuTTY Formatted EC Key Handler * * @author Jim Wigginton - * @internal */ abstract class PuTTY extends Progenitor { use Common; + /** * Public Handler * * @var string */ - const PUBLIC_HANDLER = 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Formats\\Keys\\OpenSSH'; + const PUBLIC_HANDLER = '\OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Formats\Keys\OpenSSH'; + /** * Supported Key Types * * @var array */ - protected static $types = ['ecdsa-sha2-nistp256', 'ecdsa-sha2-nistp384', 'ecdsa-sha2-nistp521', 'ssh-ed25519']; + protected static $types = [ + 'ecdsa-sha2-nistp256', + 'ecdsa-sha2-nistp384', + 'ecdsa-sha2-nistp521', + 'ssh-ed25519' + ]; + /** * Break a public or private key down into its constituent components * @@ -51,11 +60,14 @@ public static function load($key, $password = '') if (!isset($components['private'])) { return $components; } + $private = $components['private']; + $temp = Strings::base64_encode(Strings::packSSH2('s', $components['type']) . $components['public']); $components = OpenSSH::load($components['type'] . ' ' . $temp . ' ' . $components['comment']); + if ($components['curve'] instanceof TwistedEdwardsCurve) { - if (Strings::shift($private, 4) != "\x00\x00\x00 ") { + if (Strings::shift($private, 4) != "\0\0\0\x20") { throw new \RuntimeException('Length of ssh-ed25519 key should be 32'); } $arr = $components['curve']->extractSecret($private); @@ -65,8 +77,10 @@ public static function load($key, $password = '') list($components['dA']) = Strings::unpackSSH2('i', $private); $components['curve']->rangeCheck($components['dA']); } + return $components; } + /** * Convert a private key to the appropriate format. * @@ -78,25 +92,32 @@ public static function load($key, $password = '') * @param array $options optional * @return string */ - public static function savePrivateKey(BigInteger $privateKey, BaseCurve $curve, array $publicKey, $secret = null, $password = \false, array $options = []) + public static function savePrivateKey(BigInteger $privateKey, BaseCurve $curve, array $publicKey, $secret = null, $password = false, array $options = []) { self::initialize_static_variables(); - $public = \explode(' ', OpenSSH::savePublicKey($curve, $publicKey)); + + $public = explode(' ', OpenSSH::savePublicKey($curve, $publicKey)); $name = $public[0]; $public = Strings::base64_decode($public[1]); - list(, $length) = \unpack('N', Strings::shift($public, 4)); + list(, $length) = unpack('N', Strings::shift($public, 4)); Strings::shift($public, $length); + // PuTTY pads private keys with a null byte per the following: // https://github.com/github/putty/blob/a3d14d77f566a41fc61dfdc5c2e0e384c9e6ae8b/sshecc.c#L1926 if (!$curve instanceof TwistedEdwardsCurve) { $private = $privateKey->toBytes(); - if (!(\strlen($privateKey->toBits()) & 7)) { - $private = "\x00{$private}"; + if (!(strlen($privateKey->toBits()) & 7)) { + $private = "\0$private"; } } - $private = $curve instanceof TwistedEdwardsCurve ? Strings::packSSH2('s', $secret) : Strings::packSSH2('s', $private); + + $private = $curve instanceof TwistedEdwardsCurve ? + Strings::packSSH2('s', $secret) : + Strings::packSSH2('s', $private); + return self::wrapPrivateKey($public, $private, $name, $password, $options); } + /** * Convert an EC public key to the appropriate format * @@ -106,11 +127,12 @@ public static function savePrivateKey(BigInteger $privateKey, BaseCurve $curve, */ public static function savePublicKey(BaseCurve $curve, array $publicKey) { - $public = \explode(' ', OpenSSH::savePublicKey($curve, $publicKey)); + $public = explode(' ', OpenSSH::savePublicKey($curve, $publicKey)); $type = $public[0]; $public = Strings::base64_decode($public[1]); - list(, $length) = \unpack('N', Strings::shift($public, 4)); + list(, $length) = unpack('N', Strings::shift($public, 4)); Strings::shift($public, $length); + return self::wrapPublicKey($public, $type); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/XML.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/XML.php index 4106868..61ba09c 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/XML.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/XML.php @@ -15,6 +15,7 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Formats\Keys; use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; @@ -25,27 +26,30 @@ use OCA\Libresign\Vendor\phpseclib3\Exception\BadConfigurationException; use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedCurveException; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * XML Formatted EC Key Handler * * @author Jim Wigginton - * @internal */ abstract class XML { use Common; + /** * Default namespace * * @var string */ private static $namespace; + /** * Flag for using RFC4050 syntax * * @var bool */ - private static $rfc4050 = \false; + private static $rfc4050 = false; + /** * Break a public or private key down into its constituent components * @@ -56,37 +60,52 @@ abstract class XML public static function load($key, $password = '') { self::initialize_static_variables(); + if (!Strings::is_stringable($key)) { - throw new \UnexpectedValueException('Key should be a string - not a ' . \gettype($key)); + throw new \UnexpectedValueException('Key should be a string - not a ' . gettype($key)); } - if (!\class_exists('DOMDocument')) { + + if (!class_exists('DOMDocument')) { throw new BadConfigurationException('The dom extension is not setup correctly on this system'); } - $use_errors = \libxml_use_internal_errors(\true); - if (\substr($key, 0, 5) != '' . $key . ''; } + $temp = self::isolateNamespace($key, 'http://www.w3.org/2009/xmldsig11#'); if ($temp) { $key = $temp; } + $temp = self::isolateNamespace($key, 'http://www.w3.org/2001/04/xmldsig-more#'); if ($temp) { $key = $temp; } + $dom = new \DOMDocument(); + if (!$dom->loadXML($key)) { - \libxml_use_internal_errors($use_errors); + libxml_use_internal_errors($use_errors); throw new \UnexpectedValueException('Key does not appear to contain XML'); } $xpath = new \DOMXPath($dom); - \libxml_use_internal_errors($use_errors); + libxml_use_internal_errors($use_errors); $curve = self::loadCurveByParam($xpath); + $pubkey = self::query($xpath, 'publickey', 'Public Key is not present'); - $QA = self::query($xpath, 'ecdsakeyvalue')->length ? self::extractPointRFC4050($xpath, $curve) : self::extractPoint("\x00" . $pubkey, $curve); - \libxml_use_internal_errors($use_errors); - return \compact('curve', 'QA'); + + $QA = self::query($xpath, 'ecdsakeyvalue')->length ? + self::extractPointRFC4050($xpath, $curve) : + self::extractPoint("\0" . $pubkey, $curve); + + libxml_use_internal_errors($use_errors); + + return compact('curve', 'QA'); } + /** * Case-insensitive xpath query * @@ -96,22 +115,24 @@ public static function load($key, $password = '') * @param bool $decode optional * @return \DOMNodeList */ - private static function query(\DOMXPath $xpath, $name, $error = null, $decode = \true) + private static function query(\DOMXPath $xpath, $name, $error = null, $decode = true) { $query = '/'; - $names = \explode('/', $name); + $names = explode('/', $name); foreach ($names as $name) { - $query .= "/*[translate(local-name(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')='{$name}']"; + $query .= "/*[translate(local-name(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')='$name']"; } $result = $xpath->query($query); if (!isset($error)) { return $result; } + if (!$result->length) { throw new \RuntimeException($error); } return $decode ? self::decodeValue($result->item(0)->textContent) : $result->item(0)->textContent; } + /** * Finds the first element in the relevant namespace, strips the namespacing and returns the XML for that element. * @@ -122,12 +143,12 @@ private static function isolateNamespace($xml, $ns) { $dom = new \DOMDocument(); if (!$dom->loadXML($xml)) { - return \false; + return false; } $xpath = new \DOMXPath($dom); - $nodes = $xpath->query("//*[namespace::*[.='{$ns}'] and not(../namespace::*[.='{$ns}'])]"); + $nodes = $xpath->query("//*[namespace::*[.='$ns'] and not(../namespace::*[.='$ns'])]"); if (!$nodes->length) { - return \false; + return false; } $node = $nodes->item(0); $ns_name = $node->lookupPrefix($ns); @@ -136,6 +157,7 @@ private static function isolateNamespace($xml, $ns) } return $dom->saveXML($node); } + /** * Decodes the value * @@ -143,8 +165,9 @@ private static function isolateNamespace($xml, $ns) */ private static function decodeValue($value) { - return Strings::base64_decode(\str_replace(["\r", "\n", ' ', "\t"], '', $value)); + return Strings::base64_decode(str_replace(["\r", "\n", ' ', "\t"], '', $value)); } + /** * Extract points from an XML document * @@ -162,12 +185,16 @@ private static function extractPointRFC4050(\DOMXPath $xpath, BaseCurve $curve) if (!$y->length || !$y->item(0)->hasAttribute('Value')) { throw new \RuntimeException('Public Key / Y coordinate not found'); } - $point = [$curve->convertInteger(new BigInteger($x->item(0)->getAttribute('Value'))), $curve->convertInteger(new BigInteger($y->item(0)->getAttribute('Value')))]; + $point = [ + $curve->convertInteger(new BigInteger($x->item(0)->getAttribute('Value'))), + $curve->convertInteger(new BigInteger($y->item(0)->getAttribute('Value'))) + ]; if (!$curve->verifyPoint($point)) { throw new \RuntimeException('Unable to verify that point exists on curve'); } return $point; } + /** * Returns an instance of \phpseclib3\Crypt\EC\BaseCurves\Base based * on the curve parameters @@ -180,47 +207,63 @@ private static function loadCurveByParam(\DOMXPath $xpath) $namedCurve = self::query($xpath, 'namedcurve'); if ($namedCurve->length == 1) { $oid = $namedCurve->item(0)->getAttribute('URN'); - $oid = \preg_replace('#[^\\d.]#', '', $oid); - $name = \array_search($oid, self::$curveOIDs); - if ($name === \false) { + $oid = preg_replace('#[^\d.]#', '', $oid); + $name = array_search($oid, self::$curveOIDs); + if ($name === false) { throw new UnsupportedCurveException('Curve with OID of ' . $oid . ' is not supported'); } - $curve = '\\OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\' . $name; - if (!\class_exists($curve)) { + + $curve = '\phpseclib3\Crypt\EC\Curves\\' . $name; + if (!class_exists($curve)) { throw new UnsupportedCurveException('Named Curve of ' . $name . ' is not supported'); } return new $curve(); } + $params = self::query($xpath, 'explicitparams'); if ($params->length) { return self::loadCurveByParamRFC4050($xpath); } + $params = self::query($xpath, 'ecparameters'); if (!$params->length) { throw new \RuntimeException('No parameters are present'); } - $fieldTypes = ['prime-field' => ['fieldid/prime/p'], 'gnb' => ['fieldid/gnb/m'], 'tnb' => ['fieldid/tnb/k'], 'pnb' => ['fieldid/pnb/k1', 'fieldid/pnb/k2', 'fieldid/pnb/k3'], 'unknown' => []]; + + $fieldTypes = [ + 'prime-field' => ['fieldid/prime/p'], + 'gnb' => ['fieldid/gnb/m'], + 'tnb' => ['fieldid/tnb/k'], + 'pnb' => ['fieldid/pnb/k1', 'fieldid/pnb/k2', 'fieldid/pnb/k3'], + 'unknown' => [] + ]; + foreach ($fieldTypes as $type => $queries) { foreach ($queries as $query) { $result = self::query($xpath, $query); if (!$result->length) { continue 2; } - $param = \preg_replace('#.*/#', '', $query); - ${$param} = self::decodeValue($result->item(0)->textContent); + $param = preg_replace('#.*/#', '', $query); + $$param = self::decodeValue($result->item(0)->textContent); } break; } + $a = self::query($xpath, 'curve/a', 'A coefficient is not present'); $b = self::query($xpath, 'curve/b', 'B coefficient is not present'); $base = self::query($xpath, 'base', 'Base point is not present'); $order = self::query($xpath, 'order', 'Order is not present'); + switch ($type) { case 'prime-field': $curve = new PrimeCurve(); $curve->setModulo(new BigInteger($p, 256)); - $curve->setCoefficients(new BigInteger($a, 256), new BigInteger($b, 256)); - $point = self::extractPoint("\x00" . $base, $curve); + $curve->setCoefficients( + new BigInteger($a, 256), + new BigInteger($b, 256) + ); + $point = self::extractPoint("\0" . $base, $curve); $curve->setBasePoint(...$point); $curve->setOrder(new BigInteger($order, 256)); return $curve; @@ -231,6 +274,7 @@ private static function loadCurveByParam(\DOMXPath $xpath) throw new UnsupportedCurveException('Field Type of ' . $type . ' is not supported'); } } + /** * Returns an instance of \phpseclib3\Crypt\EC\BaseCurves\Base based * on the curve parameters @@ -240,41 +284,58 @@ private static function loadCurveByParam(\DOMXPath $xpath) */ private static function loadCurveByParamRFC4050(\DOMXPath $xpath) { - $fieldTypes = ['prime-field' => ['primefieldparamstype/p'], 'unknown' => []]; + $fieldTypes = [ + 'prime-field' => ['primefieldparamstype/p'], + 'unknown' => [] + ]; + foreach ($fieldTypes as $type => $queries) { foreach ($queries as $query) { $result = self::query($xpath, $query); if (!$result->length) { continue 2; } - $param = \preg_replace('#.*/#', '', $query); - ${$param} = $result->item(0)->textContent; + $param = preg_replace('#.*/#', '', $query); + $$param = $result->item(0)->textContent; } break; } - $a = self::query($xpath, 'curveparamstype/a', 'A coefficient is not present', \false); - $b = self::query($xpath, 'curveparamstype/b', 'B coefficient is not present', \false); - $x = self::query($xpath, 'basepointparams/basepoint/ecpointtype/x', 'Base Point X is not present', \false); - $y = self::query($xpath, 'basepointparams/basepoint/ecpointtype/y', 'Base Point Y is not present', \false); - $order = self::query($xpath, 'order', 'Order is not present', \false); + + $a = self::query($xpath, 'curveparamstype/a', 'A coefficient is not present', false); + $b = self::query($xpath, 'curveparamstype/b', 'B coefficient is not present', false); + $x = self::query($xpath, 'basepointparams/basepoint/ecpointtype/x', 'Base Point X is not present', false); + $y = self::query($xpath, 'basepointparams/basepoint/ecpointtype/y', 'Base Point Y is not present', false); + $order = self::query($xpath, 'order', 'Order is not present', false); + switch ($type) { case 'prime-field': $curve = new PrimeCurve(); - $p = \str_replace(["\r", "\n", ' ', "\t"], '', $p); + + $p = str_replace(["\r", "\n", ' ', "\t"], '', $p); $curve->setModulo(new BigInteger($p)); - $a = \str_replace(["\r", "\n", ' ', "\t"], '', $a); - $b = \str_replace(["\r", "\n", ' ', "\t"], '', $b); - $curve->setCoefficients(new BigInteger($a), new BigInteger($b)); - $x = \str_replace(["\r", "\n", ' ', "\t"], '', $x); - $y = \str_replace(["\r", "\n", ' ', "\t"], '', $y); - $curve->setBasePoint(new BigInteger($x), new BigInteger($y)); - $order = \str_replace(["\r", "\n", ' ', "\t"], '', $order); + + $a = str_replace(["\r", "\n", ' ', "\t"], '', $a); + $b = str_replace(["\r", "\n", ' ', "\t"], '', $b); + $curve->setCoefficients( + new BigInteger($a), + new BigInteger($b) + ); + + $x = str_replace(["\r", "\n", ' ', "\t"], '', $x); + $y = str_replace(["\r", "\n", ' ', "\t"], '', $y); + $curve->setBasePoint( + new BigInteger($x), + new BigInteger($y) + ); + + $order = str_replace(["\r", "\n", ' ', "\t"], '', $order); $curve->setOrder(new BigInteger($order)); return $curve; default: throw new UnsupportedCurveException('Field Type of ' . $type . ' is not supported'); } } + /** * Sets the namespace. dsig11 is the most common one. * @@ -286,20 +347,23 @@ public static function setNamespace($namespace) { self::$namespace = $namespace; } + /** * Uses the XML syntax specified in https://tools.ietf.org/html/rfc4050 */ public static function enableRFC4050Syntax() { - self::$rfc4050 = \true; + self::$rfc4050 = true; } + /** * Uses the XML syntax specified in https://www.w3.org/TR/xmldsig-core/#sec-ECParameters */ public static function disableRFC4050Syntax() { - self::$rfc4050 = \false; + self::$rfc4050 = false; } + /** * Convert a public key to the appropriate format * @@ -311,21 +375,36 @@ public static function disableRFC4050Syntax() public static function savePublicKey(BaseCurve $curve, array $publicKey, array $options = []) { self::initialize_static_variables(); + if ($curve instanceof TwistedEdwardsCurve || $curve instanceof MontgomeryCurve) { throw new UnsupportedCurveException('TwistedEdwards and Montgomery Curves are not supported'); } + if (empty(static::$namespace)) { $pre = $post = ''; } else { $pre = static::$namespace . ':'; $post = ':' . static::$namespace; } + if (self::$rfc4050) { - return '<' . $pre . 'ECDSAKeyValue xmlns' . $post . '="http://www.w3.org/2001/04/xmldsig-more#">' . "\r\n" . self::encodeXMLParameters($curve, $pre, $options) . "\r\n" . '<' . $pre . 'PublicKey>' . "\r\n" . '<' . $pre . 'X Value="' . $publicKey[0] . '" />' . "\r\n" . '<' . $pre . 'Y Value="' . $publicKey[1] . '" />' . "\r\n" . '' . "\r\n" . ''; + return '<' . $pre . 'ECDSAKeyValue xmlns' . $post . '="http://www.w3.org/2001/04/xmldsig-more#">' . "\r\n" . + self::encodeXMLParameters($curve, $pre, $options) . "\r\n" . + '<' . $pre . 'PublicKey>' . "\r\n" . + '<' . $pre . 'X Value="' . $publicKey[0] . '" />' . "\r\n" . + '<' . $pre . 'Y Value="' . $publicKey[1] . '" />' . "\r\n" . + '' . "\r\n" . + ''; } - $publicKey = "\x04" . $publicKey[0]->toBytes() . $publicKey[1]->toBytes(); - return '<' . $pre . 'ECDSAKeyValue xmlns' . $post . '="http://www.w3.org/2009/xmldsig11#">' . "\r\n" . self::encodeXMLParameters($curve, $pre, $options) . "\r\n" . '<' . $pre . 'PublicKey>' . Strings::base64_encode($publicKey) . '' . "\r\n" . ''; + + $publicKey = "\4" . $publicKey[0]->toBytes() . $publicKey[1]->toBytes(); + + return '<' . $pre . 'ECDSAKeyValue xmlns' . $post . '="http://www.w3.org/2009/xmldsig11#">' . "\r\n" . + self::encodeXMLParameters($curve, $pre, $options) . "\r\n" . + '<' . $pre . 'PublicKey>' . Strings::base64_encode($publicKey) . '' . "\r\n" . + ''; } + /** * Encode Parameters * @@ -336,17 +415,24 @@ public static function savePublicKey(BaseCurve $curve, array $publicKey, array $ */ private static function encodeXMLParameters(BaseCurve $curve, $pre, array $options = []) { - $result = self::encodeParameters($curve, \true, $options); + $result = self::encodeParameters($curve, true, $options); + if (isset($result['namedCurve'])) { $namedCurve = '<' . $pre . 'NamedCurve URI="urn:oid:' . self::$curveOIDs[$result['namedCurve']] . '" />'; - return self::$rfc4050 ? '' . \str_replace('URI', 'URN', $namedCurve) . '' : $namedCurve; + return self::$rfc4050 ? + '' . str_replace('URI', 'URN', $namedCurve) . '' : + $namedCurve; } + if (self::$rfc4050) { - $xml = '<' . $pre . 'ExplicitParams>' . "\r\n" . '<' . $pre . 'FieldParams>' . "\r\n"; + $xml = '<' . $pre . 'ExplicitParams>' . "\r\n" . + '<' . $pre . 'FieldParams>' . "\r\n"; $temp = $result['specifiedCurve']; switch ($temp['fieldID']['fieldType']) { case 'prime-field': - $xml .= '<' . $pre . 'PrimeFieldParamsType>' . "\r\n" . '<' . $pre . 'P>' . $temp['fieldID']['parameters'] . '' . "\r\n" . '' . "\r\n"; + $xml .= '<' . $pre . 'PrimeFieldParamsType>' . "\r\n" . + '<' . $pre . 'P>' . $temp['fieldID']['parameters'] . '' . "\r\n" . + '' . "\r\n"; $a = $curve->getA(); $b = $curve->getB(); list($x, $y) = $curve->getBasePoint(); @@ -354,20 +440,46 @@ private static function encodeXMLParameters(BaseCurve $curve, $pre, array $optio default: throw new UnsupportedCurveException('Field Type of ' . $temp['fieldID']['fieldType'] . ' is not supported'); } - $xml .= '' . "\r\n" . '<' . $pre . 'CurveParamsType>' . "\r\n" . '<' . $pre . 'A>' . $a . '' . "\r\n" . '<' . $pre . 'B>' . $b . '' . "\r\n" . '' . "\r\n" . '<' . $pre . 'BasePointParams>' . "\r\n" . '<' . $pre . 'BasePoint>' . "\r\n" . '<' . $pre . 'ECPointType>' . "\r\n" . '<' . $pre . 'X>' . $x . '' . "\r\n" . '<' . $pre . 'Y>' . $y . '' . "\r\n" . '' . "\r\n" . '' . "\r\n" . '<' . $pre . 'Order>' . $curve->getOrder() . '' . "\r\n" . '' . "\r\n" . '' . "\r\n"; + $xml .= '' . "\r\n" . + '<' . $pre . 'CurveParamsType>' . "\r\n" . + '<' . $pre . 'A>' . $a . '' . "\r\n" . + '<' . $pre . 'B>' . $b . '' . "\r\n" . + '' . "\r\n" . + '<' . $pre . 'BasePointParams>' . "\r\n" . + '<' . $pre . 'BasePoint>' . "\r\n" . + '<' . $pre . 'ECPointType>' . "\r\n" . + '<' . $pre . 'X>' . $x . '' . "\r\n" . + '<' . $pre . 'Y>' . $y . '' . "\r\n" . + '' . "\r\n" . + '' . "\r\n" . + '<' . $pre . 'Order>' . $curve->getOrder() . '' . "\r\n" . + '' . "\r\n" . + '' . "\r\n"; + return $xml; } + if (isset($result['specifiedCurve'])) { - $xml = '<' . $pre . 'ECParameters>' . "\r\n" . '<' . $pre . 'FieldID>' . "\r\n"; + $xml = '<' . $pre . 'ECParameters>' . "\r\n" . + '<' . $pre . 'FieldID>' . "\r\n"; $temp = $result['specifiedCurve']; switch ($temp['fieldID']['fieldType']) { case 'prime-field': - $xml .= '<' . $pre . 'Prime>' . "\r\n" . '<' . $pre . 'P>' . Strings::base64_encode($temp['fieldID']['parameters']->toBytes()) . '' . "\r\n" . '' . "\r\n"; + $xml .= '<' . $pre . 'Prime>' . "\r\n" . + '<' . $pre . 'P>' . Strings::base64_encode($temp['fieldID']['parameters']->toBytes()) . '' . "\r\n" . + '' . "\r\n" ; break; default: throw new UnsupportedCurveException('Field Type of ' . $temp['fieldID']['fieldType'] . ' is not supported'); } - $xml .= '' . "\r\n" . '<' . $pre . 'Curve>' . "\r\n" . '<' . $pre . 'A>' . Strings::base64_encode($temp['curve']['a']) . '' . "\r\n" . '<' . $pre . 'B>' . Strings::base64_encode($temp['curve']['b']) . '' . "\r\n" . '' . "\r\n" . '<' . $pre . 'Base>' . Strings::base64_encode($temp['base']) . '' . "\r\n" . '<' . $pre . 'Order>' . Strings::base64_encode($temp['order']) . '' . "\r\n" . ''; + $xml .= '' . "\r\n" . + '<' . $pre . 'Curve>' . "\r\n" . + '<' . $pre . 'A>' . Strings::base64_encode($temp['curve']['a']) . '' . "\r\n" . + '<' . $pre . 'B>' . Strings::base64_encode($temp['curve']['b']) . '' . "\r\n" . + '' . "\r\n" . + '<' . $pre . 'Base>' . Strings::base64_encode($temp['base']) . '' . "\r\n" . + '<' . $pre . 'Order>' . Strings::base64_encode($temp['order']) . '' . "\r\n" . + ''; return $xml; } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/libsodium.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/libsodium.php index dba2cd3..21203be 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/libsodium.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/libsodium.php @@ -14,25 +14,28 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Formats\Keys; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves\Ed25519; use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedFormatException; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * libsodium Key Handler * * @author Jim Wigginton - * @internal */ abstract class libsodium { use Common; + /** * Is invisible flag * */ - const IS_INVISIBLE = \true; + const IS_INVISIBLE = true; + /** * Break a public or private key down into its constituent components * @@ -42,24 +45,25 @@ abstract class libsodium */ public static function load($key, $password = '') { - switch (\strlen($key)) { + switch (strlen($key)) { case 32: $public = $key; break; case 64: - $private = \substr($key, 0, 32); - $public = \substr($key, -32); + $private = substr($key, 0, 32); + $public = substr($key, -32); break; case 96: - $public = \substr($key, -32); - if (\substr($key, 32, 32) != $public) { + $public = substr($key, -32); + if (substr($key, 32, 32) != $public) { throw new \RuntimeException('Keys with 96 bytes should have the 2nd and 3rd set of 32 bytes match'); } - $private = \substr($key, 0, 32); + $private = substr($key, 0, 32); break; default: throw new \RuntimeException('libsodium keys need to either be 32 bytes long, 64 bytes long or 96 bytes long'); } + $curve = new Ed25519(); $components = ['curve' => $curve]; if (isset($private)) { @@ -67,9 +71,13 @@ public static function load($key, $password = '') $components['dA'] = $arr['dA']; $components['secret'] = $arr['secret']; } - $components['QA'] = isset($public) ? self::extractPoint($public, $curve) : $curve->multiplyPoint($curve->getBasePoint(), $components['dA']); + $components['QA'] = isset($public) ? + self::extractPoint($public, $curve) : + $curve->multiplyPoint($curve->getBasePoint(), $components['dA']); + return $components; } + /** * Convert an EC public key to the appropriate format * @@ -81,6 +89,7 @@ public static function savePublicKey(Ed25519 $curve, array $publicKey) { return $curve->encodePoint($publicKey); } + /** * Convert a private key to the appropriate format. * @@ -96,10 +105,10 @@ public static function savePrivateKey(BigInteger $privateKey, Ed25519 $curve, ar if (!isset($secret)) { throw new \RuntimeException('Private Key does not have a secret set'); } - if (\strlen($secret) != 32) { + if (strlen($secret) != 32) { throw new \RuntimeException('Private Key secret is not of the correct length'); } - if (!empty($password) && \is_string($password)) { + if (!empty($password) && is_string($password)) { throw new UnsupportedFormatException('libsodium private keys do not support encryption'); } return $secret . $curve->encodePoint($publicKey); diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/ASN1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/ASN1.php index a66a213..8fd9031 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/ASN1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/ASN1.php @@ -13,16 +13,17 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Formats\Signature; use OCA\Libresign\Vendor\phpseclib3\File\ASN1 as Encoder; use OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps\EcdsaSigValue; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * ASN1 Signature Handler * * @author Jim Wigginton - * @internal */ abstract class ASN1 { @@ -34,16 +35,19 @@ abstract class ASN1 */ public static function load($sig) { - if (!\is_string($sig)) { - return \false; + if (!is_string($sig)) { + return false; } + $decoded = Encoder::decodeBER($sig); if (empty($decoded)) { - return \false; + return false; } $components = Encoder::asn1map($decoded[0], EcdsaSigValue::MAP); + return $components; } + /** * Returns a signature in the appropriate format * @@ -53,6 +57,6 @@ public static function load($sig) */ public static function save(BigInteger $r, BigInteger $s) { - return Encoder::encodeDER(\compact('r', 's'), EcdsaSigValue::MAP); + return Encoder::encodeDER(compact('r', 's'), EcdsaSigValue::MAP); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/IEEE.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/IEEE.php index c1cf8f6..6cba666 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/IEEE.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/IEEE.php @@ -14,14 +14,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Formats\Signature; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * ASN1 Signature Handler * * @author Jim Wigginton - * @internal */ abstract class IEEE { @@ -33,17 +34,21 @@ abstract class IEEE */ public static function load($sig) { - if (!\is_string($sig)) { - return \false; + if (!is_string($sig)) { + return false; } - $len = \strlen($sig); + + $len = strlen($sig); if ($len & 1) { - return \false; + return false; } - $r = new BigInteger(\substr($sig, 0, $len >> 1), 256); - $s = new BigInteger(\substr($sig, $len >> 1), 256); - return \compact('r', 's'); + + $r = new BigInteger(substr($sig, 0, $len >> 1), 256); + $s = new BigInteger(substr($sig, $len >> 1), 256); + + return compact('r', 's'); } + /** * Returns a signature in the appropriate format * @@ -57,7 +62,7 @@ public static function save(BigInteger $r, BigInteger $s, $curve, $length) { $r = $r->toBytes(); $s = $s->toBytes(); - $length = (int) \ceil($length / 8); - return \str_pad($r, $length, "\x00", \STR_PAD_LEFT) . \str_pad($s, $length, "\x00", \STR_PAD_LEFT); + $length = (int) ceil($length / 8); + return str_pad($r, $length, "\0", STR_PAD_LEFT) . str_pad($s, $length, "\0", STR_PAD_LEFT); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/Raw.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/Raw.php index 9466fab..c95106c 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/Raw.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/Raw.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Formats\Signature; use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Signature\Raw as Progenitor; + /** * Raw DSA Signature Handler * * @author Jim Wigginton - * @internal */ abstract class Raw extends Progenitor { diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/SSH2.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/SSH2.php index 57bdb13..9b3033b 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/SSH2.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/SSH2.php @@ -12,15 +12,16 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Formats\Signature; use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * SSH2 Signature Handler * * @author Jim Wigginton - * @internal */ abstract class SSH2 { @@ -32,12 +33,13 @@ abstract class SSH2 */ public static function load($sig) { - if (!\is_string($sig)) { - return \false; + if (!is_string($sig)) { + return false; } + $result = Strings::unpackSSH2('ss', $sig); - if ($result === \false) { - return \false; + if ($result === false) { + return false; } list($type, $blob) = $result; switch ($type) { @@ -47,14 +49,20 @@ public static function load($sig) case 'ecdsa-sha2-nistp521': break; default: - return \false; + return false; } + $result = Strings::unpackSSH2('ii', $blob); - if ($result === \false) { - return \false; + if ($result === false) { + return false; } - return ['r' => $result[0], 's' => $result[1]]; + + return [ + 'r' => $result[0], + 's' => $result[1] + ]; } + /** * Returns a signature in the appropriate format * @@ -76,9 +84,11 @@ public static function save(BigInteger $r, BigInteger $s, $curve) $curve = 'nistp521'; break; default: - return \false; + return false; } + $blob = Strings::packSSH2('ii', $r, $s); + return Strings::packSSH2('ss', 'ecdsa-sha2-' . $curve, $blob); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Parameters.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Parameters.php index d2a655b..06c4642 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Parameters.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Parameters.php @@ -8,14 +8,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC; use OCA\Libresign\Vendor\phpseclib3\Crypt\EC; + /** * EC Parameters * * @author Jim Wigginton - * @internal */ final class Parameters extends EC { @@ -29,6 +30,7 @@ final class Parameters extends EC public function toString($type = 'PKCS1', array $options = []) { $type = self::validatePlugin('Keys', 'PKCS1', 'saveParameters'); + return $type::saveParameters($this->curve, $options); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/PrivateKey.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/PrivateKey.php index 51104ec..41b67bd 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/PrivateKey.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/PrivateKey.php @@ -8,6 +8,7 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC; use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; @@ -22,15 +23,16 @@ use OCA\Libresign\Vendor\phpseclib3\Crypt\Hash; use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedOperationException; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * EC Private Key * * @author Jim Wigginton - * @internal */ final class PrivateKey extends EC implements Common\PrivateKey { use Common\Traits\PasswordProtected; + /** * Private Key dA * @@ -41,10 +43,12 @@ final class PrivateKey extends EC implements Common\PrivateKey * @var object */ protected $dA; + /** * @var string */ protected $secret; + /** * Multiplies an encoded point by the private key * @@ -57,14 +61,15 @@ public function multiply($coordinates) { if ($this->curve instanceof MontgomeryCurve) { if ($this->curve instanceof Curve25519 && self::$engines['libsodium']) { - return \sodium_crypto_scalarmult($this->dA->toBytes(), $coordinates); + return sodium_crypto_scalarmult($this->dA->toBytes(), $coordinates); } - $point = [$this->curve->convertInteger(new BigInteger(\strrev($coordinates), 256))]; + + $point = [$this->curve->convertInteger(new BigInteger(strrev($coordinates), 256))]; $point = $this->curve->multiplyPoint($point, $this->dA); - return \strrev($point[0]->toBytes(\true)); + return strrev($point[0]->toBytes(true)); } if (!$this->curve instanceof TwistedEdwardsCurve) { - $coordinates = "\x00{$coordinates}"; + $coordinates = "\0$coordinates"; } $point = PKCS1::extractPoint($coordinates, $this->curve); $point = $this->curve->multiplyPoint($point, $this->dA); @@ -74,8 +79,9 @@ public function multiply($coordinates) if (empty($point)) { throw new \RuntimeException('The infinity point is invalid'); } - return "\x04" . $point[0]->toBytes(\true) . $point[1]->toBytes(\true); + return "\4" . $point[0]->toBytes(true) . $point[1]->toBytes(true); } + /** * Create a signature * @@ -88,70 +94,85 @@ public function sign($message) if ($this->curve instanceof MontgomeryCurve) { throw new UnsupportedOperationException('Montgomery Curves cannot be used to create signatures'); } + $dA = $this->dA; $order = $this->curve->getOrder(); + $shortFormat = $this->shortFormat; $format = $this->sigFormat; - if ($format === \false) { - return \false; + if ($format === false) { + return false; } + if ($this->curve instanceof TwistedEdwardsCurve) { if ($this->curve instanceof Ed25519 && self::$engines['libsodium'] && !isset($this->context)) { - $result = \sodium_crypto_sign_detached($message, $this->withPassword()->toString('libsodium')); - return $shortFormat == 'SSH2' ? Strings::packSSH2('ss', 'ssh-' . \strtolower($this->getCurve()), $result) : $result; + $result = sodium_crypto_sign_detached($message, $this->withPassword()->toString('libsodium')); + return $shortFormat == 'SSH2' ? Strings::packSSH2('ss', 'ssh-' . strtolower($this->getCurve()), $result) : $result; } + // contexts (Ed25519ctx) are supported but prehashing (Ed25519ph) is not. // quoting https://tools.ietf.org/html/rfc8032#section-8.5 , // "The Ed25519ph and Ed448ph variants ... SHOULD NOT be used" $A = $this->curve->encodePoint($this->QA); $curve = $this->curve; $hash = new Hash($curve::HASH); - $secret = \substr($hash->hash($this->secret), $curve::SIZE); + + $secret = substr($hash->hash($this->secret), $curve::SIZE); + if ($curve instanceof Ed25519) { - $dom = !isset($this->context) ? '' : 'SigEd25519 no Ed25519 collisions' . "\x00" . \chr(\strlen($this->context)) . $this->context; + $dom = !isset($this->context) ? '' : + 'SigEd25519 no Ed25519 collisions' . "\0" . chr(strlen($this->context)) . $this->context; } else { $context = isset($this->context) ? $this->context : ''; - $dom = 'SigEd448' . "\x00" . \chr(\strlen($context)) . $context; + $dom = 'SigEd448' . "\0" . chr(strlen($context)) . $context; } // SHA-512(dom2(F, C) || prefix || PH(M)) $r = $hash->hash($dom . $secret . $message); - $r = \strrev($r); + $r = strrev($r); $r = new BigInteger($r, 256); list(, $r) = $r->divide($order); $R = $curve->multiplyPoint($curve->getBasePoint(), $r); $R = $curve->encodePoint($R); $k = $hash->hash($dom . $R . $A . $message); - $k = \strrev($k); + $k = strrev($k); $k = new BigInteger($k, 256); list(, $k) = $k->divide($order); $S = $k->multiply($dA)->add($r); list(, $S) = $S->divide($order); - $S = \str_pad(\strrev($S->toBytes()), $curve::SIZE, "\x00"); - return $shortFormat == 'SSH2' ? Strings::packSSH2('ss', 'ssh-' . \strtolower($this->getCurve()), $R . $S) : $R . $S; + $S = str_pad(strrev($S->toBytes()), $curve::SIZE, "\0"); + return $shortFormat == 'SSH2' ? Strings::packSSH2('ss', 'ssh-' . strtolower($this->getCurve()), $R . $S) : $R . $S; } - if (self::$engines['OpenSSL'] && \in_array($this->hash->getHash(), \openssl_get_md_methods())) { + + if (self::$engines['OpenSSL'] && in_array($this->hash->getHash(), openssl_get_md_methods())) { $signature = ''; // altho PHP's OpenSSL bindings only supported EC key creation in PHP 7.1 they've long // supported signing / verification // we use specified curves to avoid issues with OpenSSL possibly not supporting a given named curve; // doing this may mean some curve-specific optimizations can't be used but idk if OpenSSL even // has curve-specific optimizations - $result = \openssl_sign($message, $signature, $this->withPassword()->toString('PKCS8', ['namedCurve' => \false]), $this->hash->getHash()); + $result = openssl_sign($message, $signature, $this->withPassword()->toString('PKCS8', ['namedCurve' => false]), $this->hash->getHash()); + if ($result) { if ($shortFormat == 'ASN1') { return $signature; } + $loaded = ASN1Signature::load($signature); $r = $loaded['r']; $s = $loaded['s']; + + return $this->formatSignature($r, $s); } } + $e = $this->hash->hash($message); $e = new BigInteger($e, 256); + $Ln = $this->hash->getLength() - $order->getLength(); $z = $Ln > 0 ? $e->bitwise_rightShift($Ln) : $e; - while (\true) { + + while (true) { $k = BigInteger::randomRange(self::$one, $order->subtract(self::$one)); list($x, $y) = $this->curve->multiplyPoint($this->curve->getBasePoint(), $k); $x = $x->toBigInteger(); @@ -167,6 +188,7 @@ public function sign($message) break; } } + // the following is an RFC6979 compliant implementation of deterministic ECDSA // it's unused because it's mainly intended for use when a good CSPRNG isn't // available. if phpseclib's CSPRNG isn't good then even key generation is @@ -176,7 +198,7 @@ public function sign($message) $this->q = $this->curve->getOrder(); $dA = $this->dA->toBigInteger(); $this->x = $dA; - + $h1 = $this->hash->hash($message); $k = $this->computek($h1); list($x, $y) = $this->curve->multiplyPoint($this->curve->getBasePoint(), $k); @@ -188,8 +210,10 @@ public function sign($message) $temp = $kinv->multiply($temp); list(, $s) = $temp->divide($this->q); */ + return $this->formatSignature($r, $s); } + /** * Returns the private key * @@ -200,8 +224,10 @@ public function sign($message) public function toString($type, array $options = []) { $type = self::validatePlugin('Keys', $type, 'savePrivateKey'); + return $type::savePrivateKey($this->dA, $this->curve, $this->QA, $this->secret, $this->password, $options); } + /** * Returns the public key * @@ -214,18 +240,23 @@ public function getPublicKey() if ($this->curve instanceof MontgomeryCurve) { $format = 'MontgomeryPublic'; } + $type = self::validatePlugin('Keys', $format, 'savePublicKey'); + $key = $type::savePublicKey($this->curve, $this->QA); $key = EC::loadFormat($format, $key); if ($this->curve instanceof MontgomeryCurve) { return $key; } - $key = $key->withHash($this->hash->getHash())->withSignatureFormat($this->shortFormat); + $key = $key + ->withHash($this->hash->getHash()) + ->withSignatureFormat($this->shortFormat); if ($this->curve instanceof TwistedEdwardsCurve) { $key = $key->withContext($this->context); } return $key; } + /** * Returns a signature in the appropriate format * @@ -234,19 +265,19 @@ public function getPublicKey() private function formatSignature(BigInteger $r, BigInteger $s) { $format = $this->sigFormat; + $temp = new \ReflectionMethod($format, 'save'); $paramCount = $temp->getNumberOfRequiredParameters(); + // @codingStandardsIgnoreStart switch ($paramCount) { - case 2: - return $format::save($r, $s); - case 3: - return $format::save($r, $s, $this->getCurve()); - case 4: - return $format::save($r, $s, $this->getCurve(), $this->getLength()); + case 2: return $format::save($r, $s); + case 3: return $format::save($r, $s, $this->getCurve()); + case 4: return $format::save($r, $s, $this->getCurve(), $this->getLength()); } // @codingStandardsIgnoreEnd + // presumably the only way you could get to this is if you were using a custom plugin - throw new UnsupportedOperationException("{$format}::save() has {$paramCount} parameters - the only valid parameter counts are 2 or 3"); + throw new UnsupportedOperationException("$format::save() has $paramCount parameters - the only valid parameter counts are 2 or 3"); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/PublicKey.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/PublicKey.php index bc13efd..138c3bc 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/PublicKey.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/PublicKey.php @@ -8,6 +8,7 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC; use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; @@ -21,15 +22,16 @@ use OCA\Libresign\Vendor\phpseclib3\Crypt\Hash; use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedOperationException; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * EC Public Key * * @author Jim Wigginton - * @internal */ final class PublicKey extends EC implements Common\PublicKey { use Common\Traits\Fingerprint; + /** * Verify a signature * @@ -43,86 +45,118 @@ public function verify($message, $signature) if ($this->curve instanceof MontgomeryCurve) { throw new UnsupportedOperationException('Montgomery Curves cannot be used to create signatures'); } + $shortFormat = $this->shortFormat; $format = $this->sigFormat; - if ($format === \false) { - return \false; + if ($format === false) { + return false; } + $order = $this->curve->getOrder(); + if ($this->curve instanceof TwistedEdwardsCurve) { if ($shortFormat == 'SSH2') { list(, $signature) = Strings::unpackSSH2('ss', $signature); } + if ($this->curve instanceof Ed25519 && self::$engines['libsodium'] && !isset($this->context)) { - return \sodium_crypto_sign_verify_detached($signature, $message, $this->toString('libsodium')); + return sodium_crypto_sign_verify_detached($signature, $message, $this->toString('libsodium')); } + $curve = $this->curve; - if (\strlen($signature) != 2 * $curve::SIZE) { - return \false; + if (strlen($signature) != 2 * $curve::SIZE) { + return false; } - $R = \substr($signature, 0, $curve::SIZE); - $S = \substr($signature, $curve::SIZE); + + $R = substr($signature, 0, $curve::SIZE); + $S = substr($signature, $curve::SIZE); + try { $R = PKCS1::extractPoint($R, $curve); $R = $this->curve->convertToInternal($R); } catch (\Exception $e) { - return \false; + return false; } - $S = \strrev($S); + + $S = strrev($S); $S = new BigInteger($S, 256); + if ($S->compare($order) >= 0) { - return \false; + return false; } + $A = $curve->encodePoint($this->QA); + if ($curve instanceof Ed25519) { - $dom2 = !isset($this->context) ? '' : 'SigEd25519 no Ed25519 collisions' . "\x00" . \chr(\strlen($this->context)) . $this->context; + $dom2 = !isset($this->context) ? '' : + 'SigEd25519 no Ed25519 collisions' . "\0" . chr(strlen($this->context)) . $this->context; } else { $context = isset($this->context) ? $this->context : ''; - $dom2 = 'SigEd448' . "\x00" . \chr(\strlen($context)) . $context; + $dom2 = 'SigEd448' . "\0" . chr(strlen($context)) . $context; } + $hash = new Hash($curve::HASH); - $k = $hash->hash($dom2 . \substr($signature, 0, $curve::SIZE) . $A . $message); - $k = \strrev($k); + $k = $hash->hash($dom2 . substr($signature, 0, $curve::SIZE) . $A . $message); + $k = strrev($k); $k = new BigInteger($k, 256); list(, $k) = $k->divide($order); + $qa = $curve->convertToInternal($this->QA); + $lhs = $curve->multiplyPoint($curve->getBasePoint(), $S); $rhs = $curve->multiplyPoint($qa, $k); $rhs = $curve->addPoint($rhs, $R); $rhs = $curve->convertToAffine($rhs); + return $lhs[0]->equals($rhs[0]) && $lhs[1]->equals($rhs[1]); } + $params = $format::load($signature); - if ($params === \false || \count($params) != 2) { - return \false; + if ($params === false || count($params) != 2) { + return false; } $r = $params['r']; $s = $params['s']; - if (self::$engines['OpenSSL'] && \in_array($this->hash->getHash(), \openssl_get_md_methods())) { + + if (self::$engines['OpenSSL'] && in_array($this->hash->getHash(), openssl_get_md_methods())) { $sig = $format != 'ASN1' ? ASN1Signature::save($r, $s) : $signature; - $result = \openssl_verify($message, $sig, $this->toString('PKCS8', ['namedCurve' => \false]), $this->hash->getHash()); + + $result = openssl_verify($message, $sig, $this->toString('PKCS8', ['namedCurve' => false]), $this->hash->getHash()); + if ($result != -1) { return (bool) $result; } } + $n_1 = $order->subtract(self::$one); if (!$r->between(self::$one, $n_1) || !$s->between(self::$one, $n_1)) { - return \false; + return false; } + $e = $this->hash->hash($message); $e = new BigInteger($e, 256); + $Ln = $this->hash->getLength() - $order->getLength(); $z = $Ln > 0 ? $e->bitwise_rightShift($Ln) : $e; + $w = $s->modInverse($order); list(, $u1) = $z->multiply($w)->divide($order); list(, $u2) = $r->multiply($w)->divide($order); + $u1 = $this->curve->convertInteger($u1); $u2 = $this->curve->convertInteger($u2); - list($x1, $y1) = $this->curve->multiplyAddPoints([$this->curve->getBasePoint(), $this->QA], [$u1, $u2]); + + list($x1, $y1) = $this->curve->multiplyAddPoints( + [$this->curve->getBasePoint(), $this->QA], + [$u1, $u2] + ); + $x1 = $x1->toBigInteger(); list(, $x1) = $x1->divide($order); + return $x1->equals($r); } + /** * Returns the public key * @@ -133,6 +167,7 @@ public function verify($message, $signature) public function toString($type, array $options = []) { $type = self::validatePlugin('Keys', $type, 'savePublicKey'); + return $type::savePublicKey($this->curve, $this->QA, $options); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/Hash.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/Hash.php index 5f96357..a0d034a 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/Hash.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/Hash.php @@ -28,6 +28,7 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt; use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; @@ -35,10 +36,10 @@ use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedAlgorithmException; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; use OCA\Libresign\Vendor\phpseclib3\Math\PrimeField; + /** * @author Jim Wigginton * @author Andreas Fischer - * @internal */ class Hash { @@ -47,16 +48,19 @@ class Hash * */ const PADDING_KECCAK = 1; + /** * Padding Types * */ const PADDING_SHA3 = 2; + /** * Padding Types * */ const PADDING_SHAKE = 3; + /** * Padding Type * @@ -65,6 +69,7 @@ class Hash * @var int */ private $paddingType = 0; + /** * Hash Parameter * @@ -72,6 +77,7 @@ class Hash * @var int */ private $hashParam; + /** * Byte-length of hash output (Internal HMAC) * @@ -79,6 +85,7 @@ class Hash * @var int */ private $length; + /** * Hash Algorithm * @@ -86,33 +93,38 @@ class Hash * @var string */ private $algo; + /** * Key * * @see self::setKey() * @var string */ - private $key = \false; + private $key = false; + /** * Nonce * * @see self::setNonce() * @var string */ - private $nonce = \false; + private $nonce = false; + /** * Hash Parameters * * @var array */ private $parameters = []; + /** * Computed Key * * @see self::_computeKey() * @var string */ - private $computedKey = \false; + private $computedKey = false; + /** * Outer XOR (Internal HMAC) * @@ -122,6 +134,7 @@ class Hash * @var string */ private $opad; + /** * Inner XOR (Internal HMAC) * @@ -131,6 +144,7 @@ class Hash * @var string */ private $ipad; + /** * Recompute AES Key * @@ -140,6 +154,7 @@ class Hash * @var boolean */ private $recomputeAESKey; + /** * umac cipher object * @@ -147,6 +162,7 @@ class Hash * @var AES */ private $c; + /** * umac pad * @@ -154,12 +170,14 @@ class Hash * @var string */ private $pad; + /** * Block Size * * @var int */ private $blockSize; + /**#@+ * UMAC variables * @@ -175,6 +193,7 @@ class Hash private static $maxwordrange64; private static $maxwordrange128; /**#@-*/ + /**#@+ * AES_CMAC variables * @@ -183,6 +202,7 @@ class Hash private $k1; private $k2; /**#@-*/ + /** * Default Constructor. * @@ -192,6 +212,7 @@ public function __construct($hash = 'sha256') { $this->setHash($hash); } + /** * Sets the key for HMACs * @@ -199,12 +220,13 @@ public function __construct($hash = 'sha256') * * @param string $key */ - public function setKey($key = \false) + public function setKey($key = false) { $this->key = $key; $this->computeKey(); - $this->recomputeAESKey = \true; + $this->recomputeAESKey = true; } + /** * Sets the nonce for UMACs * @@ -212,17 +234,19 @@ public function setKey($key = \false) * * @param string $nonce */ - public function setNonce($nonce = \false) + public function setNonce($nonce = false) { - switch (\true) { - case !\is_string($nonce): - case \strlen($nonce) > 0 && \strlen($nonce) <= 16: - $this->recomputeAESKey = \true; + switch (true) { + case !is_string($nonce): + case strlen($nonce) > 0 && strlen($nonce) <= 16: + $this->recomputeAESKey = true; $this->nonce = $nonce; return; } + throw new \LengthException('The nonce length must be between 1 and 16 bytes, inclusive'); } + /** * Pre-compute the key used by the HMAC * @@ -236,16 +260,21 @@ public function setNonce($nonce = \false) */ private function computeKey() { - if ($this->key === \false) { - $this->computedKey = \false; + if ($this->key === false) { + $this->computedKey = false; return; } - if (\strlen($this->key) <= $this->getBlockLengthInBytes()) { + + if (strlen($this->key) <= $this->getBlockLengthInBytes()) { $this->computedKey = $this->key; return; } - $this->computedKey = \is_array($this->algo) ? \call_user_func($this->algo, $this->key) : \hash($this->algo, $this->key, \true); + + $this->computedKey = is_array($this->algo) ? + call_user_func($this->algo, $this->key) : + hash($this->algo, $this->key, true); } + /** * Gets the hash function. * @@ -257,6 +286,7 @@ public function getHash() { return $this->hashParam; } + /** * Sets the hash function. * @@ -265,22 +295,22 @@ public function getHash() public function setHash($hash) { $oldHash = $this->hashParam; - $this->hashParam = $hash = \strtolower($hash); + $this->hashParam = $hash = strtolower($hash); switch ($hash) { case 'umac-32': case 'umac-64': case 'umac-96': case 'umac-128': if ($oldHash != $this->hashParam) { - $this->recomputeAESKey = \true; + $this->recomputeAESKey = true; } $this->blockSize = 128; - $this->length = \abs(\substr($hash, -3)) >> 3; + $this->length = abs(substr($hash, -3)) >> 3; $this->algo = 'umac'; return; case 'aes_cmac': if ($oldHash != $this->hashParam) { - $this->recomputeAESKey = \true; + $this->recomputeAESKey = true; } $this->blockSize = 128; $this->length = 16; @@ -295,9 +325,8 @@ public function setHash($hash) case 'sha512-96': case 'sha512/224-96': case 'sha512/256-96': - $hash = \substr($hash, 0, -3); - $this->length = 12; - // 96 / 8 = 12 + $hash = substr($hash, 0, -3); + $this->length = 12; // 96 / 8 = 12 break; case 'md2': case 'md5': @@ -313,7 +342,7 @@ public function setHash($hash) break; case 'keccak256': $this->paddingType = self::PADDING_KECCAK; - // fall-through + // fall-through case 'sha256': case 'sha512/256': case 'sha3-256': @@ -328,14 +357,17 @@ public function setHash($hash) $this->length = 64; break; default: - if (\preg_match('#^(shake(?:128|256))-(\\d+)$#', $hash, $matches)) { + if (preg_match('#^(shake(?:128|256))-(\d+)$#', $hash, $matches)) { $this->paddingType = self::PADDING_SHAKE; $hash = $matches[1]; $this->length = $matches[2] >> 3; } else { - throw new UnsupportedAlgorithmException("{$hash} is not a supported algorithm"); + throw new UnsupportedAlgorithmException( + "$hash is not a supported algorithm" + ); } } + switch ($hash) { case 'md2': case 'md2-96': @@ -352,70 +384,86 @@ public function setHash($hash) $this->blockSize = 512; break; case 'sha3-224': - $this->blockSize = 1152; - // 1600 - 2*224 + $this->blockSize = 1152; // 1600 - 2*224 break; case 'sha3-256': case 'shake256': case 'keccak256': - $this->blockSize = 1088; - // 1600 - 2*256 + $this->blockSize = 1088; // 1600 - 2*256 break; case 'sha3-384': - $this->blockSize = 832; - // 1600 - 2*384 + $this->blockSize = 832; // 1600 - 2*384 break; case 'sha3-512': - $this->blockSize = 576; - // 1600 - 2*512 + $this->blockSize = 576; // 1600 - 2*512 break; case 'shake128': - $this->blockSize = 1344; - // 1600 - 2*128 + $this->blockSize = 1344; // 1600 - 2*128 break; default: $this->blockSize = 1024; } - if (\in_array(\substr($hash, 0, 5), ['sha3-', 'shake', 'kecca'])) { + + if (in_array(substr($hash, 0, 5), ['sha3-', 'shake', 'kecca'])) { // PHP 7.1.0 introduced support for "SHA3 fixed mode algorithms": // http://php.net/ChangeLog-7.php#7.1.0 - if (\version_compare(\PHP_VERSION, '7.1.0') < 0 || \substr($hash, 0, 5) != 'sha3-') { + if (version_compare(PHP_VERSION, '7.1.0') < 0 || substr($hash, 0, 5) != 'sha3-') { //preg_match('#(\d+)$#', $hash, $matches); //$this->parameters['capacity'] = 2 * $matches[1]; // 1600 - $this->blockSize //$this->parameters['rate'] = 1600 - $this->parameters['capacity']; // == $this->blockSize if (!$this->paddingType) { $this->paddingType = self::PADDING_SHA3; } - $this->parameters = ['capacity' => 1600 - $this->blockSize, 'rate' => $this->blockSize, 'length' => $this->length, 'padding' => $this->paddingType]; - $hash = ['OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Hash', \PHP_INT_SIZE == 8 ? 'sha3_64' : 'sha3_32']; + $this->parameters = [ + 'capacity' => 1600 - $this->blockSize, + 'rate' => $this->blockSize, + 'length' => $this->length, + 'padding' => $this->paddingType + ]; + $hash = ['\OCA\Libresign\Vendor\phpseclib3\Crypt\Hash', PHP_INT_SIZE == 8 ? 'sha3_64' : 'sha3_32']; } } + if ($hash == 'sha512/224' || $hash == 'sha512/256') { // PHP 7.1.0 introduced sha512/224 and sha512/256 support: // http://php.net/ChangeLog-7.php#7.1.0 - if (\version_compare(\PHP_VERSION, '7.1.0') < 0) { + if (version_compare(PHP_VERSION, '7.1.0') < 0) { // from http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf#page=24 - $initial = $hash == 'sha512/256' ? ['22312194FC2BF72C', '9F555FA3C84C64C2', '2393B86B6F53B151', '963877195940EABD', '96283EE2A88EFFE3', 'BE5E1E2553863992', '2B0199FC2C85B8AA', '0EB72DDC81C52CA2'] : ['8C3D37C819544DA2', '73E1996689DCD4D6', '1DFAB7AE32FF9C82', '679DD514582F9FCF', '0F6D2B697BD44DA8', '77E36F7304C48942', '3F9D85A86A1D36C8', '1112E6AD91D692A1']; + $initial = $hash == 'sha512/256' ? + [ + '22312194FC2BF72C', '9F555FA3C84C64C2', '2393B86B6F53B151', '963877195940EABD', + '96283EE2A88EFFE3', 'BE5E1E2553863992', '2B0199FC2C85B8AA', '0EB72DDC81C52CA2' + ] : + [ + '8C3D37C819544DA2', '73E1996689DCD4D6', '1DFAB7AE32FF9C82', '679DD514582F9FCF', + '0F6D2B697BD44DA8', '77E36F7304C48942', '3F9D85A86A1D36C8', '1112E6AD91D692A1' + ]; for ($i = 0; $i < 8; $i++) { - if (\PHP_INT_SIZE == 8) { - list(, $initial[$i]) = \unpack('J', \pack('H*', $initial[$i])); + if (PHP_INT_SIZE == 8) { + list(, $initial[$i]) = unpack('J', pack('H*', $initial[$i])); } else { $initial[$i] = new BigInteger($initial[$i], 16); $initial[$i]->setPrecision(64); } } - $this->parameters = \compact('initial'); - $hash = ['OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Hash', \PHP_INT_SIZE == 8 ? 'sha512_64' : 'sha512']; + + $this->parameters = compact('initial'); + + $hash = ['\OCA\Libresign\Vendor\phpseclib3\Crypt\Hash', PHP_INT_SIZE == 8 ? 'sha512_64' : 'sha512']; } } - if (\is_array($hash)) { + + if (is_array($hash)) { $b = $this->blockSize >> 3; - $this->ipad = \str_repeat(\chr(0x36), $b); - $this->opad = \str_repeat(\chr(0x5c), $b); + $this->ipad = str_repeat(chr(0x36), $b); + $this->opad = str_repeat(chr(0x5C), $b); } + $this->algo = $hash; + $this->computeKey(); } + /** * KDF: Key-Derivation Function * @@ -427,9 +475,11 @@ public function setHash($hash) */ private function kdf($index, $numbytes) { - $this->c->setIV(\pack('N4', 0, $index, 0, 1)); - return $this->c->encrypt(\str_repeat("\x00", $numbytes)); + $this->c->setIV(pack('N4', 0, $index, 0, 1)); + + return $this->c->encrypt(str_repeat("\0", $numbytes)); } + /** * PDF Algorithm * @@ -440,19 +490,22 @@ private function pdf() $k = $this->key; $nonce = $this->nonce; $taglen = $this->length; + // // Extract and zero low bit(s) of Nonce if needed // if ($taglen <= 8) { - $last = \strlen($nonce) - 1; - $mask = $taglen == 4 ? "\x03" : "\x01"; + $last = strlen($nonce) - 1; + $mask = $taglen == 4 ? "\3" : "\1"; $index = $nonce[$last] & $mask; $nonce[$last] = $nonce[$last] ^ $index; } + // // Make Nonce BLOCKLEN bytes by appending zeroes if needed // - $nonce = \str_pad($nonce, 16, "\x00"); + $nonce = str_pad($nonce, 16, "\0"); + // // Generate subkey, encipher and extract indexed substring // @@ -461,11 +514,15 @@ private function pdf() $c->disablePadding(); $c->setKey($kp); $c->setIV($nonce); - $t = $c->encrypt("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"); + $t = $c->encrypt("\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"); + // we could use ord() but per https://paragonie.com/blog/2016/06/constant-time-encoding-boring-cryptography-rfc-4648-and-you // unpack() doesn't leak timing info - return $taglen <= 8 ? \substr($t, \unpack('C', $index)[1] * $taglen, $taglen) : \substr($t, 0, $taglen); + return $taglen <= 8 ? + substr($t, unpack('C', $index)[1] * $taglen, $taglen) : + substr($t, 0, $taglen); } + /** * UHASH Algorithm * @@ -479,32 +536,37 @@ private function uhash($m, $taglen) // One internal iteration per 4 bytes of output // $iters = $taglen >> 2; + // // Define total key needed for all iterations using KDF. // L1Key reuses most key material between iterations. // //$L1Key = $this->kdf(1, 1024 + ($iters - 1) * 16); - $L1Key = $this->kdf(1, (1024 + ($iters - 1)) * 16); - $L2Key = $this->kdf(2, $iters * 24); + $L1Key = $this->kdf(1, (1024 + ($iters - 1)) * 16); + $L2Key = $this->kdf(2, $iters * 24); $L3Key1 = $this->kdf(3, $iters * 64); $L3Key2 = $this->kdf(4, $iters * 4); + // // For each iteration, extract key and do three-layer hash. // If bytelength(M) <= 1024, then skip L2-HASH. // $y = ''; for ($i = 0; $i < $iters; $i++) { - $L1Key_i = \substr($L1Key, $i * 16, 1024); - $L2Key_i = \substr($L2Key, $i * 24, 24); - $L3Key1_i = \substr($L3Key1, $i * 64, 64); - $L3Key2_i = \substr($L3Key2, $i * 4, 4); + $L1Key_i = substr($L1Key, $i * 16, 1024); + $L2Key_i = substr($L2Key, $i * 24, 24); + $L3Key1_i = substr($L3Key1, $i * 64, 64); + $L3Key2_i = substr($L3Key2, $i * 4, 4); + $a = self::L1Hash($L1Key_i, $m); - $b = \strlen($m) <= 1024 ? "\x00\x00\x00\x00\x00\x00\x00\x00{$a}" : self::L2Hash($L2Key_i, $a); + $b = strlen($m) <= 1024 ? "\0\0\0\0\0\0\0\0$a" : self::L2Hash($L2Key_i, $a); $c = self::L3Hash($L3Key1_i, $L3Key2_i, $b); $y .= $c; } + return $y; } + /** * L1-HASH Algorithm * @@ -521,32 +583,39 @@ private static function L1Hash($k, $m) // // Break M into 1024 byte chunks (final chunk may be shorter) // - $m = \str_split($m, 1024); + $m = str_split($m, 1024); + // // For each chunk, except the last: endian-adjust, NH hash // and add bit-length. Use results to build Y. // $length = 1024 * 8; $y = ''; - for ($i = 0; $i < \count($m) - 1; $i++) { - $m[$i] = \pack('N*', ...\unpack('V*', $m[$i])); - // ENDIAN-SWAP - $y .= \PHP_INT_SIZE == 8 ? static::nh64($k, $m[$i], $length) : static::nh32($k, $m[$i], $length); + + for ($i = 0; $i < count($m) - 1; $i++) { + $m[$i] = pack('N*', ...unpack('V*', $m[$i])); // ENDIAN-SWAP + $y .= PHP_INT_SIZE == 8 ? + static::nh64($k, $m[$i], $length) : + static::nh32($k, $m[$i], $length); } + // // For the last chunk: pad to 32-byte boundary, endian-adjust, // NH hash and add bit-length. Concatenate the result to Y. // - $length = \count($m) ? \strlen($m[$i]) : 0; - $pad = 32 - $length % 32; - $pad = \max(32, $length + $pad % 32); - $m[$i] = \str_pad(isset($m[$i]) ? $m[$i] : '', $pad, "\x00"); - // zeropad - $m[$i] = \pack('N*', ...\unpack('V*', $m[$i])); - // ENDIAN-SWAP - $y .= \PHP_INT_SIZE == 8 ? static::nh64($k, $m[$i], $length * 8) : static::nh32($k, $m[$i], $length * 8); + $length = count($m) ? strlen($m[$i]) : 0; + $pad = 32 - ($length % 32); + $pad = max(32, $length + $pad % 32); + $m[$i] = str_pad(isset($m[$i]) ? $m[$i] : '', $pad, "\0"); // zeropad + $m[$i] = pack('N*', ...unpack('V*', $m[$i])); // ENDIAN-SWAP + + $y .= PHP_INT_SIZE == 8 ? + static::nh64($k, $m[$i], $length * 8) : + static::nh32($k, $m[$i], $length * 8); + return $y; } + /** * 32-bit safe 64-bit Multiply with 2x 32-bit ints * @@ -557,23 +626,29 @@ private static function L1Hash($k, $m) private static function mul32_64($x, $y) { // see mul64() for a more detailed explanation of how this works - $x1 = $x >> 16 & 0xffff; - $x0 = $x & 0xffff; - $y1 = $y >> 16 & 0xffff; - $y0 = $y & 0xffff; + + $x1 = ($x >> 16) & 0xFFFF; + $x0 = $x & 0xFFFF; + + $y1 = ($y >> 16) & 0xFFFF; + $y0 = $y & 0xFFFF; + // the following 3x lines will possibly yield floats $z2 = $x1 * $y1; $z0 = $x0 * $y0; $z1 = $x1 * $y0 + $x0 * $y1; - $a = \intval(\fmod($z0, 65536)); - $b = \intval($z0 / 65536) + \intval(\fmod($z1, 65536)); - $c = \intval($z1 / 65536) + \intval(\fmod($z2, 65536)) + \intval($b / 65536); - $b = \intval(\fmod($b, 65536)); - $d = \intval($z2 / 65536) + \intval($c / 65536); - $c = \intval(\fmod($c, 65536)); - $d = \intval(\fmod($d, 65536)); - return \pack('n4', $d, $c, $b, $a); + + $a = intval(fmod($z0, 65536)); + $b = intval($z0 / 65536) + intval(fmod($z1, 65536)); + $c = intval($z1 / 65536) + intval(fmod($z2, 65536)) + intval($b / 65536); + $b = intval(fmod($b, 65536)); + $d = intval($z2 / 65536) + intval($c / 65536); + $c = intval(fmod($c, 65536)); + $d = intval(fmod($d, 65536)); + + return pack('n4', $d, $c, $b, $a); } + /** * 32-bit safe 64-bit Addition with 2x 64-bit strings * @@ -583,14 +658,15 @@ private static function mul32_64($x, $y) */ private static function add32_64($x, $y) { - list(, $x1, $x2, $x3, $x4) = \unpack('n4', $x); - list(, $y1, $y2, $y3, $y4) = \unpack('n4', $y); + list(, $x1, $x2, $x3, $x4) = unpack('n4', $x); + list(, $y1, $y2, $y3, $y4) = unpack('n4', $y); $a = $x4 + $y4; $b = $x3 + $y3 + ($a >> 16); $c = $x2 + $y2 + ($b >> 16); $d = $x1 + $y1 + ($c >> 16); - return \pack('n4', $d, $c, $b, $a); + return pack('n4', $d, $c, $b, $a); } + /** * 32-bit safe 32-bit Addition with 2x 32-bit strings * @@ -601,15 +677,19 @@ private static function add32_64($x, $y) private static function add32($x, $y) { // see add64() for a more detailed explanation of how this works - $x1 = $x & 0xffff; - $x2 = $x >> 16 & 0xffff; - $y1 = $y & 0xffff; - $y2 = $y >> 16 & 0xffff; + + $x1 = $x & 0xFFFF; + $x2 = ($x >> 16) & 0xFFFF; + $y1 = $y & 0xFFFF; + $y2 = ($y >> 16) & 0xFFFF; + $a = $x1 + $y1; - $b = $x2 + $y2 + ($a >> 16) << 16; - $a &= 0xffff; + $b = ($x2 + $y2 + ($a >> 16)) << 16; + $a &= 0xFFFF; + return $a | $b; } + /** * NH Algorithm / 32-bit safe * @@ -622,32 +702,39 @@ private static function nh32($k, $m, $length) // // Break M and K into 4-byte chunks // - $k = \unpack('N*', $k); - $m = \unpack('N*', $m); - $t = \count($m); + $k = unpack('N*', $k); + $m = unpack('N*', $m); + $t = count($m); + // // Perform NH hash on the chunks, pairing words for multiplication // which are 4 apart to accommodate vector-parallelism. // $i = 1; - $y = "\x00\x00\x00\x00\x00\x00\x00\x00"; + $y = "\0\0\0\0\0\0\0\0"; while ($i <= $t) { - $temp = self::add32($m[$i], $k[$i]); + $temp = self::add32($m[$i], $k[$i]); $temp2 = self::add32($m[$i + 4], $k[$i + 4]); $y = self::add32_64($y, self::mul32_64($temp, $temp2)); - $temp = self::add32($m[$i + 1], $k[$i + 1]); + + $temp = self::add32($m[$i + 1], $k[$i + 1]); $temp2 = self::add32($m[$i + 5], $k[$i + 5]); $y = self::add32_64($y, self::mul32_64($temp, $temp2)); - $temp = self::add32($m[$i + 2], $k[$i + 2]); + + $temp = self::add32($m[$i + 2], $k[$i + 2]); $temp2 = self::add32($m[$i + 6], $k[$i + 6]); $y = self::add32_64($y, self::mul32_64($temp, $temp2)); - $temp = self::add32($m[$i + 3], $k[$i + 3]); + + $temp = self::add32($m[$i + 3], $k[$i + 3]); $temp2 = self::add32($m[$i + 7], $k[$i + 7]); $y = self::add32_64($y, self::mul32_64($temp, $temp2)); + $i += 8; } - return self::add32_64($y, \pack('N2', 0, $length)); + + return self::add32_64($y, pack('N2', 0, $length)); } + /** * 64-bit Multiply with 2x 32-bit ints * @@ -659,20 +746,21 @@ private static function mul64($x, $y) { // since PHP doesn't implement unsigned integers we'll implement them with signed integers // to do this we'll use karatsuba multiplication + $x1 = $x >> 16; - $x0 = $x & 0xffff; + $x0 = $x & 0xFFFF; + $y1 = $y >> 16; - $y0 = $y & 0xffff; - $z2 = $x1 * $y1; - // up to 32 bits long - $z0 = $x0 * $y0; - // up to 32 bits long - $z1 = $x1 * $y0 + $x0 * $y1; - // up to 33 bit long + $y0 = $y & 0xFFFF; + + $z2 = $x1 * $y1; // up to 32 bits long + $z0 = $x0 * $y0; // up to 32 bits long + $z1 = $x1 * $y0 + $x0 * $y1; // up to 33 bit long // normally karatsuba multiplication calculates $z1 thusly: //$z1 = ($x1 + $x0) * ($y0 + $y1) - $z2 - $z0; // the idea being to eliminate one extra multiplication. for arbitrary precision math that makes sense // but not for this purpose + // at this point karatsuba would normally return this: //return ($z2 << 64) + ($z1 << 32) + $z0; // the problem is that the output could be out of range for signed 64-bit ints, @@ -686,15 +774,18 @@ private static function mul64($x, $y) */ // technically upper $z1 is 17 bit - not 16 - but the most significant digit of that will // just get added to $carry - $a = $z0 & 0xffff; - $b = ($z0 >> 16) + ($z1 & 0xffff); - $c = ($z1 >> 16) + ($z2 & 0xffff) + ($b >> 16); - $b = ($b & 0xffff) << 16; + + $a = $z0 & 0xFFFF; + $b = ($z0 >> 16) + ($z1 & 0xFFFF); + $c = ($z1 >> 16) + ($z2 & 0xFFFF) + ($b >> 16); + $b = ($b & 0xFFFF) << 16; $d = ($z2 >> 16) + ($c >> 16); - $c = ($c & 0xffff) << 32; - $d = ($d & 0xffff) << 48; + $c = ($c & 0xFFFF) << 32; + $d = ($d & 0xFFFF) << 48; + return $a | $b | $c | $d; } + /** * 64-bit Addition with 2x 64-bit ints * @@ -713,15 +804,18 @@ private static function add64($x, $y) +upper $y |+lower $y + $carry | */ - $x1 = $x & 0xffffffff; - $x2 = $x >> 32 & 0xffffffff; - $y1 = $y & 0xffffffff; - $y2 = $y >> 32 & 0xffffffff; + $x1 = $x & 0xFFFFFFFF; + $x2 = ($x >> 32) & 0xFFFFFFFF; + $y1 = $y & 0xFFFFFFFF; + $y2 = ($y >> 32) & 0xFFFFFFFF; + $a = $x1 + $y1; - $b = $x2 + $y2 + ($a >> 32) << 32; - $a &= 0xffffffff; + $b = ($x2 + $y2 + ($a >> 32)) << 32; + $a &= 0xFFFFFFFF; + return $a | $b; } + /** * NH Algorithm / 64-bit safe * @@ -734,9 +828,10 @@ private static function nh64($k, $m, $length) // // Break M and K into 4-byte chunks // - $k = \unpack('N*', $k); - $m = \unpack('N*', $m); - $t = \count($m); + $k = unpack('N*', $k); + $m = unpack('N*', $m); + $t = count($m); + // // Perform NH hash on the chunks, pairing words for multiplication // which are 4 apart to accommodate vector-parallelism. @@ -744,22 +839,28 @@ private static function nh64($k, $m, $length) $i = 1; $y = 0; while ($i <= $t) { - $temp = $m[$i] + $k[$i] & 0xffffffff; - $temp2 = $m[$i + 4] + $k[$i + 4] & 0xffffffff; + $temp = ($m[$i] + $k[$i]) & 0xFFFFFFFF; + $temp2 = ($m[$i + 4] + $k[$i + 4]) & 0xFFFFFFFF; $y = self::add64($y, self::mul64($temp, $temp2)); - $temp = $m[$i + 1] + $k[$i + 1] & 0xffffffff; - $temp2 = $m[$i + 5] + $k[$i + 5] & 0xffffffff; + + $temp = ($m[$i + 1] + $k[$i + 1]) & 0xFFFFFFFF; + $temp2 = ($m[$i + 5] + $k[$i + 5]) & 0xFFFFFFFF; $y = self::add64($y, self::mul64($temp, $temp2)); - $temp = $m[$i + 2] + $k[$i + 2] & 0xffffffff; - $temp2 = $m[$i + 6] + $k[$i + 6] & 0xffffffff; + + $temp = ($m[$i + 2] + $k[$i + 2]) & 0xFFFFFFFF; + $temp2 = ($m[$i + 6] + $k[$i + 6]) & 0xFFFFFFFF; $y = self::add64($y, self::mul64($temp, $temp2)); - $temp = $m[$i + 3] + $k[$i + 3] & 0xffffffff; - $temp2 = $m[$i + 7] + $k[$i + 7] & 0xffffffff; + + $temp = ($m[$i + 3] + $k[$i + 3]) & 0xFFFFFFFF; + $temp2 = ($m[$i + 7] + $k[$i + 7]) & 0xFFFFFFFF; $y = self::add64($y, self::mul64($temp, $temp2)); + $i += 8; } - return \pack('J', self::add64($y, $length)); + + return pack('J', self::add64($y, $length)); } + /** * L2-HASH: Second-Layer Hash * @@ -780,33 +881,33 @@ private static function L2Hash($k, $m) // // Extract keys and restrict to special key-sets // - $k64 = $k & "\x01\xff\xff\xff\x01\xff\xff\xff"; + $k64 = $k & "\x01\xFF\xFF\xFF\x01\xFF\xFF\xFF"; $k64 = new BigInteger($k64, 256); - $k128 = \substr($k, 8) & "\x01\xff\xff\xff\x01\xff\xff\xff\x01\xff\xff\xff\x01\xff\xff\xff"; + $k128 = substr($k, 8) & "\x01\xFF\xFF\xFF\x01\xFF\xFF\xFF\x01\xFF\xFF\xFF\x01\xFF\xFF\xFF"; $k128 = new BigInteger($k128, 256); + // // If M is no more than 2^17 bytes, hash under 64-bit prime, // otherwise, hash first 2^17 bytes under 64-bit prime and // remainder under 128-bit prime. // - if (\strlen($m) <= 0x20000) { - // 2^14 64-bit words + if (strlen($m) <= 0x20000) { // 2^14 64-bit words $y = self::poly(64, self::$maxwordrange64, $k64, $m); } else { - $m_1 = \substr($m, 0, 0x20000); - // 1 << 17 - $m_2 = \substr($m, 0x20000) . "\x80"; - $length = \strlen($m_2); - $pad = 16 - $length % 16; + $m_1 = substr($m, 0, 0x20000); // 1 << 17 + $m_2 = substr($m, 0x20000) . "\x80"; + $length = strlen($m_2); + $pad = 16 - ($length % 16); $pad %= 16; - $m_2 = \str_pad($m_2, $length + $pad, "\x00"); - // zeropad + $m_2 = str_pad($m_2, $length + $pad, "\0"); // zeropad $y = self::poly(64, self::$maxwordrange64, $k64, $m_1); - $y = \str_pad($y, 16, "\x00", \STR_PAD_LEFT); + $y = str_pad($y, 16, "\0", STR_PAD_LEFT); $y = self::poly(128, self::$maxwordrange128, $k128, $y . $m_2); } - return \str_pad($y, 16, "\x00", \STR_PAD_LEFT); + + return str_pad($y, 16, "\0", STR_PAD_LEFT); } + /** * POLY Algorithm * @@ -831,11 +932,14 @@ private static function poly($wordbits, $maxwordrange, $k, $m) $offset = self::$offset64; $marker = self::$marker64; } + $k = $factory->newInteger($k); + // // Break M into chunks of length wordbytes bytes // - $m_i = \str_split($m, $wordbytes); + $m_i = str_split($m, $wordbytes); + // // Each input word m is compared with maxwordrange. If not smaller // then 'marker' and (m - offset), both in range, are hashed. @@ -850,8 +954,10 @@ private static function poly($wordbits, $maxwordrange, $k, $m) $y = $k->multiply($y)->add($m); } } + return $y->toBytes(); } + /** * L3-HASH: Third-Layer Hash * @@ -866,16 +972,19 @@ private static function poly($wordbits, $maxwordrange, $k, $m) private static function L3Hash($k1, $k2, $m) { $factory = self::$factory36; + $y = $factory->newInteger(new BigInteger()); for ($i = 0; $i < 8; $i++) { - $m_i = $factory->newInteger(new BigInteger(\substr($m, 2 * $i, 2), 256)); - $k_i = $factory->newInteger(new BigInteger(\substr($k1, 8 * $i, 8), 256)); + $m_i = $factory->newInteger(new BigInteger(substr($m, 2 * $i, 2), 256)); + $k_i = $factory->newInteger(new BigInteger(substr($k1, 8 * $i, 8), 256)); $y = $y->add($m_i->multiply($k_i)); } - $y = \str_pad(\substr($y->toBytes(), -4), 4, "\x00", \STR_PAD_LEFT); + $y = str_pad(substr($y->toBytes(), -4), 4, "\0", STR_PAD_LEFT); $y = $y ^ $k2; + return $y; } + /** * Compute the Hash / HMAC / UMAC. * @@ -888,16 +997,16 @@ public function hash($text) // https://www.rfc-editor.org/rfc/rfc4493.html // https://en.wikipedia.org/wiki/One-key_MAC if ($algo == 'aes_cmac') { - $constZero = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"; + $constZero = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; if ($this->recomputeAESKey) { - if (!\is_string($this->key)) { + if (!is_string($this->key)) { throw new InsufficientSetupException('No key has been set'); } - if (\strlen($this->key) != 16) { + if (strlen($this->key) != 16) { throw new \LengthException('Key must be 16 bytes long'); } // Algorithm Generate_Subkey - $constRb = "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x87"; + $constRb = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x87"; $this->c = new AES('ecb'); $this->c->setKey($this->key); $this->c->disablePadding(); @@ -908,33 +1017,39 @@ public function hash($text) $l = $l->bitwise_leftShift(1)->toBytes(); // make it constant time $k1 = $msb ? $l ^ $constRb : $l | $constZero; + $msb = ($k1 & "\x80") == "\x80"; $k2 = new BigInteger($k1, 256); $k2->setPrecision(128); $k2 = $k2->bitwise_leftShift(1)->toBytes(); // make it constant time $k2 = $msb ? $k2 ^ $constRb : $k2 | $constZero; + $this->k1 = $k1; $this->k2 = $k2; } - $len = \strlen($text); + + $len = strlen($text); $const_Bsize = 16; - $M = \strlen($text) ? \str_split($text, $const_Bsize) : ['']; + $M = strlen($text) ? str_split($text, $const_Bsize) : ['']; + // Step 2 - $n = \ceil($len / $const_Bsize); + $n = ceil($len / $const_Bsize); // Step 3 if ($n == 0) { $n = 1; - $flag = \false; + $flag = false; } else { $flag = $len % $const_Bsize == 0; } // Step 4 - $M_last = $flag ? $M[$n - 1] ^ $k1 : self::OMAC_padding($M[$n - 1], $const_Bsize) ^ $k2; + $M_last = $flag ? + $M[$n - 1] ^ $k1 : + self::OMAC_padding($M[$n - 1], $const_Bsize) ^ $k2; // Step 5 $x = $constZero; // Step 6 - $c =& $this->c; + $c = &$this->c; for ($i = 0; $i < $n - 1; $i++) { $y = $x ^ $M[$i]; $x = $c->encrypt($y); @@ -944,60 +1059,83 @@ public function hash($text) } if ($algo == 'umac') { if ($this->recomputeAESKey) { - if (!\is_string($this->nonce)) { + if (!is_string($this->nonce)) { throw new InsufficientSetupException('No nonce has been set'); } - if (!\is_string($this->key)) { + if (!is_string($this->key)) { throw new InsufficientSetupException('No key has been set'); } - if (\strlen($this->key) != 16) { + if (strlen($this->key) != 16) { throw new \LengthException('Key must be 16 bytes long'); } + if (!isset(self::$maxwordrange64)) { $one = new BigInteger(1); - $prime36 = new BigInteger("\x00\x00\x00\x0f\xff\xff\xff\xfb", 256); + + $prime36 = new BigInteger("\x00\x00\x00\x0F\xFF\xFF\xFF\xFB", 256); self::$factory36 = new PrimeField($prime36); - $prime64 = new BigInteger("\xff\xff\xff\xff\xff\xff\xff\xc5", 256); + + $prime64 = new BigInteger("\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xC5", 256); self::$factory64 = new PrimeField($prime64); - $prime128 = new BigInteger("\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xffa", 256); + + $prime128 = new BigInteger("\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x61", 256); self::$factory128 = new PrimeField($prime128); - self::$offset64 = new BigInteger("\x01\x00\x00\x00\x00\x00\x00\x00\x00", 256); + + self::$offset64 = new BigInteger("\1\0\0\0\0\0\0\0\0", 256); self::$offset64 = self::$factory64->newInteger(self::$offset64->subtract($prime64)); - self::$offset128 = new BigInteger("\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00", 256); + self::$offset128 = new BigInteger("\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 256); self::$offset128 = self::$factory128->newInteger(self::$offset128->subtract($prime128)); + self::$marker64 = self::$factory64->newInteger($prime64->subtract($one)); self::$marker128 = self::$factory128->newInteger($prime128->subtract($one)); + $maxwordrange64 = $one->bitwise_leftShift(64)->subtract($one->bitwise_leftShift(32)); self::$maxwordrange64 = self::$factory64->newInteger($maxwordrange64); + $maxwordrange128 = $one->bitwise_leftShift(128)->subtract($one->bitwise_leftShift(96)); self::$maxwordrange128 = self::$factory128->newInteger($maxwordrange128); } + $this->c = new AES('ctr'); $this->c->disablePadding(); $this->c->setKey($this->key); + $this->pad = $this->pdf(); - $this->recomputeAESKey = \false; + + $this->recomputeAESKey = false; } + $hashedmessage = $this->uhash($text, $this->length); return $hashedmessage ^ $this->pad; } - if (\is_array($algo)) { - if (empty($this->key) || !\is_string($this->key)) { - return \substr($algo($text, ...\array_values($this->parameters)), 0, $this->length); + + if (is_array($algo)) { + if (empty($this->key) || !is_string($this->key)) { + return substr($algo($text, ...array_values($this->parameters)), 0, $this->length); } + // SHA3 HMACs are discussed at https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf#page=30 - $key = \str_pad($this->computedKey, $b, \chr(0)); - $temp = $this->ipad ^ $key; - $temp .= $text; - $temp = \substr($algo($temp, ...\array_values($this->parameters)), 0, $this->length); + + $key = str_pad($this->computedKey, $b, chr(0)); + $temp = $this->ipad ^ $key; + $temp .= $text; + $temp = substr($algo($temp, ...array_values($this->parameters)), 0, $this->length); $output = $this->opad ^ $key; $output .= $temp; - $output = $algo($output, ...\array_values($this->parameters)); - return \substr($output, 0, $this->length); + $output = $algo($output, ...array_values($this->parameters)); + + return substr($output, 0, $this->length); } - $output = !empty($this->key) || \is_string($this->key) ? \hash_hmac($algo, $text, $this->computedKey, \true) : \hash($algo, $text, \true); - return \strlen($output) > $this->length ? \substr($output, 0, $this->length) : $output; + + $output = !empty($this->key) || is_string($this->key) ? + hash_hmac($algo, $text, $this->computedKey, true) : + hash($algo, $text, true); + + return strlen($output) > $this->length + ? substr($output, 0, $this->length) + : $output; } + /** * Returns the hash length (in bits) * @@ -1007,6 +1145,7 @@ public function getLength() { return $this->length << 3; } + /** * Returns the hash length (in bytes) * @@ -1016,6 +1155,7 @@ public function getLengthInBytes() { return $this->length; } + /** * Returns the block length (in bits) * @@ -1025,6 +1165,7 @@ public function getBlockLength() { return $this->blockSize; } + /** * Returns the block length (in bytes) * @@ -1034,6 +1175,7 @@ public function getBlockLengthInBytes() { return $this->blockSize >> 3; } + /** * Pads SHA3 based on the mode * @@ -1045,19 +1187,20 @@ private static function sha3_pad($padLength, $padType) { switch ($padType) { case self::PADDING_KECCAK: - $temp = \chr(0x1) . \str_repeat("\x00", $padLength - 1); - $temp[$padLength - 1] = $temp[$padLength - 1] | \chr(0x80); + $temp = chr(0x01) . str_repeat("\0", $padLength - 1); + $temp[$padLength - 1] = $temp[$padLength - 1] | chr(0x80); return $temp; case self::PADDING_SHAKE: - $temp = \chr(0x1f) . \str_repeat("\x00", $padLength - 1); - $temp[$padLength - 1] = $temp[$padLength - 1] | \chr(0x80); + $temp = chr(0x1F) . str_repeat("\0", $padLength - 1); + $temp[$padLength - 1] = $temp[$padLength - 1] | chr(0x80); return $temp; //case self::PADDING_SHA3: default: // from https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf#page=36 - return $padLength == 1 ? \chr(0x86) : \chr(0x6) . \str_repeat("\x00", $padLength - 2) . \chr(0x80); + return $padLength == 1 ? chr(0x86) : chr(0x06) . str_repeat("\0", $padLength - 2) . chr(0x80); } } + /** * Pure-PHP 32-bit implementation of SHA3 * @@ -1087,15 +1230,25 @@ private static function sha3_pad($padLength, $padType) private static function sha3_32($p, $c, $r, $d, $padType) { $block_size = $r >> 3; - $padLength = $block_size - \strlen($p) % $block_size; + $padLength = $block_size - (strlen($p) % $block_size); $num_ints = $block_size >> 2; + $p .= static::sha3_pad($padLength, $padType); - $n = \strlen($p) / $r; - // number of blocks - $s = [[[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]]]; - $p = \str_split($p, $block_size); + + $n = strlen($p) / $r; // number of blocks + + $s = [ + [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], + [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], + [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], + [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], + [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]] + ]; + + $p = str_split($p, $block_size); + foreach ($p as $pi) { - $pi = \unpack('V*', $pi); + $pi = unpack('V*', $pi); $x = $y = 0; for ($i = 1; $i <= $num_ints; $i += 2) { $s[$x][$y][0] ^= $pi[$i + 1]; @@ -1107,10 +1260,11 @@ private static function sha3_32($p, $c, $r, $d, $padType) } static::processSHA3Block32($s); } + $z = ''; $i = $j = 0; - while (\strlen($z) < $d) { - $z .= \pack('V2', $s[$i][$j][1], $s[$i][$j++][0]); + while (strlen($z) < $d) { + $z .= pack('V2', $s[$i][$j][1], $s[$i][$j++][0]); if ($j == 5) { $j = 0; $i++; @@ -1120,8 +1274,10 @@ private static function sha3_32($p, $c, $r, $d, $padType) } } } + return $z; } + /** * 32-bit block processing method for SHA3 * @@ -1129,45 +1285,108 @@ private static function sha3_32($p, $c, $r, $d, $padType) */ private static function processSHA3Block32(&$s) { - static $rotationOffsets = [[0, 1, 62, 28, 27], [36, 44, 6, 55, 20], [3, 10, 43, 25, 39], [41, 45, 15, 21, 8], [18, 2, 61, 56, 14]]; + static $rotationOffsets = [ + [ 0, 1, 62, 28, 27], + [36, 44, 6, 55, 20], + [ 3, 10, 43, 25, 39], + [41, 45, 15, 21, 8], + [18, 2, 61, 56, 14] + ]; + // the standards give these constants in hexadecimal notation. it's tempting to want to use // that same notation, here, however, we can't, because 0x80000000, on PHP32, is a positive // float - not the negative int that we need to be in PHP32. so we use -2147483648 instead - static $roundConstants = [[0, 1], [0, 32898], [-2147483648, 32906], [-2147483648, -2147450880], [0, 32907], [0, -2147483647], [-2147483648, -2147450751], [-2147483648, 32777], [0, 138], [0, 136], [0, -2147450871], [0, -2147483638], [0, -2147450741], [-2147483648, 139], [-2147483648, 32905], [-2147483648, 32771], [-2147483648, 32770], [-2147483648, 128], [0, 32778], [-2147483648, -2147483638], [-2147483648, -2147450751], [-2147483648, 32896], [0, -2147483647], [-2147483648, -2147450872]]; + static $roundConstants = [ + [0, 1], + [0, 32898], + [-2147483648, 32906], + [-2147483648, -2147450880], + [0, 32907], + [0, -2147483647], + [-2147483648, -2147450751], + [-2147483648, 32777], + [0, 138], + [0, 136], + [0, -2147450871], + [0, -2147483638], + [0, -2147450741], + [-2147483648, 139], + [-2147483648, 32905], + [-2147483648, 32771], + [-2147483648, 32770], + [-2147483648, 128], + [0, 32778], + [-2147483648, -2147483638], + [-2147483648, -2147450751], + [-2147483648, 32896], + [0, -2147483647], + [-2147483648, -2147450872] + ]; + for ($round = 0; $round < 24; $round++) { // theta step $parity = $rotated = []; for ($i = 0; $i < 5; $i++) { - $parity[] = [$s[0][$i][0] ^ $s[1][$i][0] ^ $s[2][$i][0] ^ $s[3][$i][0] ^ $s[4][$i][0], $s[0][$i][1] ^ $s[1][$i][1] ^ $s[2][$i][1] ^ $s[3][$i][1] ^ $s[4][$i][1]]; + $parity[] = [ + $s[0][$i][0] ^ $s[1][$i][0] ^ $s[2][$i][0] ^ $s[3][$i][0] ^ $s[4][$i][0], + $s[0][$i][1] ^ $s[1][$i][1] ^ $s[2][$i][1] ^ $s[3][$i][1] ^ $s[4][$i][1] + ]; $rotated[] = static::rotateLeft32($parity[$i], 1); } - $temp = [[$parity[4][0] ^ $rotated[1][0], $parity[4][1] ^ $rotated[1][1]], [$parity[0][0] ^ $rotated[2][0], $parity[0][1] ^ $rotated[2][1]], [$parity[1][0] ^ $rotated[3][0], $parity[1][1] ^ $rotated[3][1]], [$parity[2][0] ^ $rotated[4][0], $parity[2][1] ^ $rotated[4][1]], [$parity[3][0] ^ $rotated[0][0], $parity[3][1] ^ $rotated[0][1]]]; + + $temp = [ + [$parity[4][0] ^ $rotated[1][0], $parity[4][1] ^ $rotated[1][1]], + [$parity[0][0] ^ $rotated[2][0], $parity[0][1] ^ $rotated[2][1]], + [$parity[1][0] ^ $rotated[3][0], $parity[1][1] ^ $rotated[3][1]], + [$parity[2][0] ^ $rotated[4][0], $parity[2][1] ^ $rotated[4][1]], + [$parity[3][0] ^ $rotated[0][0], $parity[3][1] ^ $rotated[0][1]] + ]; for ($i = 0; $i < 5; $i++) { for ($j = 0; $j < 5; $j++) { $s[$i][$j][0] ^= $temp[$j][0]; $s[$i][$j][1] ^= $temp[$j][1]; } } + $st = $s; + // rho and pi steps for ($i = 0; $i < 5; $i++) { for ($j = 0; $j < 5; $j++) { $st[(2 * $i + 3 * $j) % 5][$j] = static::rotateLeft32($s[$j][$i], $rotationOffsets[$j][$i]); } } + // chi step for ($i = 0; $i < 5; $i++) { - $s[$i][0] = [$st[$i][0][0] ^ ~$st[$i][1][0] & $st[$i][2][0], $st[$i][0][1] ^ ~$st[$i][1][1] & $st[$i][2][1]]; - $s[$i][1] = [$st[$i][1][0] ^ ~$st[$i][2][0] & $st[$i][3][0], $st[$i][1][1] ^ ~$st[$i][2][1] & $st[$i][3][1]]; - $s[$i][2] = [$st[$i][2][0] ^ ~$st[$i][3][0] & $st[$i][4][0], $st[$i][2][1] ^ ~$st[$i][3][1] & $st[$i][4][1]]; - $s[$i][3] = [$st[$i][3][0] ^ ~$st[$i][4][0] & $st[$i][0][0], $st[$i][3][1] ^ ~$st[$i][4][1] & $st[$i][0][1]]; - $s[$i][4] = [$st[$i][4][0] ^ ~$st[$i][0][0] & $st[$i][1][0], $st[$i][4][1] ^ ~$st[$i][0][1] & $st[$i][1][1]]; + $s[$i][0] = [ + $st[$i][0][0] ^ (~$st[$i][1][0] & $st[$i][2][0]), + $st[$i][0][1] ^ (~$st[$i][1][1] & $st[$i][2][1]) + ]; + $s[$i][1] = [ + $st[$i][1][0] ^ (~$st[$i][2][0] & $st[$i][3][0]), + $st[$i][1][1] ^ (~$st[$i][2][1] & $st[$i][3][1]) + ]; + $s[$i][2] = [ + $st[$i][2][0] ^ (~$st[$i][3][0] & $st[$i][4][0]), + $st[$i][2][1] ^ (~$st[$i][3][1] & $st[$i][4][1]) + ]; + $s[$i][3] = [ + $st[$i][3][0] ^ (~$st[$i][4][0] & $st[$i][0][0]), + $st[$i][3][1] ^ (~$st[$i][4][1] & $st[$i][0][1]) + ]; + $s[$i][4] = [ + $st[$i][4][0] ^ (~$st[$i][0][0] & $st[$i][1][0]), + $st[$i][4][1] ^ (~$st[$i][0][1] & $st[$i][1][1]) + ]; } + // iota step $s[0][0][0] ^= $roundConstants[$round][0]; $s[0][0][1] ^= $roundConstants[$round][1]; } } + /** * Rotate 32-bit int * @@ -1182,9 +1401,14 @@ private static function rotateLeft32($x, $shift) $shift -= 32; list($lo, $hi) = $x; } - $mask = -1 ^ -1 << $shift; - return [$hi << $shift | $lo >> 32 - $shift & $mask, $lo << $shift | $hi >> 32 - $shift & $mask]; + + $mask = -1 ^ (-1 << $shift); + return [ + ($hi << $shift) | (($lo >> (32 - $shift)) & $mask), + ($lo << $shift) | (($hi >> (32 - $shift)) & $mask) + ]; } + /** * Pure-PHP 64-bit implementation of SHA3 * @@ -1197,15 +1421,25 @@ private static function rotateLeft32($x, $shift) private static function sha3_64($p, $c, $r, $d, $padType) { $block_size = $r >> 3; - $padLength = $block_size - \strlen($p) % $block_size; + $padLength = $block_size - (strlen($p) % $block_size); $num_ints = $block_size >> 2; + $p .= static::sha3_pad($padLength, $padType); - $n = \strlen($p) / $r; - // number of blocks - $s = [[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]]; - $p = \str_split($p, $block_size); + + $n = strlen($p) / $r; // number of blocks + + $s = [ + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0], + [0, 0, 0, 0, 0] + ]; + + $p = str_split($p, $block_size); + foreach ($p as $pi) { - $pi = \unpack('P*', $pi); + $pi = unpack('P*', $pi); $x = $y = 0; foreach ($pi as $subpi) { $s[$x][$y++] ^= $subpi; @@ -1216,10 +1450,11 @@ private static function sha3_64($p, $c, $r, $d, $padType) } static::processSHA3Block64($s); } + $z = ''; $i = $j = 0; - while (\strlen($z) < $d) { - $z .= \pack('P', $s[$i][$j++]); + while (strlen($z) < $d) { + $z .= pack('P', $s[$i][$j++]); if ($j == 5) { $j = 0; $i++; @@ -1229,8 +1464,10 @@ private static function sha3_64($p, $c, $r, $d, $padType) } } } + return $z; } + /** * 64-bit block processing method for SHA3 * @@ -1238,35 +1475,85 @@ private static function sha3_64($p, $c, $r, $d, $padType) */ private static function processSHA3Block64(&$s) { - static $rotationOffsets = [[0, 1, 62, 28, 27], [36, 44, 6, 55, 20], [3, 10, 43, 25, 39], [41, 45, 15, 21, 8], [18, 2, 61, 56, 14]]; - static $roundConstants = [1, 32898, -9223372036854742902, -9223372034707259392, 32907, 2147483649, -9223372034707259263, -9223372036854743031, 138, 136, 2147516425, 2147483658, 2147516555, -9223372036854775669, -9223372036854742903, -9223372036854743037, -9223372036854743038, -9223372036854775680, 32778, -9223372034707292150, -9223372034707259263, -9223372036854742912, 2147483649, -9223372034707259384]; + static $rotationOffsets = [ + [ 0, 1, 62, 28, 27], + [36, 44, 6, 55, 20], + [ 3, 10, 43, 25, 39], + [41, 45, 15, 21, 8], + [18, 2, 61, 56, 14] + ]; + + static $roundConstants = [ + 1, + 32898, + -9223372036854742902, + -9223372034707259392, + 32907, + 2147483649, + -9223372034707259263, + -9223372036854743031, + 138, + 136, + 2147516425, + 2147483658, + 2147516555, + -9223372036854775669, + -9223372036854742903, + -9223372036854743037, + -9223372036854743038, + -9223372036854775680, + 32778, + -9223372034707292150, + -9223372034707259263, + -9223372036854742912, + 2147483649, + -9223372034707259384 + ]; + for ($round = 0; $round < 24; $round++) { // theta step $parity = []; for ($i = 0; $i < 5; $i++) { $parity[] = $s[0][$i] ^ $s[1][$i] ^ $s[2][$i] ^ $s[3][$i] ^ $s[4][$i]; } - $temp = [$parity[4] ^ static::rotateLeft64($parity[1], 1), $parity[0] ^ static::rotateLeft64($parity[2], 1), $parity[1] ^ static::rotateLeft64($parity[3], 1), $parity[2] ^ static::rotateLeft64($parity[4], 1), $parity[3] ^ static::rotateLeft64($parity[0], 1)]; + $temp = [ + $parity[4] ^ static::rotateLeft64($parity[1], 1), + $parity[0] ^ static::rotateLeft64($parity[2], 1), + $parity[1] ^ static::rotateLeft64($parity[3], 1), + $parity[2] ^ static::rotateLeft64($parity[4], 1), + $parity[3] ^ static::rotateLeft64($parity[0], 1) + ]; for ($i = 0; $i < 5; $i++) { for ($j = 0; $j < 5; $j++) { $s[$i][$j] ^= $temp[$j]; } } + $st = $s; + // rho and pi steps for ($i = 0; $i < 5; $i++) { for ($j = 0; $j < 5; $j++) { $st[(2 * $i + 3 * $j) % 5][$j] = static::rotateLeft64($s[$j][$i], $rotationOffsets[$j][$i]); } } + // chi step for ($i = 0; $i < 5; $i++) { - $s[$i] = [$st[$i][0] ^ ~$st[$i][1] & $st[$i][2], $st[$i][1] ^ ~$st[$i][2] & $st[$i][3], $st[$i][2] ^ ~$st[$i][3] & $st[$i][4], $st[$i][3] ^ ~$st[$i][4] & $st[$i][0], $st[$i][4] ^ ~$st[$i][0] & $st[$i][1]]; + $s[$i] = [ + $st[$i][0] ^ (~$st[$i][1] & $st[$i][2]), + $st[$i][1] ^ (~$st[$i][2] & $st[$i][3]), + $st[$i][2] ^ (~$st[$i][3] & $st[$i][4]), + $st[$i][3] ^ (~$st[$i][4] & $st[$i][0]), + $st[$i][4] ^ (~$st[$i][0] & $st[$i][1]) + ]; } + // iota step $s[0][0] ^= $roundConstants[$round]; } } + /** * Left rotate 64-bit int * @@ -1275,9 +1562,10 @@ private static function processSHA3Block64(&$s) */ private static function rotateLeft64($x, $shift) { - $mask = -1 ^ -1 << $shift; - return $x << $shift | $x >> 64 - $shift & $mask; + $mask = -1 ^ (-1 << $shift); + return ($x << $shift) | (($x >> (64 - $shift)) & $mask); } + /** * Right rotate 64-bit int * @@ -1286,9 +1574,10 @@ private static function rotateLeft64($x, $shift) */ private static function rotateRight64($x, $shift) { - $mask = -1 ^ -1 << 64 - $shift; - return $x >> $shift & $mask | $x << 64 - $shift; + $mask = -1 ^ (-1 << (64 - $shift)); + return (($x >> $shift) & $mask) | ($x << (64 - $shift)); } + /** * Pure-PHP implementation of SHA512 * @@ -1299,23 +1588,48 @@ private static function rotateRight64($x, $shift) private static function sha512($m, $hash) { static $k; + if (!isset($k)) { // Initialize table of round constants // (first 64 bits of the fractional parts of the cube roots of the first 80 primes 2..409) - $k = ['428a2f98d728ae22', '7137449123ef65cd', 'b5c0fbcfec4d3b2f', 'e9b5dba58189dbbc', '3956c25bf348b538', '59f111f1b605d019', '923f82a4af194f9b', 'ab1c5ed5da6d8118', 'd807aa98a3030242', '12835b0145706fbe', '243185be4ee4b28c', '550c7dc3d5ffb4e2', '72be5d74f27b896f', '80deb1fe3b1696b1', '9bdc06a725c71235', 'c19bf174cf692694', 'e49b69c19ef14ad2', 'efbe4786384f25e3', '0fc19dc68b8cd5b5', '240ca1cc77ac9c65', '2de92c6f592b0275', '4a7484aa6ea6e483', '5cb0a9dcbd41fbd4', '76f988da831153b5', '983e5152ee66dfab', 'a831c66d2db43210', 'b00327c898fb213f', 'bf597fc7beef0ee4', 'c6e00bf33da88fc2', 'd5a79147930aa725', '06ca6351e003826f', '142929670a0e6e70', '27b70a8546d22ffc', '2e1b21385c26c926', '4d2c6dfc5ac42aed', '53380d139d95b3df', '650a73548baf63de', '766a0abb3c77b2a8', '81c2c92e47edaee6', '92722c851482353b', 'a2bfe8a14cf10364', 'a81a664bbc423001', 'c24b8b70d0f89791', 'c76c51a30654be30', 'd192e819d6ef5218', 'd69906245565a910', 'f40e35855771202a', '106aa07032bbd1b8', '19a4c116b8d2d0c8', '1e376c085141ab53', '2748774cdf8eeb99', '34b0bcb5e19b48a8', '391c0cb3c5c95a63', '4ed8aa4ae3418acb', '5b9cca4f7763e373', '682e6ff3d6b2b8a3', '748f82ee5defb2fc', '78a5636f43172f60', '84c87814a1f0ab72', '8cc702081a6439ec', '90befffa23631e28', 'a4506cebde82bde9', 'bef9a3f7b2c67915', 'c67178f2e372532b', 'ca273eceea26619c', 'd186b8c721c0c207', 'eada7dd6cde0eb1e', 'f57d4f7fee6ed178', '06f067aa72176fba', '0a637dc5a2c898a6', '113f9804bef90dae', '1b710b35131c471b', '28db77f523047d84', '32caab7b40c72493', '3c9ebe0a15c9bebc', '431d67c49c100d4c', '4cc5d4becb3e42b6', '597f299cfc657e2a', '5fcb6fab3ad6faec', '6c44198c4a475817']; + $k = [ + '428a2f98d728ae22', '7137449123ef65cd', 'b5c0fbcfec4d3b2f', 'e9b5dba58189dbbc', + '3956c25bf348b538', '59f111f1b605d019', '923f82a4af194f9b', 'ab1c5ed5da6d8118', + 'd807aa98a3030242', '12835b0145706fbe', '243185be4ee4b28c', '550c7dc3d5ffb4e2', + '72be5d74f27b896f', '80deb1fe3b1696b1', '9bdc06a725c71235', 'c19bf174cf692694', + 'e49b69c19ef14ad2', 'efbe4786384f25e3', '0fc19dc68b8cd5b5', '240ca1cc77ac9c65', + '2de92c6f592b0275', '4a7484aa6ea6e483', '5cb0a9dcbd41fbd4', '76f988da831153b5', + '983e5152ee66dfab', 'a831c66d2db43210', 'b00327c898fb213f', 'bf597fc7beef0ee4', + 'c6e00bf33da88fc2', 'd5a79147930aa725', '06ca6351e003826f', '142929670a0e6e70', + '27b70a8546d22ffc', '2e1b21385c26c926', '4d2c6dfc5ac42aed', '53380d139d95b3df', + '650a73548baf63de', '766a0abb3c77b2a8', '81c2c92e47edaee6', '92722c851482353b', + 'a2bfe8a14cf10364', 'a81a664bbc423001', 'c24b8b70d0f89791', 'c76c51a30654be30', + 'd192e819d6ef5218', 'd69906245565a910', 'f40e35855771202a', '106aa07032bbd1b8', + '19a4c116b8d2d0c8', '1e376c085141ab53', '2748774cdf8eeb99', '34b0bcb5e19b48a8', + '391c0cb3c5c95a63', '4ed8aa4ae3418acb', '5b9cca4f7763e373', '682e6ff3d6b2b8a3', + '748f82ee5defb2fc', '78a5636f43172f60', '84c87814a1f0ab72', '8cc702081a6439ec', + '90befffa23631e28', 'a4506cebde82bde9', 'bef9a3f7b2c67915', 'c67178f2e372532b', + 'ca273eceea26619c', 'd186b8c721c0c207', 'eada7dd6cde0eb1e', 'f57d4f7fee6ed178', + '06f067aa72176fba', '0a637dc5a2c898a6', '113f9804bef90dae', '1b710b35131c471b', + '28db77f523047d84', '32caab7b40c72493', '3c9ebe0a15c9bebc', '431d67c49c100d4c', + '4cc5d4becb3e42b6', '597f299cfc657e2a', '5fcb6fab3ad6faec', '6c44198c4a475817' + ]; + for ($i = 0; $i < 80; $i++) { $k[$i] = new BigInteger($k[$i], 16); } } + // Pre-processing - $length = \strlen($m); + $length = strlen($m); // to round to nearest 112 mod 128, we'll add 128 - (length + (128 - 112)) % 128 - $m .= \str_repeat(\chr(0), 128 - ($length + 16 & 0x7f)); - $m[$length] = \chr(0x80); + $m .= str_repeat(chr(0), 128 - (($length + 16) & 0x7F)); + $m[$length] = chr(0x80); // we don't support hashing strings 512MB long - $m .= \pack('N4', 0, 0, 0, $length << 3); + $m .= pack('N4', 0, 0, 0, $length << 3); + // Process the message in successive 1024-bit chunks - $chunks = \str_split($m, 128); + $chunks = str_split($m, 128); foreach ($chunks as $chunk) { $w = []; for ($i = 0; $i < 16; $i++) { @@ -1323,12 +1637,21 @@ private static function sha512($m, $hash) $temp->setPrecision(64); $w[] = $temp; } + // Extend the sixteen 32-bit words into eighty 32-bit words for ($i = 16; $i < 80; $i++) { - $temp = [$w[$i - 15]->bitwise_rightRotate(1), $w[$i - 15]->bitwise_rightRotate(8), $w[$i - 15]->bitwise_rightShift(7)]; + $temp = [ + $w[$i - 15]->bitwise_rightRotate(1), + $w[$i - 15]->bitwise_rightRotate(8), + $w[$i - 15]->bitwise_rightShift(7) + ]; $s0 = $temp[0]->bitwise_xor($temp[1]); $s0 = $s0->bitwise_xor($temp[2]); - $temp = [$w[$i - 2]->bitwise_rightRotate(19), $w[$i - 2]->bitwise_rightRotate(61), $w[$i - 2]->bitwise_rightShift(6)]; + $temp = [ + $w[$i - 2]->bitwise_rightRotate(19), + $w[$i - 2]->bitwise_rightRotate(61), + $w[$i - 2]->bitwise_rightShift(6) + ]; $s1 = $temp[0]->bitwise_xor($temp[1]); $s1 = $s1->bitwise_xor($temp[2]); $w[$i] = clone $w[$i - 16]; @@ -1336,6 +1659,7 @@ private static function sha512($m, $hash) $w[$i] = $w[$i]->add($w[$i - 7]); $w[$i] = $w[$i]->add($s1); } + // Initialize hash value for this chunk $a = clone $hash[0]; $b = clone $hash[1]; @@ -1345,24 +1669,42 @@ private static function sha512($m, $hash) $f = clone $hash[5]; $g = clone $hash[6]; $h = clone $hash[7]; + // Main loop for ($i = 0; $i < 80; $i++) { - $temp = [$a->bitwise_rightRotate(28), $a->bitwise_rightRotate(34), $a->bitwise_rightRotate(39)]; + $temp = [ + $a->bitwise_rightRotate(28), + $a->bitwise_rightRotate(34), + $a->bitwise_rightRotate(39) + ]; $s0 = $temp[0]->bitwise_xor($temp[1]); $s0 = $s0->bitwise_xor($temp[2]); - $temp = [$a->bitwise_and($b), $a->bitwise_and($c), $b->bitwise_and($c)]; + $temp = [ + $a->bitwise_and($b), + $a->bitwise_and($c), + $b->bitwise_and($c) + ]; $maj = $temp[0]->bitwise_xor($temp[1]); $maj = $maj->bitwise_xor($temp[2]); $t2 = $s0->add($maj); - $temp = [$e->bitwise_rightRotate(14), $e->bitwise_rightRotate(18), $e->bitwise_rightRotate(41)]; + + $temp = [ + $e->bitwise_rightRotate(14), + $e->bitwise_rightRotate(18), + $e->bitwise_rightRotate(41) + ]; $s1 = $temp[0]->bitwise_xor($temp[1]); $s1 = $s1->bitwise_xor($temp[2]); - $temp = [$e->bitwise_and($f), $g->bitwise_and($e->bitwise_not())]; + $temp = [ + $e->bitwise_and($f), + $g->bitwise_and($e->bitwise_not()) + ]; $ch = $temp[0]->bitwise_xor($temp[1]); $t1 = $h->add($s1); $t1 = $t1->add($ch); $t1 = $t1->add($k[$i]); $t1 = $t1->add($w[$i]); + $h = clone $g; $g = clone $f; $f = clone $e; @@ -1372,14 +1714,28 @@ private static function sha512($m, $hash) $b = clone $a; $a = $t1->add($t2); } + // Add this chunk's hash to result so far - $hash = [$hash[0]->add($a), $hash[1]->add($b), $hash[2]->add($c), $hash[3]->add($d), $hash[4]->add($e), $hash[5]->add($f), $hash[6]->add($g), $hash[7]->add($h)]; + $hash = [ + $hash[0]->add($a), + $hash[1]->add($b), + $hash[2]->add($c), + $hash[3]->add($d), + $hash[4]->add($e), + $hash[5]->add($f), + $hash[6]->add($g), + $hash[7]->add($h) + ]; } + // Produce the final hash value (big-endian) // (\phpseclib3\Crypt\Hash::hash() trims the output for hashes but not for HMACs. as such, we trim the output here) - $temp = $hash[0]->toBytes() . $hash[1]->toBytes() . $hash[2]->toBytes() . $hash[3]->toBytes() . $hash[4]->toBytes() . $hash[5]->toBytes() . $hash[6]->toBytes() . $hash[7]->toBytes(); + $temp = $hash[0]->toBytes() . $hash[1]->toBytes() . $hash[2]->toBytes() . $hash[3]->toBytes() . + $hash[4]->toBytes() . $hash[5]->toBytes() . $hash[6]->toBytes() . $hash[7]->toBytes(); + return $temp; } + /** * Pure-PHP implementation of SHA512 * @@ -1390,55 +1746,102 @@ private static function sha512($m, $hash) private static function sha512_64($m, $hash) { static $k; + if (!isset($k)) { // Initialize table of round constants // (first 64 bits of the fractional parts of the cube roots of the first 80 primes 2..409) - $k = ['428a2f98d728ae22', '7137449123ef65cd', 'b5c0fbcfec4d3b2f', 'e9b5dba58189dbbc', '3956c25bf348b538', '59f111f1b605d019', '923f82a4af194f9b', 'ab1c5ed5da6d8118', 'd807aa98a3030242', '12835b0145706fbe', '243185be4ee4b28c', '550c7dc3d5ffb4e2', '72be5d74f27b896f', '80deb1fe3b1696b1', '9bdc06a725c71235', 'c19bf174cf692694', 'e49b69c19ef14ad2', 'efbe4786384f25e3', '0fc19dc68b8cd5b5', '240ca1cc77ac9c65', '2de92c6f592b0275', '4a7484aa6ea6e483', '5cb0a9dcbd41fbd4', '76f988da831153b5', '983e5152ee66dfab', 'a831c66d2db43210', 'b00327c898fb213f', 'bf597fc7beef0ee4', 'c6e00bf33da88fc2', 'd5a79147930aa725', '06ca6351e003826f', '142929670a0e6e70', '27b70a8546d22ffc', '2e1b21385c26c926', '4d2c6dfc5ac42aed', '53380d139d95b3df', '650a73548baf63de', '766a0abb3c77b2a8', '81c2c92e47edaee6', '92722c851482353b', 'a2bfe8a14cf10364', 'a81a664bbc423001', 'c24b8b70d0f89791', 'c76c51a30654be30', 'd192e819d6ef5218', 'd69906245565a910', 'f40e35855771202a', '106aa07032bbd1b8', '19a4c116b8d2d0c8', '1e376c085141ab53', '2748774cdf8eeb99', '34b0bcb5e19b48a8', '391c0cb3c5c95a63', '4ed8aa4ae3418acb', '5b9cca4f7763e373', '682e6ff3d6b2b8a3', '748f82ee5defb2fc', '78a5636f43172f60', '84c87814a1f0ab72', '8cc702081a6439ec', '90befffa23631e28', 'a4506cebde82bde9', 'bef9a3f7b2c67915', 'c67178f2e372532b', 'ca273eceea26619c', 'd186b8c721c0c207', 'eada7dd6cde0eb1e', 'f57d4f7fee6ed178', '06f067aa72176fba', '0a637dc5a2c898a6', '113f9804bef90dae', '1b710b35131c471b', '28db77f523047d84', '32caab7b40c72493', '3c9ebe0a15c9bebc', '431d67c49c100d4c', '4cc5d4becb3e42b6', '597f299cfc657e2a', '5fcb6fab3ad6faec', '6c44198c4a475817']; + $k = [ + '428a2f98d728ae22', '7137449123ef65cd', 'b5c0fbcfec4d3b2f', 'e9b5dba58189dbbc', + '3956c25bf348b538', '59f111f1b605d019', '923f82a4af194f9b', 'ab1c5ed5da6d8118', + 'd807aa98a3030242', '12835b0145706fbe', '243185be4ee4b28c', '550c7dc3d5ffb4e2', + '72be5d74f27b896f', '80deb1fe3b1696b1', '9bdc06a725c71235', 'c19bf174cf692694', + 'e49b69c19ef14ad2', 'efbe4786384f25e3', '0fc19dc68b8cd5b5', '240ca1cc77ac9c65', + '2de92c6f592b0275', '4a7484aa6ea6e483', '5cb0a9dcbd41fbd4', '76f988da831153b5', + '983e5152ee66dfab', 'a831c66d2db43210', 'b00327c898fb213f', 'bf597fc7beef0ee4', + 'c6e00bf33da88fc2', 'd5a79147930aa725', '06ca6351e003826f', '142929670a0e6e70', + '27b70a8546d22ffc', '2e1b21385c26c926', '4d2c6dfc5ac42aed', '53380d139d95b3df', + '650a73548baf63de', '766a0abb3c77b2a8', '81c2c92e47edaee6', '92722c851482353b', + 'a2bfe8a14cf10364', 'a81a664bbc423001', 'c24b8b70d0f89791', 'c76c51a30654be30', + 'd192e819d6ef5218', 'd69906245565a910', 'f40e35855771202a', '106aa07032bbd1b8', + '19a4c116b8d2d0c8', '1e376c085141ab53', '2748774cdf8eeb99', '34b0bcb5e19b48a8', + '391c0cb3c5c95a63', '4ed8aa4ae3418acb', '5b9cca4f7763e373', '682e6ff3d6b2b8a3', + '748f82ee5defb2fc', '78a5636f43172f60', '84c87814a1f0ab72', '8cc702081a6439ec', + '90befffa23631e28', 'a4506cebde82bde9', 'bef9a3f7b2c67915', 'c67178f2e372532b', + 'ca273eceea26619c', 'd186b8c721c0c207', 'eada7dd6cde0eb1e', 'f57d4f7fee6ed178', + '06f067aa72176fba', '0a637dc5a2c898a6', '113f9804bef90dae', '1b710b35131c471b', + '28db77f523047d84', '32caab7b40c72493', '3c9ebe0a15c9bebc', '431d67c49c100d4c', + '4cc5d4becb3e42b6', '597f299cfc657e2a', '5fcb6fab3ad6faec', '6c44198c4a475817' + ]; + for ($i = 0; $i < 80; $i++) { - list(, $k[$i]) = \unpack('J', \pack('H*', $k[$i])); + list(, $k[$i]) = unpack('J', pack('H*', $k[$i])); } } + // Pre-processing - $length = \strlen($m); + $length = strlen($m); // to round to nearest 112 mod 128, we'll add 128 - (length + (128 - 112)) % 128 - $m .= \str_repeat(\chr(0), 128 - ($length + 16 & 0x7f)); - $m[$length] = \chr(0x80); + $m .= str_repeat(chr(0), 128 - (($length + 16) & 0x7F)); + $m[$length] = chr(0x80); // we don't support hashing strings 512MB long - $m .= \pack('N4', 0, 0, 0, $length << 3); + $m .= pack('N4', 0, 0, 0, $length << 3); + // Process the message in successive 1024-bit chunks - $chunks = \str_split($m, 128); + $chunks = str_split($m, 128); foreach ($chunks as $chunk) { $w = []; for ($i = 0; $i < 16; $i++) { - list(, $w[]) = \unpack('J', Strings::shift($chunk, 8)); + list(, $w[]) = unpack('J', Strings::shift($chunk, 8)); } + // Extend the sixteen 32-bit words into eighty 32-bit words for ($i = 16; $i < 80; $i++) { - $temp = [self::rotateRight64($w[$i - 15], 1), self::rotateRight64($w[$i - 15], 8), $w[$i - 15] >> 7 & 0x1ffffffffffffff]; + $temp = [ + self::rotateRight64($w[$i - 15], 1), + self::rotateRight64($w[$i - 15], 8), + ($w[$i - 15] >> 7) & 0x01FFFFFFFFFFFFFF, + ]; $s0 = $temp[0] ^ $temp[1] ^ $temp[2]; - $temp = [self::rotateRight64($w[$i - 2], 19), self::rotateRight64($w[$i - 2], 61), $w[$i - 2] >> 6 & 0x3ffffffffffffff]; + $temp = [ + self::rotateRight64($w[$i - 2], 19), + self::rotateRight64($w[$i - 2], 61), + ($w[$i - 2] >> 6) & 0x03FFFFFFFFFFFFFF, + ]; $s1 = $temp[0] ^ $temp[1] ^ $temp[2]; + $w[$i] = $w[$i - 16]; $w[$i] = self::add64($w[$i], $s0); $w[$i] = self::add64($w[$i], $w[$i - 7]); $w[$i] = self::add64($w[$i], $s1); } + // Initialize hash value for this chunk list($a, $b, $c, $d, $e, $f, $g, $h) = $hash; + // Main loop for ($i = 0; $i < 80; $i++) { - $temp = [self::rotateRight64($a, 28), self::rotateRight64($a, 34), self::rotateRight64($a, 39)]; + $temp = [ + self::rotateRight64($a, 28), + self::rotateRight64($a, 34), + self::rotateRight64($a, 39), + ]; $s0 = $temp[0] ^ $temp[1] ^ $temp[2]; $temp = [$a & $b, $a & $c, $b & $c]; $maj = $temp[0] ^ $temp[1] ^ $temp[2]; $t2 = self::add64($s0, $maj); - $temp = [self::rotateRight64($e, 14), self::rotateRight64($e, 18), self::rotateRight64($e, 41)]; + + $temp = [ + self::rotateRight64($e, 14), + self::rotateRight64($e, 18), + self::rotateRight64($e, 41), + ]; $s1 = $temp[0] ^ $temp[1] ^ $temp[2]; - $ch = $e & $f ^ $g & ~$e; + $ch = ($e & $f) ^ ($g & ~$e); $t1 = self::add64($h, $s1); $t1 = self::add64($t1, $ch); $t1 = self::add64($t1, $k[$i]); $t1 = self::add64($t1, $w[$i]); + $h = $g; $g = $f; $f = $e; @@ -1448,13 +1851,25 @@ private static function sha512_64($m, $hash) $b = $a; $a = self::add64($t1, $t2); } + // Add this chunk's hash to result so far - $hash = [self::add64($hash[0], $a), self::add64($hash[1], $b), self::add64($hash[2], $c), self::add64($hash[3], $d), self::add64($hash[4], $e), self::add64($hash[5], $f), self::add64($hash[6], $g), self::add64($hash[7], $h)]; + $hash = [ + self::add64($hash[0], $a), + self::add64($hash[1], $b), + self::add64($hash[2], $c), + self::add64($hash[3], $d), + self::add64($hash[4], $e), + self::add64($hash[5], $f), + self::add64($hash[6], $g), + self::add64($hash[7], $h), + ]; } + // Produce the final hash value (big-endian) // (\phpseclib3\Crypt\Hash::hash() trims the output for hashes but not for HMACs. as such, we trim the output here) - return \pack('J*', ...$hash); + return pack('J*', ...$hash); } + /** * OMAC Padding * @@ -1462,9 +1877,10 @@ private static function sha512_64($m, $hash) */ private static function OMAC_padding($m, $length) { - $count = $length - \strlen($m) - 1; - return "{$m}\x80" . \str_repeat("\x00", $count); + $count = $length - strlen($m) - 1; + return "$m\x80" . str_repeat("\0", $count); } + /** * __toString() magic method */ diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/PublicKeyLoader.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/PublicKeyLoader.php index b2e7be1..4c75bcc 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/PublicKeyLoader.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/PublicKeyLoader.php @@ -10,6 +10,7 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt; use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\AsymmetricKey; @@ -17,11 +18,11 @@ use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\PublicKey; use OCA\Libresign\Vendor\phpseclib3\Exception\NoKeyLoadedException; use OCA\Libresign\Vendor\phpseclib3\File\X509; + /** * PublicKeyLoader * * @author Jim Wigginton - * @internal */ abstract class PublicKeyLoader { @@ -33,20 +34,23 @@ abstract class PublicKeyLoader * @param string $password optional * @throws NoKeyLoadedException if key is not valid */ - public static function load($key, $password = \false) + public static function load($key, $password = false) { try { return EC::load($key, $password); } catch (NoKeyLoadedException $e) { } + try { return RSA::load($key, $password); } catch (NoKeyLoadedException $e) { } + try { return DSA::load($key, $password); } catch (NoKeyLoadedException $e) { } + try { $x509 = new X509(); $x509->loadX509($key); @@ -56,8 +60,10 @@ public static function load($key, $password = \false) } } catch (\Exception $e) { } + throw new NoKeyLoadedException('Unable to read key'); } + /** * Loads a private key * @@ -65,7 +71,7 @@ public static function load($key, $password = \false) * @param string|array $key * @param string $password optional */ - public static function loadPrivateKey($key, $password = \false) + public static function loadPrivateKey($key, $password = false) { $key = self::load($key, $password); if (!$key instanceof PrivateKey) { @@ -73,6 +79,7 @@ public static function loadPrivateKey($key, $password = \false) } return $key; } + /** * Loads a public key * @@ -87,6 +94,7 @@ public static function loadPublicKey($key) } return $key; } + /** * Loads parameters * diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/RC2.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/RC2.php index 4abc121..95f03a2 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/RC2.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/RC2.php @@ -30,14 +30,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt; use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\BlockCipher; use OCA\Libresign\Vendor\phpseclib3\Exception\BadModeException; + /** * Pure-PHP implementation of RC2. * - * @internal */ class RC2 extends BlockCipher { @@ -48,6 +49,7 @@ class RC2 extends BlockCipher * @var int */ protected $block_size = 8; + /** * The Key * @@ -56,6 +58,7 @@ class RC2 extends BlockCipher * @var string */ protected $key; + /** * The Original (unpadded) Key * @@ -66,14 +69,15 @@ class RC2 extends BlockCipher * @var string */ private $orig_key; + /** * Key Length (in bytes) * * @see \phpseclib3\Crypt\RC2::setKeyLength() * @var int */ - protected $key_length = 16; - // = 128 bits + protected $key_length = 16; // = 128 bits + /** * The mcrypt specific name of the cipher * @@ -81,6 +85,7 @@ class RC2 extends BlockCipher * @var string */ protected $cipher_name_mcrypt = 'rc2'; + /** * Optimizing value while CFB-encrypting * @@ -88,6 +93,7 @@ class RC2 extends BlockCipher * @var int */ protected $cfb_init_len = 500; + /** * The key length in bits. * @@ -100,6 +106,7 @@ class RC2 extends BlockCipher * @var int */ private $default_key_length = 1024; + /** * The key length in bits. * @@ -110,6 +117,7 @@ class RC2 extends BlockCipher * @var int */ private $current_key_length; + /** * The Key Schedule * @@ -117,6 +125,7 @@ class RC2 extends BlockCipher * @var array */ private $keys; + /** * Key expansion randomization table. * Twice the same 256-value sequence to save a modulus in key expansion. @@ -124,14 +133,114 @@ class RC2 extends BlockCipher * @see self::setKey() * @var array */ - private static $pitable = [0xd9, 0x78, 0xf9, 0xc4, 0x19, 0xdd, 0xb5, 0xed, 0x28, 0xe9, 0xfd, 0x79, 0x4a, 0xa0, 0xd8, 0x9d, 0xc6, 0x7e, 0x37, 0x83, 0x2b, 0x76, 0x53, 0x8e, 0x62, 0x4c, 0x64, 0x88, 0x44, 0x8b, 0xfb, 0xa2, 0x17, 0x9a, 0x59, 0xf5, 0x87, 0xb3, 0x4f, 0x13, 0x61, 0x45, 0x6d, 0x8d, 0x9, 0x81, 0x7d, 0x32, 0xbd, 0x8f, 0x40, 0xeb, 0x86, 0xb7, 0x7b, 0xb, 0xf0, 0x95, 0x21, 0x22, 0x5c, 0x6b, 0x4e, 0x82, 0x54, 0xd6, 0x65, 0x93, 0xce, 0x60, 0xb2, 0x1c, 0x73, 0x56, 0xc0, 0x14, 0xa7, 0x8c, 0xf1, 0xdc, 0x12, 0x75, 0xca, 0x1f, 0x3b, 0xbe, 0xe4, 0xd1, 0x42, 0x3d, 0xd4, 0x30, 0xa3, 0x3c, 0xb6, 0x26, 0x6f, 0xbf, 0xe, 0xda, 0x46, 0x69, 0x7, 0x57, 0x27, 0xf2, 0x1d, 0x9b, 0xbc, 0x94, 0x43, 0x3, 0xf8, 0x11, 0xc7, 0xf6, 0x90, 0xef, 0x3e, 0xe7, 0x6, 0xc3, 0xd5, 0x2f, 0xc8, 0x66, 0x1e, 0xd7, 0x8, 0xe8, 0xea, 0xde, 0x80, 0x52, 0xee, 0xf7, 0x84, 0xaa, 0x72, 0xac, 0x35, 0x4d, 0x6a, 0x2a, 0x96, 0x1a, 0xd2, 0x71, 0x5a, 0x15, 0x49, 0x74, 0x4b, 0x9f, 0xd0, 0x5e, 0x4, 0x18, 0xa4, 0xec, 0xc2, 0xe0, 0x41, 0x6e, 0xf, 0x51, 0xcb, 0xcc, 0x24, 0x91, 0xaf, 0x50, 0xa1, 0xf4, 0x70, 0x39, 0x99, 0x7c, 0x3a, 0x85, 0x23, 0xb8, 0xb4, 0x7a, 0xfc, 0x2, 0x36, 0x5b, 0x25, 0x55, 0x97, 0x31, 0x2d, 0x5d, 0xfa, 0x98, 0xe3, 0x8a, 0x92, 0xae, 0x5, 0xdf, 0x29, 0x10, 0x67, 0x6c, 0xba, 0xc9, 0xd3, 0x0, 0xe6, 0xcf, 0xe1, 0x9e, 0xa8, 0x2c, 0x63, 0x16, 0x1, 0x3f, 0x58, 0xe2, 0x89, 0xa9, 0xd, 0x38, 0x34, 0x1b, 0xab, 0x33, 0xff, 0xb0, 0xbb, 0x48, 0xc, 0x5f, 0xb9, 0xb1, 0xcd, 0x2e, 0xc5, 0xf3, 0xdb, 0x47, 0xe5, 0xa5, 0x9c, 0x77, 0xa, 0xa6, 0x20, 0x68, 0xfe, 0x7f, 0xc1, 0xad, 0xd9, 0x78, 0xf9, 0xc4, 0x19, 0xdd, 0xb5, 0xed, 0x28, 0xe9, 0xfd, 0x79, 0x4a, 0xa0, 0xd8, 0x9d, 0xc6, 0x7e, 0x37, 0x83, 0x2b, 0x76, 0x53, 0x8e, 0x62, 0x4c, 0x64, 0x88, 0x44, 0x8b, 0xfb, 0xa2, 0x17, 0x9a, 0x59, 0xf5, 0x87, 0xb3, 0x4f, 0x13, 0x61, 0x45, 0x6d, 0x8d, 0x9, 0x81, 0x7d, 0x32, 0xbd, 0x8f, 0x40, 0xeb, 0x86, 0xb7, 0x7b, 0xb, 0xf0, 0x95, 0x21, 0x22, 0x5c, 0x6b, 0x4e, 0x82, 0x54, 0xd6, 0x65, 0x93, 0xce, 0x60, 0xb2, 0x1c, 0x73, 0x56, 0xc0, 0x14, 0xa7, 0x8c, 0xf1, 0xdc, 0x12, 0x75, 0xca, 0x1f, 0x3b, 0xbe, 0xe4, 0xd1, 0x42, 0x3d, 0xd4, 0x30, 0xa3, 0x3c, 0xb6, 0x26, 0x6f, 0xbf, 0xe, 0xda, 0x46, 0x69, 0x7, 0x57, 0x27, 0xf2, 0x1d, 0x9b, 0xbc, 0x94, 0x43, 0x3, 0xf8, 0x11, 0xc7, 0xf6, 0x90, 0xef, 0x3e, 0xe7, 0x6, 0xc3, 0xd5, 0x2f, 0xc8, 0x66, 0x1e, 0xd7, 0x8, 0xe8, 0xea, 0xde, 0x80, 0x52, 0xee, 0xf7, 0x84, 0xaa, 0x72, 0xac, 0x35, 0x4d, 0x6a, 0x2a, 0x96, 0x1a, 0xd2, 0x71, 0x5a, 0x15, 0x49, 0x74, 0x4b, 0x9f, 0xd0, 0x5e, 0x4, 0x18, 0xa4, 0xec, 0xc2, 0xe0, 0x41, 0x6e, 0xf, 0x51, 0xcb, 0xcc, 0x24, 0x91, 0xaf, 0x50, 0xa1, 0xf4, 0x70, 0x39, 0x99, 0x7c, 0x3a, 0x85, 0x23, 0xb8, 0xb4, 0x7a, 0xfc, 0x2, 0x36, 0x5b, 0x25, 0x55, 0x97, 0x31, 0x2d, 0x5d, 0xfa, 0x98, 0xe3, 0x8a, 0x92, 0xae, 0x5, 0xdf, 0x29, 0x10, 0x67, 0x6c, 0xba, 0xc9, 0xd3, 0x0, 0xe6, 0xcf, 0xe1, 0x9e, 0xa8, 0x2c, 0x63, 0x16, 0x1, 0x3f, 0x58, 0xe2, 0x89, 0xa9, 0xd, 0x38, 0x34, 0x1b, 0xab, 0x33, 0xff, 0xb0, 0xbb, 0x48, 0xc, 0x5f, 0xb9, 0xb1, 0xcd, 0x2e, 0xc5, 0xf3, 0xdb, 0x47, 0xe5, 0xa5, 0x9c, 0x77, 0xa, 0xa6, 0x20, 0x68, 0xfe, 0x7f, 0xc1, 0xad]; + private static $pitable = [ + 0xD9, 0x78, 0xF9, 0xC4, 0x19, 0xDD, 0xB5, 0xED, + 0x28, 0xE9, 0xFD, 0x79, 0x4A, 0xA0, 0xD8, 0x9D, + 0xC6, 0x7E, 0x37, 0x83, 0x2B, 0x76, 0x53, 0x8E, + 0x62, 0x4C, 0x64, 0x88, 0x44, 0x8B, 0xFB, 0xA2, + 0x17, 0x9A, 0x59, 0xF5, 0x87, 0xB3, 0x4F, 0x13, + 0x61, 0x45, 0x6D, 0x8D, 0x09, 0x81, 0x7D, 0x32, + 0xBD, 0x8F, 0x40, 0xEB, 0x86, 0xB7, 0x7B, 0x0B, + 0xF0, 0x95, 0x21, 0x22, 0x5C, 0x6B, 0x4E, 0x82, + 0x54, 0xD6, 0x65, 0x93, 0xCE, 0x60, 0xB2, 0x1C, + 0x73, 0x56, 0xC0, 0x14, 0xA7, 0x8C, 0xF1, 0xDC, + 0x12, 0x75, 0xCA, 0x1F, 0x3B, 0xBE, 0xE4, 0xD1, + 0x42, 0x3D, 0xD4, 0x30, 0xA3, 0x3C, 0xB6, 0x26, + 0x6F, 0xBF, 0x0E, 0xDA, 0x46, 0x69, 0x07, 0x57, + 0x27, 0xF2, 0x1D, 0x9B, 0xBC, 0x94, 0x43, 0x03, + 0xF8, 0x11, 0xC7, 0xF6, 0x90, 0xEF, 0x3E, 0xE7, + 0x06, 0xC3, 0xD5, 0x2F, 0xC8, 0x66, 0x1E, 0xD7, + 0x08, 0xE8, 0xEA, 0xDE, 0x80, 0x52, 0xEE, 0xF7, + 0x84, 0xAA, 0x72, 0xAC, 0x35, 0x4D, 0x6A, 0x2A, + 0x96, 0x1A, 0xD2, 0x71, 0x5A, 0x15, 0x49, 0x74, + 0x4B, 0x9F, 0xD0, 0x5E, 0x04, 0x18, 0xA4, 0xEC, + 0xC2, 0xE0, 0x41, 0x6E, 0x0F, 0x51, 0xCB, 0xCC, + 0x24, 0x91, 0xAF, 0x50, 0xA1, 0xF4, 0x70, 0x39, + 0x99, 0x7C, 0x3A, 0x85, 0x23, 0xB8, 0xB4, 0x7A, + 0xFC, 0x02, 0x36, 0x5B, 0x25, 0x55, 0x97, 0x31, + 0x2D, 0x5D, 0xFA, 0x98, 0xE3, 0x8A, 0x92, 0xAE, + 0x05, 0xDF, 0x29, 0x10, 0x67, 0x6C, 0xBA, 0xC9, + 0xD3, 0x00, 0xE6, 0xCF, 0xE1, 0x9E, 0xA8, 0x2C, + 0x63, 0x16, 0x01, 0x3F, 0x58, 0xE2, 0x89, 0xA9, + 0x0D, 0x38, 0x34, 0x1B, 0xAB, 0x33, 0xFF, 0xB0, + 0xBB, 0x48, 0x0C, 0x5F, 0xB9, 0xB1, 0xCD, 0x2E, + 0xC5, 0xF3, 0xDB, 0x47, 0xE5, 0xA5, 0x9C, 0x77, + 0x0A, 0xA6, 0x20, 0x68, 0xFE, 0x7F, 0xC1, 0xAD, + 0xD9, 0x78, 0xF9, 0xC4, 0x19, 0xDD, 0xB5, 0xED, + 0x28, 0xE9, 0xFD, 0x79, 0x4A, 0xA0, 0xD8, 0x9D, + 0xC6, 0x7E, 0x37, 0x83, 0x2B, 0x76, 0x53, 0x8E, + 0x62, 0x4C, 0x64, 0x88, 0x44, 0x8B, 0xFB, 0xA2, + 0x17, 0x9A, 0x59, 0xF5, 0x87, 0xB3, 0x4F, 0x13, + 0x61, 0x45, 0x6D, 0x8D, 0x09, 0x81, 0x7D, 0x32, + 0xBD, 0x8F, 0x40, 0xEB, 0x86, 0xB7, 0x7B, 0x0B, + 0xF0, 0x95, 0x21, 0x22, 0x5C, 0x6B, 0x4E, 0x82, + 0x54, 0xD6, 0x65, 0x93, 0xCE, 0x60, 0xB2, 0x1C, + 0x73, 0x56, 0xC0, 0x14, 0xA7, 0x8C, 0xF1, 0xDC, + 0x12, 0x75, 0xCA, 0x1F, 0x3B, 0xBE, 0xE4, 0xD1, + 0x42, 0x3D, 0xD4, 0x30, 0xA3, 0x3C, 0xB6, 0x26, + 0x6F, 0xBF, 0x0E, 0xDA, 0x46, 0x69, 0x07, 0x57, + 0x27, 0xF2, 0x1D, 0x9B, 0xBC, 0x94, 0x43, 0x03, + 0xF8, 0x11, 0xC7, 0xF6, 0x90, 0xEF, 0x3E, 0xE7, + 0x06, 0xC3, 0xD5, 0x2F, 0xC8, 0x66, 0x1E, 0xD7, + 0x08, 0xE8, 0xEA, 0xDE, 0x80, 0x52, 0xEE, 0xF7, + 0x84, 0xAA, 0x72, 0xAC, 0x35, 0x4D, 0x6A, 0x2A, + 0x96, 0x1A, 0xD2, 0x71, 0x5A, 0x15, 0x49, 0x74, + 0x4B, 0x9F, 0xD0, 0x5E, 0x04, 0x18, 0xA4, 0xEC, + 0xC2, 0xE0, 0x41, 0x6E, 0x0F, 0x51, 0xCB, 0xCC, + 0x24, 0x91, 0xAF, 0x50, 0xA1, 0xF4, 0x70, 0x39, + 0x99, 0x7C, 0x3A, 0x85, 0x23, 0xB8, 0xB4, 0x7A, + 0xFC, 0x02, 0x36, 0x5B, 0x25, 0x55, 0x97, 0x31, + 0x2D, 0x5D, 0xFA, 0x98, 0xE3, 0x8A, 0x92, 0xAE, + 0x05, 0xDF, 0x29, 0x10, 0x67, 0x6C, 0xBA, 0xC9, + 0xD3, 0x00, 0xE6, 0xCF, 0xE1, 0x9E, 0xA8, 0x2C, + 0x63, 0x16, 0x01, 0x3F, 0x58, 0xE2, 0x89, 0xA9, + 0x0D, 0x38, 0x34, 0x1B, 0xAB, 0x33, 0xFF, 0xB0, + 0xBB, 0x48, 0x0C, 0x5F, 0xB9, 0xB1, 0xCD, 0x2E, + 0xC5, 0xF3, 0xDB, 0x47, 0xE5, 0xA5, 0x9C, 0x77, + 0x0A, 0xA6, 0x20, 0x68, 0xFE, 0x7F, 0xC1, 0xAD + ]; + /** * Inverse key expansion randomization table. * * @see self::setKey() * @var array */ - private static $invpitable = [0xd1, 0xda, 0xb9, 0x6f, 0x9c, 0xc8, 0x78, 0x66, 0x80, 0x2c, 0xf8, 0x37, 0xea, 0xe0, 0x62, 0xa4, 0xcb, 0x71, 0x50, 0x27, 0x4b, 0x95, 0xd9, 0x20, 0x9d, 0x4, 0x91, 0xe3, 0x47, 0x6a, 0x7e, 0x53, 0xfa, 0x3a, 0x3b, 0xb4, 0xa8, 0xbc, 0x5f, 0x68, 0x8, 0xca, 0x8f, 0x14, 0xd7, 0xc0, 0xef, 0x7b, 0x5b, 0xbf, 0x2f, 0xe5, 0xe2, 0x8c, 0xba, 0x12, 0xe1, 0xaf, 0xb2, 0x54, 0x5d, 0x59, 0x76, 0xdb, 0x32, 0xa2, 0x58, 0x6e, 0x1c, 0x29, 0x64, 0xf3, 0xe9, 0x96, 0xc, 0x98, 0x19, 0x8d, 0x3e, 0x26, 0xab, 0xa5, 0x85, 0x16, 0x40, 0xbd, 0x49, 0x67, 0xdc, 0x22, 0x94, 0xbb, 0x3c, 0xc1, 0x9b, 0xeb, 0x45, 0x28, 0x18, 0xd8, 0x1a, 0x42, 0x7d, 0xcc, 0xfb, 0x65, 0x8e, 0x3d, 0xcd, 0x2a, 0xa3, 0x60, 0xae, 0x93, 0x8a, 0x48, 0x97, 0x51, 0x15, 0xf7, 0x1, 0xb, 0xb7, 0x36, 0xb1, 0x2e, 0x11, 0xfd, 0x84, 0x2d, 0x3f, 0x13, 0x88, 0xb3, 0x34, 0x24, 0x1b, 0xde, 0xc5, 0x1d, 0x4d, 0x2b, 0x17, 0x31, 0x74, 0xa9, 0xc6, 0x43, 0x6d, 0x39, 0x90, 0xbe, 0xc3, 0xb0, 0x21, 0x6b, 0xf6, 0xf, 0xd5, 0x99, 0xd, 0xac, 0x1f, 0x5c, 0x9e, 0xf5, 0xf9, 0x4c, 0xd6, 0xdf, 0x89, 0xe4, 0x8b, 0xff, 0xc7, 0xaa, 0xe7, 0xed, 0x46, 0x25, 0xb6, 0x6, 0x5e, 0x35, 0xb5, 0xec, 0xce, 0xe8, 0x6c, 0x30, 0x55, 0x61, 0x4a, 0xfe, 0xa0, 0x79, 0x3, 0xf0, 0x10, 0x72, 0x7c, 0xcf, 0x52, 0xa6, 0xa7, 0xee, 0x44, 0xd3, 0x9a, 0x57, 0x92, 0xd0, 0x5a, 0x7a, 0x41, 0x7f, 0xe, 0x0, 0x63, 0xf2, 0x4f, 0x5, 0x83, 0xc9, 0xa1, 0xd4, 0xdd, 0xc4, 0x56, 0xf4, 0xd2, 0x77, 0x81, 0x9, 0x82, 0x33, 0x9f, 0x7, 0x86, 0x75, 0x38, 0x4e, 0x69, 0xf1, 0xad, 0x23, 0x73, 0x87, 0x70, 0x2, 0xc2, 0x1e, 0xb8, 0xa, 0xfc, 0xe6]; + private static $invpitable = [ + 0xD1, 0xDA, 0xB9, 0x6F, 0x9C, 0xC8, 0x78, 0x66, + 0x80, 0x2C, 0xF8, 0x37, 0xEA, 0xE0, 0x62, 0xA4, + 0xCB, 0x71, 0x50, 0x27, 0x4B, 0x95, 0xD9, 0x20, + 0x9D, 0x04, 0x91, 0xE3, 0x47, 0x6A, 0x7E, 0x53, + 0xFA, 0x3A, 0x3B, 0xB4, 0xA8, 0xBC, 0x5F, 0x68, + 0x08, 0xCA, 0x8F, 0x14, 0xD7, 0xC0, 0xEF, 0x7B, + 0x5B, 0xBF, 0x2F, 0xE5, 0xE2, 0x8C, 0xBA, 0x12, + 0xE1, 0xAF, 0xB2, 0x54, 0x5D, 0x59, 0x76, 0xDB, + 0x32, 0xA2, 0x58, 0x6E, 0x1C, 0x29, 0x64, 0xF3, + 0xE9, 0x96, 0x0C, 0x98, 0x19, 0x8D, 0x3E, 0x26, + 0xAB, 0xA5, 0x85, 0x16, 0x40, 0xBD, 0x49, 0x67, + 0xDC, 0x22, 0x94, 0xBB, 0x3C, 0xC1, 0x9B, 0xEB, + 0x45, 0x28, 0x18, 0xD8, 0x1A, 0x42, 0x7D, 0xCC, + 0xFB, 0x65, 0x8E, 0x3D, 0xCD, 0x2A, 0xA3, 0x60, + 0xAE, 0x93, 0x8A, 0x48, 0x97, 0x51, 0x15, 0xF7, + 0x01, 0x0B, 0xB7, 0x36, 0xB1, 0x2E, 0x11, 0xFD, + 0x84, 0x2D, 0x3F, 0x13, 0x88, 0xB3, 0x34, 0x24, + 0x1B, 0xDE, 0xC5, 0x1D, 0x4D, 0x2B, 0x17, 0x31, + 0x74, 0xA9, 0xC6, 0x43, 0x6D, 0x39, 0x90, 0xBE, + 0xC3, 0xB0, 0x21, 0x6B, 0xF6, 0x0F, 0xD5, 0x99, + 0x0D, 0xAC, 0x1F, 0x5C, 0x9E, 0xF5, 0xF9, 0x4C, + 0xD6, 0xDF, 0x89, 0xE4, 0x8B, 0xFF, 0xC7, 0xAA, + 0xE7, 0xED, 0x46, 0x25, 0xB6, 0x06, 0x5E, 0x35, + 0xB5, 0xEC, 0xCE, 0xE8, 0x6C, 0x30, 0x55, 0x61, + 0x4A, 0xFE, 0xA0, 0x79, 0x03, 0xF0, 0x10, 0x72, + 0x7C, 0xCF, 0x52, 0xA6, 0xA7, 0xEE, 0x44, 0xD3, + 0x9A, 0x57, 0x92, 0xD0, 0x5A, 0x7A, 0x41, 0x7F, + 0x0E, 0x00, 0x63, 0xF2, 0x4F, 0x05, 0x83, 0xC9, + 0xA1, 0xD4, 0xDD, 0xC4, 0x56, 0xF4, 0xD2, 0x77, + 0x81, 0x09, 0x82, 0x33, 0x9F, 0x07, 0x86, 0x75, + 0x38, 0x4E, 0x69, 0xF1, 0xAD, 0x23, 0x73, 0x87, + 0x70, 0x02, 0xC2, 0x1E, 0xB8, 0x0A, 0xFC, 0xE6 + ]; + /** * Default Constructor. * @@ -141,10 +250,12 @@ class RC2 extends BlockCipher public function __construct($mode) { parent::__construct($mode); + if ($this->mode == self::MODE_STREAM) { throw new BadModeException('Block ciphers cannot be ran in stream mode'); } } + /** * Test for engine validity * @@ -158,20 +269,22 @@ protected function isValidEngineHelper($engine) { switch ($engine) { case self::ENGINE_OPENSSL: - if ($this->current_key_length != 128 || \strlen($this->orig_key) < 16) { - return \false; + if ($this->current_key_length != 128 || strlen($this->orig_key) < 16) { + return false; } // quoting https://www.openssl.org/news/openssl-3.0-notes.html, OpenSSL 3.0.1 // "Moved all variations of the EVP ciphers CAST5, BF, IDEA, SEED, RC2, RC4, RC5, and DES to the legacy provider" // in theory openssl_get_cipher_methods() should catch this but, on GitHub Actions, at least, it does not - if (\defined('OPENSSL_VERSION_TEXT') && \version_compare(\preg_replace('#OpenSSL (\\d+\\.\\d+\\.\\d+) .*#', '$1', \OPENSSL_VERSION_TEXT), '3.0.1', '>=')) { - return \false; + if (defined('OPENSSL_VERSION_TEXT') && version_compare(preg_replace('#OpenSSL (\d+\.\d+\.\d+) .*#', '$1', OPENSSL_VERSION_TEXT), '3.0.1', '>=')) { + return false; } $this->cipher_name_openssl_ecb = 'rc2-ecb'; $this->cipher_name_openssl = 'rc2-' . $this->openssl_translate_mode(); } + return parent::isValidEngineHelper($engine); } + /** * Sets the key length. * @@ -187,9 +300,11 @@ public function setKeyLength($length) if ($length < 8 || $length > 1024) { throw new \LengthException('Key size of ' . $length . ' bits is not supported by this algorithm. Only keys between 1 and 1024 bits, inclusive, are supported'); } + $this->default_key_length = $this->current_key_length = $length; $this->explicit_key_length = $length >> 3; } + /** * Returns the current key length * @@ -199,6 +314,7 @@ public function getKeyLength() { return $this->current_key_length; } + /** * Sets the key. * @@ -212,29 +328,36 @@ public function getKeyLength() * @param int|boolean $t1 optional Effective key length in bits. * @throws \LengthException if the key length isn't supported */ - public function setKey($key, $t1 = \false) + public function setKey($key, $t1 = false) { $this->orig_key = $key; - if ($t1 === \false) { + + if ($t1 === false) { $t1 = $this->default_key_length; } + if ($t1 < 1 || $t1 > 1024) { throw new \LengthException('Key size of ' . $length . ' bits is not supported by this algorithm. Only keys between 1 and 1024 bits, inclusive, are supported'); } + $this->current_key_length = $t1; - if (\strlen($key) < 1 || \strlen($key) > 128) { - throw new \LengthException('Key of size ' . \strlen($key) . ' not supported by this algorithm. Only keys of sizes between 8 and 1024 bits, inclusive, are supported'); + if (strlen($key) < 1 || strlen($key) > 128) { + throw new \LengthException('Key of size ' . strlen($key) . ' not supported by this algorithm. Only keys of sizes between 8 and 1024 bits, inclusive, are supported'); } - $t = \strlen($key); + + $t = strlen($key); + // The mcrypt RC2 implementation only supports effective key length // of 1024 bits. It is however possible to handle effective key // lengths in range 1..1024 by expanding the key and applying // inverse pitable mapping to the first byte before submitting it // to mcrypt. + // Key expansion. - $l = \array_values(\unpack('C*', $key)); - $t8 = $t1 + 7 >> 3; - $tm = 0xff >> 8 * $t8 - $t1; + $l = array_values(unpack('C*', $key)); + $t8 = ($t1 + 7) >> 3; + $tm = 0xFF >> (8 * $t8 - $t1); + // Expand key. $pitable = self::$pitable; for ($i = $t; $i < 128; $i++) { @@ -245,14 +368,17 @@ public function setKey($key, $t1 = \false) while ($i--) { $l[$i] = $pitable[$l[$i + 1] ^ $l[$i + $t8]]; } + // Prepare the key for mcrypt. $l[0] = self::$invpitable[$l[0]]; - \array_unshift($l, 'C*'); - $this->key = \pack(...$l); - $this->key_length = \strlen($this->key); - $this->changed = $this->nonIVChanged = \true; + array_unshift($l, 'C*'); + + $this->key = pack(...$l); + $this->key_length = strlen($this->key); + $this->changed = $this->nonIVChanged = true; $this->setEngine(); } + /** * Encrypts a message. * @@ -271,8 +397,10 @@ public function encrypt($plaintext) $this->key = $temp; return $result; } + return parent::encrypt($plaintext); } + /** * Decrypts a message. * @@ -291,8 +419,10 @@ public function decrypt($ciphertext) $this->key = $temp; return $result; } + return parent::decrypt($ciphertext); } + /** * Encrypts a block * @@ -303,35 +433,40 @@ public function decrypt($ciphertext) */ protected function encryptBlock($in) { - list($r0, $r1, $r2, $r3) = \array_values(\unpack('v*', $in)); + list($r0, $r1, $r2, $r3) = array_values(unpack('v*', $in)); $keys = $this->keys; $limit = 20; $actions = [$limit => 44, 44 => 64]; $j = 0; + for (;;) { // Mixing round. - $r0 = ($r0 + $keys[$j++] + (($r1 ^ $r2) & $r3 ^ $r1) & 0xffff) << 1; + $r0 = (($r0 + $keys[$j++] + ((($r1 ^ $r2) & $r3) ^ $r1)) & 0xFFFF) << 1; $r0 |= $r0 >> 16; - $r1 = ($r1 + $keys[$j++] + (($r2 ^ $r3) & $r0 ^ $r2) & 0xffff) << 2; + $r1 = (($r1 + $keys[$j++] + ((($r2 ^ $r3) & $r0) ^ $r2)) & 0xFFFF) << 2; $r1 |= $r1 >> 16; - $r2 = ($r2 + $keys[$j++] + (($r3 ^ $r0) & $r1 ^ $r3) & 0xffff) << 3; + $r2 = (($r2 + $keys[$j++] + ((($r3 ^ $r0) & $r1) ^ $r3)) & 0xFFFF) << 3; $r2 |= $r2 >> 16; - $r3 = ($r3 + $keys[$j++] + (($r0 ^ $r1) & $r2 ^ $r0) & 0xffff) << 5; + $r3 = (($r3 + $keys[$j++] + ((($r0 ^ $r1) & $r2) ^ $r0)) & 0xFFFF) << 5; $r3 |= $r3 >> 16; + if ($j === $limit) { if ($limit === 64) { break; } + // Mashing round. - $r0 += $keys[$r3 & 0x3f]; - $r1 += $keys[$r0 & 0x3f]; - $r2 += $keys[$r1 & 0x3f]; - $r3 += $keys[$r2 & 0x3f]; + $r0 += $keys[$r3 & 0x3F]; + $r1 += $keys[$r0 & 0x3F]; + $r2 += $keys[$r1 & 0x3F]; + $r3 += $keys[$r2 & 0x3F]; $limit = $actions[$limit]; } } - return \pack('vvvv', $r0, $r1, $r2, $r3); + + return pack('vvvv', $r0, $r1, $r2, $r3); } + /** * Decrypts a block * @@ -342,35 +477,40 @@ protected function encryptBlock($in) */ protected function decryptBlock($in) { - list($r0, $r1, $r2, $r3) = \array_values(\unpack('v*', $in)); + list($r0, $r1, $r2, $r3) = array_values(unpack('v*', $in)); $keys = $this->keys; $limit = 44; $actions = [$limit => 20, 20 => 0]; $j = 64; + for (;;) { // R-mixing round. - $r3 = ($r3 | $r3 << 16) >> 5; - $r3 = $r3 - $keys[--$j] - (($r0 ^ $r1) & $r2 ^ $r0) & 0xffff; - $r2 = ($r2 | $r2 << 16) >> 3; - $r2 = $r2 - $keys[--$j] - (($r3 ^ $r0) & $r1 ^ $r3) & 0xffff; - $r1 = ($r1 | $r1 << 16) >> 2; - $r1 = $r1 - $keys[--$j] - (($r2 ^ $r3) & $r0 ^ $r2) & 0xffff; - $r0 = ($r0 | $r0 << 16) >> 1; - $r0 = $r0 - $keys[--$j] - (($r1 ^ $r2) & $r3 ^ $r1) & 0xffff; + $r3 = ($r3 | ($r3 << 16)) >> 5; + $r3 = ($r3 - $keys[--$j] - ((($r0 ^ $r1) & $r2) ^ $r0)) & 0xFFFF; + $r2 = ($r2 | ($r2 << 16)) >> 3; + $r2 = ($r2 - $keys[--$j] - ((($r3 ^ $r0) & $r1) ^ $r3)) & 0xFFFF; + $r1 = ($r1 | ($r1 << 16)) >> 2; + $r1 = ($r1 - $keys[--$j] - ((($r2 ^ $r3) & $r0) ^ $r2)) & 0xFFFF; + $r0 = ($r0 | ($r0 << 16)) >> 1; + $r0 = ($r0 - $keys[--$j] - ((($r1 ^ $r2) & $r3) ^ $r1)) & 0xFFFF; + if ($j === $limit) { if ($limit === 0) { break; } + // R-mashing round. - $r3 = $r3 - $keys[$r2 & 0x3f] & 0xffff; - $r2 = $r2 - $keys[$r1 & 0x3f] & 0xffff; - $r1 = $r1 - $keys[$r0 & 0x3f] & 0xffff; - $r0 = $r0 - $keys[$r3 & 0x3f] & 0xffff; + $r3 = ($r3 - $keys[$r2 & 0x3F]) & 0xFFFF; + $r2 = ($r2 - $keys[$r1 & 0x3F]) & 0xFFFF; + $r1 = ($r1 - $keys[$r0 & 0x3F]) & 0xFFFF; + $r0 = ($r0 - $keys[$r3 & 0x3F]) & 0xFFFF; $limit = $actions[$limit]; } } - return \pack('vvvv', $r0, $r1, $r2, $r3); + + return pack('vvvv', $r0, $r1, $r2, $r3); } + /** * Creates the key schedule * @@ -381,14 +521,16 @@ protected function setupKey() if (!isset($this->key)) { $this->setKey(''); } + // Key has already been expanded in \phpseclib3\Crypt\RC2::setKey(): // Only the first value must be altered. - $l = \unpack('Ca/Cb/v*', $this->key); - \array_unshift($l, self::$pitable[$l['a']] | $l['b'] << 8); + $l = unpack('Ca/Cb/v*', $this->key); + array_unshift($l, self::$pitable[$l['a']] | ($l['b'] << 8)); unset($l['a']); unset($l['b']); $this->keys = $l; } + /** * Setup the performance-optimized function for de/encrypt() * @@ -398,7 +540,9 @@ protected function setupInlineCrypt() { // Init code for both, encrypt and decrypt. $init_crypt = '$keys = $this->keys;'; + $keys = $this->keys; + // $in is the current 8 bytes block which has to be en/decrypt $encrypt_block = $decrypt_block = ' $in = unpack("v4", $in); @@ -407,10 +551,12 @@ protected function setupInlineCrypt() $r2 = $in[3]; $r3 = $in[4]; '; + // Create code for encryption. $limit = 20; $actions = [$limit => 44, 44 => 64]; $j = 0; + for (;;) { // Mixing round. $encrypt_block .= ' @@ -426,10 +572,12 @@ protected function setupInlineCrypt() $r3 = (($r3 + ' . $keys[$j++] . ' + ((($r0 ^ $r1) & $r2) ^ $r0)) & 0xFFFF) << 5; $r3 |= $r3 >> 16;'; + if ($j === $limit) { if ($limit === 64) { break; } + // Mashing round. $encrypt_block .= ' $r0 += $keys[$r3 & 0x3F]; @@ -439,11 +587,14 @@ protected function setupInlineCrypt() $limit = $actions[$limit]; } } + $encrypt_block .= '$in = pack("v4", $r0, $r1, $r2, $r3);'; + // Create code for decryption. $limit = 44; $actions = [$limit => 20, 20 => 0]; $j = 64; + for (;;) { // R-mixing round. $decrypt_block .= ' @@ -459,10 +610,12 @@ protected function setupInlineCrypt() $r0 = ($r0 | ($r0 << 16)) >> 1; $r0 = ($r0 - ' . $keys[--$j] . ' - ((($r1 ^ $r2) & $r3) ^ $r1)) & 0xFFFF;'; + if ($j === $limit) { if ($limit === 0) { break; } + // R-mashing round. $decrypt_block .= ' $r3 = ($r3 - $keys[$r2 & 0x3F]) & 0xFFFF; @@ -472,8 +625,16 @@ protected function setupInlineCrypt() $limit = $actions[$limit]; } } + $decrypt_block .= '$in = pack("v4", $r0, $r1, $r2, $r3);'; + // Creates the inline-crypt function - $this->inline_crypt = $this->createInlineCryptFunction(['init_crypt' => $init_crypt, 'encrypt_block' => $encrypt_block, 'decrypt_block' => $decrypt_block]); + $this->inline_crypt = $this->createInlineCryptFunction( + [ + 'init_crypt' => $init_crypt, + 'encrypt_block' => $encrypt_block, + 'decrypt_block' => $decrypt_block + ] + ); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/RC4.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/RC4.php index 044d8f7..9761d36 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/RC4.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/RC4.php @@ -39,14 +39,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt; use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\StreamCipher; + /** * Pure-PHP implementation of RC4. * * @author Jim Wigginton - * @internal */ class RC4 extends StreamCipher { @@ -54,18 +55,20 @@ class RC4 extends StreamCipher * @see \phpseclib3\Crypt\RC4::_crypt() */ const ENCRYPT = 0; + /** * @see \phpseclib3\Crypt\RC4::_crypt() */ const DECRYPT = 1; + /** * Key Length (in bytes) * * @see \phpseclib3\Crypt\RC4::setKeyLength() * @var int */ - protected $key_length = 128; - // = 1024 bits + protected $key_length = 128; // = 1024 bits + /** * The mcrypt specific name of the cipher * @@ -73,6 +76,7 @@ class RC4 extends StreamCipher * @var string */ protected $cipher_name_mcrypt = 'arcfour'; + /** * The Key * @@ -80,6 +84,7 @@ class RC4 extends StreamCipher * @var string */ protected $key; + /** * The Key Stream for decryption and encryption * @@ -87,6 +92,7 @@ class RC4 extends StreamCipher * @var array */ private $stream; + /** * Test for engine validity * @@ -100,18 +106,20 @@ protected function isValidEngineHelper($engine) { if ($engine == self::ENGINE_OPENSSL) { if ($this->continuousBuffer) { - return \false; + return false; } // quoting https://www.openssl.org/news/openssl-3.0-notes.html, OpenSSL 3.0.1 // "Moved all variations of the EVP ciphers CAST5, BF, IDEA, SEED, RC2, RC4, RC5, and DES to the legacy provider" // in theory openssl_get_cipher_methods() should catch this but, on GitHub Actions, at least, it does not - if (\defined('OPENSSL_VERSION_TEXT') && \version_compare(\preg_replace('#OpenSSL (\\d+\\.\\d+\\.\\d+) .*#', '$1', \OPENSSL_VERSION_TEXT), '3.0.1', '>=')) { - return \false; + if (defined('OPENSSL_VERSION_TEXT') && version_compare(preg_replace('#OpenSSL (\d+\.\d+\.\d+) .*#', '$1', OPENSSL_VERSION_TEXT), '3.0.1', '>=')) { + return false; } $this->cipher_name_openssl = 'rc4-40'; } + return parent::isValidEngineHelper($engine); } + /** * Sets the key length * @@ -125,9 +133,12 @@ public function setKeyLength($length) if ($length < 8 || $length > 2048) { throw new \LengthException('Key size of ' . $length . ' bits is not supported by this algorithm. Only keys between 1 and 256 bytes are supported'); } + $this->key_length = $length >> 3; + parent::setKeyLength($length); } + /** * Sets the key length * @@ -137,12 +148,14 @@ public function setKeyLength($length) */ public function setKey($key) { - $length = \strlen($key); + $length = strlen($key); if ($length < 1 || $length > 256) { throw new \LengthException('Key size of ' . $length . ' bytes is not supported by RC4. Keys must be between 1 and 256 bytes long'); } + parent::setKey($key); } + /** * Encrypts a message. * @@ -158,6 +171,7 @@ public function encrypt($plaintext) } return $this->crypt($plaintext, self::ENCRYPT); } + /** * Decrypts a message. * @@ -176,6 +190,7 @@ public function decrypt($ciphertext) } return $this->crypt($ciphertext, self::DECRYPT); } + /** * Encrypts a block * @@ -185,6 +200,7 @@ protected function encryptBlock($in) { // RC4 does not utilize this method } + /** * Decrypts a block * @@ -194,6 +210,7 @@ protected function decryptBlock($in) { // RC4 does not utilize this method } + /** * Setup the key (expansion) * @@ -202,24 +219,24 @@ protected function decryptBlock($in) protected function setupKey() { $key = $this->key; - $keyLength = \strlen($key); - $keyStream = \range(0, 255); + $keyLength = strlen($key); + $keyStream = range(0, 255); $j = 0; for ($i = 0; $i < 256; $i++) { - $j = $j + $keyStream[$i] + \ord($key[$i % $keyLength]) & 255; + $j = ($j + $keyStream[$i] + ord($key[$i % $keyLength])) & 255; $temp = $keyStream[$i]; $keyStream[$i] = $keyStream[$j]; $keyStream[$j] = $temp; } + $this->stream = []; $this->stream[self::DECRYPT] = $this->stream[self::ENCRYPT] = [ - 0, - // index $i - 0, - // index $j - $keyStream, + 0, // index $i + 0, // index $j + $keyStream ]; } + /** * Encrypts or decrypts a message. * @@ -234,26 +251,30 @@ private function crypt($text, $mode) if ($this->changed) { $this->setup(); } - $stream =& $this->stream[$mode]; + + $stream = &$this->stream[$mode]; if ($this->continuousBuffer) { - $i =& $stream[0]; - $j =& $stream[1]; - $keyStream =& $stream[2]; + $i = &$stream[0]; + $j = &$stream[1]; + $keyStream = &$stream[2]; } else { $i = $stream[0]; $j = $stream[1]; $keyStream = $stream[2]; } - $len = \strlen($text); + + $len = strlen($text); for ($k = 0; $k < $len; ++$k) { - $i = $i + 1 & 255; + $i = ($i + 1) & 255; $ksi = $keyStream[$i]; - $j = $j + $ksi & 255; + $j = ($j + $ksi) & 255; $ksj = $keyStream[$j]; + $keyStream[$i] = $ksj; $keyStream[$j] = $ksi; - $text[$k] = $text[$k] ^ \chr($keyStream[$ksj + $ksi & 255]); + $text[$k] = $text[$k] ^ chr($keyStream[($ksj + $ksi) & 255]); } + return $text; } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA.php index 9c33cb1..5d840e3 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA.php @@ -50,6 +50,7 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt; use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\AsymmetricKey; @@ -59,11 +60,11 @@ use OCA\Libresign\Vendor\phpseclib3\Exception\InconsistentSetupException; use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedAlgorithmException; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * Pure-PHP PKCS#1 compliant implementation of RSA. * * @author Jim Wigginton - * @internal */ abstract class RSA extends AsymmetricKey { @@ -73,6 +74,7 @@ abstract class RSA extends AsymmetricKey * @var string */ const ALGORITHM = 'RSA'; + /** * Use {@link http://en.wikipedia.org/wiki/Optimal_Asymmetric_Encryption_Padding Optimal Asymmetric Encryption Padding} * (OAEP) for encryption / decryption. @@ -85,6 +87,7 @@ abstract class RSA extends AsymmetricKey * @see self::decrypt() */ const ENCRYPTION_OAEP = 1; + /** * Use PKCS#1 padding. * @@ -95,6 +98,7 @@ abstract class RSA extends AsymmetricKey * @see self::decrypt() */ const ENCRYPTION_PKCS1 = 2; + /** * Do not use any padding * @@ -105,6 +109,7 @@ abstract class RSA extends AsymmetricKey * @see self::decrypt() */ const ENCRYPTION_NONE = 4; + /** * Use the Probabilistic Signature Scheme for signing * @@ -118,6 +123,7 @@ abstract class RSA extends AsymmetricKey * @see self::setHash() */ const SIGNATURE_PSS = 16; + /** * Use a relaxed version of PKCS#1 padding for signature verification * @@ -126,6 +132,7 @@ abstract class RSA extends AsymmetricKey * @see self::setHash() */ const SIGNATURE_RELAXED_PKCS1 = 32; + /** * Use PKCS#1 padding for signature verification * @@ -134,66 +141,77 @@ abstract class RSA extends AsymmetricKey * @see self::setHash() */ const SIGNATURE_PKCS1 = 64; + /** * Encryption padding mode * * @var int */ protected $encryptionPadding = self::ENCRYPTION_OAEP; + /** * Signature padding mode * * @var int */ protected $signaturePadding = self::SIGNATURE_PSS; + /** * Length of hash function output * * @var int */ protected $hLen; + /** * Length of salt * * @var int */ protected $sLen; + /** * Label * * @var string */ protected $label = ''; + /** * Hash function for the Mask Generation Function * * @var Hash */ protected $mgfHash; + /** * Length of MGF hash function output * * @var int */ protected $mgfHLen; + /** * Modulus (ie. n) * * @var Math\BigInteger */ protected $modulus; + /** * Modulus length * * @var Math\BigInteger */ protected $k; + /** * Exponent (ie. e or d) * * @var Math\BigInteger */ protected $exponent; + /** * Default public exponent * @@ -201,12 +219,14 @@ abstract class RSA extends AsymmetricKey * @link http://en.wikipedia.org/wiki/65537_%28number%29 */ private static $defaultExponent = 65537; + /** * Enable Blinding? * * @var bool */ - protected static $enableBlinding = \true; + protected static $enableBlinding = true; + /** * OpenSSL configuration file name. * @@ -214,6 +234,7 @@ abstract class RSA extends AsymmetricKey * @var ?string */ protected static $configFile; + /** * Smallest Prime * @@ -227,12 +248,14 @@ abstract class RSA extends AsymmetricKey * @var int */ private static $smallestPrime = 4096; + /** * Public Exponent * * @var Math\BigInteger */ protected $publicExponent; + /** * Sets the public exponent for key generation * @@ -244,6 +267,7 @@ public static function setExponent($val) { self::$defaultExponent = $val; } + /** * Sets the smallest prime number in bits. Used for key generation * @@ -255,6 +279,7 @@ public static function setSmallestPrime($val) { self::$smallestPrime = $val; } + /** * Sets the OpenSSL config file path * @@ -266,6 +291,7 @@ public static function setOpenSSLConfigPath($val) { self::$configFile = $val; } + /** * Create a private key * @@ -277,44 +303,55 @@ public static function setOpenSSLConfigPath($val) public static function createKey($bits = 2048) { self::initialize_static_variables(); + $class = new \ReflectionClass(static::class); if ($class->isFinal()) { throw new \RuntimeException('createKey() should not be called from final classes (' . static::class . ')'); } - $regSize = $bits >> 1; - // divide by two to see how many bits P and Q would be + + $regSize = $bits >> 1; // divide by two to see how many bits P and Q would be if ($regSize > self::$smallestPrime) { - $num_primes = \floor($bits / self::$smallestPrime); + $num_primes = floor($bits / self::$smallestPrime); $regSize = self::$smallestPrime; } else { $num_primes = 2; } + if ($num_primes == 2 && $bits >= 384 && self::$defaultExponent == 65537) { if (!isset(self::$engines['PHP'])) { self::useBestEngine(); } + // OpenSSL uses 65537 as the exponent and requires RSA keys be 384 bits minimum if (self::$engines['OpenSSL']) { $config = []; if (self::$configFile) { $config['config'] = self::$configFile; } - $rsa = \openssl_pkey_new(['private_key_bits' => $bits] + $config); - \openssl_pkey_export($rsa, $privatekeystr, null, $config); + $rsa = openssl_pkey_new(['private_key_bits' => $bits] + $config); + openssl_pkey_export($rsa, $privatekeystr, null, $config); + // clear the buffer of error strings stemming from a minimalistic openssl.cnf // https://github.com/php/php-src/issues/11054 talks about other errors this'll pick up - while (\openssl_error_string() !== \false) { + while (openssl_error_string() !== false) { } + return RSA::load($privatekeystr); } } + static $e; if (!isset($e)) { $e = new BigInteger(self::$defaultExponent); } + $n = clone self::$one; $exponents = $coefficients = $primes = []; - $lcm = ['top' => clone self::$one, 'bottom' => \false]; + $lcm = [ + 'top' => clone self::$one, + 'bottom' => false + ]; + do { for ($i = 1; $i <= $num_primes; $i++) { if ($i != $num_primes) { @@ -328,28 +365,37 @@ public static function createKey($bits = 2048) list($max) = $max->divide($n); $primes[$i] = BigInteger::randomRangePrime($min, $max); } + // the first coefficient is calculated differently from the rest // ie. instead of being $primes[1]->modInverse($primes[2]), it's $primes[2]->modInverse($primes[1]) if ($i > 2) { $coefficients[$i] = $n->modInverse($primes[$i]); } + $n = $n->multiply($primes[$i]); + $temp = $primes[$i]->subtract(self::$one); + // textbook RSA implementations use Euler's totient function instead of the least common multiple. // see http://en.wikipedia.org/wiki/Euler%27s_totient_function $lcm['top'] = $lcm['top']->multiply($temp); - $lcm['bottom'] = $lcm['bottom'] === \false ? $temp : $lcm['bottom']->gcd($temp); + $lcm['bottom'] = $lcm['bottom'] === false ? $temp : $lcm['bottom']->gcd($temp); } + list($temp) = $lcm['top']->divide($lcm['bottom']); $gcd = $temp->gcd($e); $i0 = 1; } while (!$gcd->equals(self::$one)); + $coefficients[2] = $primes[2]->modInverse($primes[1]); + $d = $e->modInverse($temp); + foreach ($primes as $i => $prime) { $temp = $prime->subtract(self::$one); $exponents[$i] = $e->modInverse($temp); } + // from : // RSAPrivateKey ::= SEQUENCE { // version Version, @@ -371,6 +417,7 @@ public static function createKey($bits = 2048) $privatekey->primes = $primes; $privatekey->exponents = $exponents; $privatekey->coefficients = $coefficients; + /* $publickey = new PublicKey; $publickey->modulus = $n; @@ -379,8 +426,10 @@ public static function createKey($bits = 2048) $publickey->publicExponent = $e; $publickey->isPublic = true; */ + return $privatekey; } + /** * OnLoad Handler * @@ -388,10 +437,14 @@ public static function createKey($bits = 2048) */ protected static function onLoad(array $components) { - $key = $components['isPublicKey'] ? new PublicKey() : new PrivateKey(); + $key = $components['isPublicKey'] ? + new PublicKey() : + new PrivateKey(); + $key->modulus = $components['modulus']; $key->publicExponent = $components['publicExponent']; $key->k = $key->modulus->getLengthInBytes(); + if ($components['isPublicKey'] || !isset($components['privateExponent'])) { $key->exponent = $key->publicExponent; } else { @@ -401,6 +454,7 @@ protected static function onLoad(array $components) $key->exponents = $components['exponents']; $key->coefficients = $components['coefficients']; } + if ($components['format'] == PSS::class) { // in the X509 world RSA keys are assumed to use PKCS1 padding by default. only if the key is // explicitly a PSS key is the use of PSS assumed. phpseclib does not work like this. phpseclib @@ -420,18 +474,22 @@ protected static function onLoad(array $components) $key = $key->withSaltLength($components['saltLength']); } } + return $key; } + /** * Initialize static variables */ protected static function initialize_static_variables() { if (!isset(self::$configFile)) { - self::$configFile = \dirname(__FILE__) . '/../openssl.cnf'; + self::$configFile = dirname(__FILE__) . '/../openssl.cnf'; } + parent::initialize_static_variables(); } + /** * Constructor * @@ -440,10 +498,12 @@ protected static function initialize_static_variables() protected function __construct() { parent::__construct(); + $this->hLen = $this->hash->getLengthInBytes(); $this->mgfHash = new Hash('sha256'); $this->mgfHLen = $this->mgfHash->getLengthInBytes(); } + /** * Integer-to-Octet-String primitive * @@ -455,15 +515,16 @@ protected function __construct() */ protected function i2osp($x, $xLen) { - if ($x === \false) { - return \false; + if ($x === false) { + return false; } $x = $x->toBytes(); - if (\strlen($x) > $xLen) { + if (strlen($x) > $xLen) { throw new \OutOfRangeException('Resultant string length out of range'); } - return \str_pad($x, $xLen, \chr(0), \STR_PAD_LEFT); + return str_pad($x, $xLen, chr(0), STR_PAD_LEFT); } + /** * Octet-String-to-Integer primitive * @@ -476,6 +537,7 @@ protected function os2ip($x) { return new BigInteger($x, 256); } + /** * EMSA-PKCS1-V1_5-ENCODE * @@ -489,45 +551,51 @@ protected function os2ip($x) protected function emsa_pkcs1_v1_5_encode($m, $emLen) { $h = $this->hash->hash($m); + // see http://tools.ietf.org/html/rfc3447#page-43 switch ($this->hash->getHash()) { case 'md2': - $t = "0 0\f\x06\x08*\x86H\x86\xf7\r\x02\x02\x05\x00\x04\x10"; + $t = "\x30\x20\x30\x0c\x06\x08\x2a\x86\x48\x86\xf7\x0d\x02\x02\x05\x00\x04\x10"; break; case 'md5': - $t = "0 0\f\x06\x08*\x86H\x86\xf7\r\x02\x05\x05\x00\x04\x10"; + $t = "\x30\x20\x30\x0c\x06\x08\x2a\x86\x48\x86\xf7\x0d\x02\x05\x05\x00\x04\x10"; break; case 'sha1': - $t = "0!0\t\x06\x05+\x0e\x03\x02\x1a\x05\x00\x04\x14"; + $t = "\x30\x21\x30\x09\x06\x05\x2b\x0e\x03\x02\x1a\x05\x00\x04\x14"; break; case 'sha256': - $t = "010\r\x06\t`\x86H\x01e\x03\x04\x02\x01\x05\x00\x04 "; + $t = "\x30\x31\x30\x0d\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x01\x05\x00\x04\x20"; break; case 'sha384': - $t = "0A0\r\x06\t`\x86H\x01e\x03\x04\x02\x02\x05\x00\x040"; + $t = "\x30\x41\x30\x0d\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x02\x05\x00\x04\x30"; break; case 'sha512': - $t = "0Q0\r\x06\t`\x86H\x01e\x03\x04\x02\x03\x05\x00\x04@"; + $t = "\x30\x51\x30\x0d\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x03\x05\x00\x04\x40"; break; // from https://www.emc.com/collateral/white-papers/h11300-pkcs-1v2-2-rsa-cryptography-standard-wp.pdf#page=40 case 'sha224': - $t = "0-0\r\x06\t`\x86H\x01e\x03\x04\x02\x04\x05\x00\x04\x1c"; + $t = "\x30\x2d\x30\x0d\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x04\x05\x00\x04\x1c"; break; case 'sha512/224': - $t = "0-0\r\x06\t`\x86H\x01e\x03\x04\x02\x05\x05\x00\x04\x1c"; + $t = "\x30\x2d\x30\x0d\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x05\x05\x00\x04\x1c"; break; case 'sha512/256': - $t = "010\r\x06\t`\x86H\x01e\x03\x04\x02\x06\x05\x00\x04 "; + $t = "\x30\x31\x30\x0d\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x06\x05\x00\x04\x20"; } $t .= $h; - $tLen = \strlen($t); + $tLen = strlen($t); + if ($emLen < $tLen + 11) { throw new \LengthException('Intended encoded message length too short'); } - $ps = \str_repeat(\chr(0xff), $emLen - $tLen - 3); - $em = "\x00\x01{$ps}\x00{$t}"; + + $ps = str_repeat(chr(0xFF), $emLen - $tLen - 3); + + $em = "\0\1$ps\0$t"; + return $em; } + /** * EMSA-PKCS1-V1_5-ENCODE (without NULL) * @@ -545,42 +613,48 @@ protected function emsa_pkcs1_v1_5_encode($m, $emLen) protected function emsa_pkcs1_v1_5_encode_without_null($m, $emLen) { $h = $this->hash->hash($m); + // see http://tools.ietf.org/html/rfc3447#page-43 switch ($this->hash->getHash()) { case 'sha1': - $t = "0\x1f0\x07\x06\x05+\x0e\x03\x02\x1a\x04\x14"; + $t = "\x30\x1f\x30\x07\x06\x05\x2b\x0e\x03\x02\x1a\x04\x14"; break; case 'sha256': - $t = "0/0\v\x06\t`\x86H\x01e\x03\x04\x02\x01\x04 "; + $t = "\x30\x2f\x30\x0b\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x01\x04\x20"; break; case 'sha384': - $t = "0?0\v\x06\t`\x86H\x01e\x03\x04\x02\x02\x040"; + $t = "\x30\x3f\x30\x0b\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x02\x04\x30"; break; case 'sha512': - $t = "0O0\v\x06\t`\x86H\x01e\x03\x04\x02\x03\x04@"; + $t = "\x30\x4f\x30\x0b\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x03\x04\x40"; break; // from https://www.emc.com/collateral/white-papers/h11300-pkcs-1v2-2-rsa-cryptography-standard-wp.pdf#page=40 case 'sha224': - $t = "0+0\v\x06\t`\x86H\x01e\x03\x04\x02\x04\x04\x1c"; + $t = "\x30\x2b\x30\x0b\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x04\x04\x1c"; break; case 'sha512/224': - $t = "0+0\v\x06\t`\x86H\x01e\x03\x04\x02\x05\x04\x1c"; + $t = "\x30\x2b\x30\x0b\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x05\x04\x1c"; break; case 'sha512/256': - $t = "0/0\v\x06\t`\x86H\x01e\x03\x04\x02\x06\x04 "; + $t = "\x30\x2f\x30\x0b\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x06\x04\x20"; break; default: throw new UnsupportedAlgorithmException('md2 and md5 require NULLs'); } $t .= $h; - $tLen = \strlen($t); + $tLen = strlen($t); + if ($emLen < $tLen + 11) { throw new \LengthException('Intended encoded message length too short'); } - $ps = \str_repeat(\chr(0xff), $emLen - $tLen - 3); - $em = "\x00\x01{$ps}\x00{$t}"; + + $ps = str_repeat(chr(0xFF), $emLen - $tLen - 3); + + $em = "\0\1$ps\0$t"; + return $em; } + /** * MGF1 * @@ -593,14 +667,17 @@ protected function emsa_pkcs1_v1_5_encode_without_null($m, $emLen) protected function mgf1($mgfSeed, $maskLen) { // if $maskLen would yield strings larger than 4GB, PKCS#1 suggests a "Mask too long" error be output. + $t = ''; - $count = \ceil($maskLen / $this->mgfHLen); + $count = ceil($maskLen / $this->mgfHLen); for ($i = 0; $i < $count; $i++) { - $c = \pack('N', $i); + $c = pack('N', $i); $t .= $this->mgfHash->hash($mgfSeed . $c); } - return \substr($t, 0, $maskLen); + + return substr($t, 0, $maskLen); } + /** * Returns the key size * @@ -612,6 +689,7 @@ public function getLength() { return !isset($this->modulus) ? 0 : $this->modulus->getLength(); } + /** * Determines which hashing function should be used * @@ -623,8 +701,9 @@ public function getLength() public function withHash($hash) { $new = clone $this; + // Crypt\Hash supports algorithms that PKCS#1 doesn't support. md5-96 and sha1-96, for example. - switch (\strtolower($hash)) { + switch (strtolower($hash)) { case 'md2': case 'md5': case 'sha1': @@ -637,11 +716,15 @@ public function withHash($hash) $new->hash = new Hash($hash); break; default: - throw new UnsupportedAlgorithmException('The only supported hash algorithms are: md2, md5, sha1, sha256, sha384, sha512, sha224, sha512/224, sha512/256'); + throw new UnsupportedAlgorithmException( + 'The only supported hash algorithms are: md2, md5, sha1, sha256, sha384, sha512, sha224, sha512/224, sha512/256' + ); } $new->hLen = $new->hash->getLengthInBytes(); + return $new; } + /** * Determines which hashing function should be used for the mask generation function * @@ -653,8 +736,9 @@ public function withHash($hash) public function withMGFHash($hash) { $new = clone $this; + // Crypt\Hash supports algorithms that PKCS#1 doesn't support. md5-96 and sha1-96, for example. - switch (\strtolower($hash)) { + switch (strtolower($hash)) { case 'md2': case 'md5': case 'sha1': @@ -667,11 +751,15 @@ public function withMGFHash($hash) $new->mgfHash = new Hash($hash); break; default: - throw new UnsupportedAlgorithmException('The only supported hash algorithms are: md2, md5, sha1, sha256, sha384, sha512, sha224, sha512/224, sha512/256'); + throw new UnsupportedAlgorithmException( + 'The only supported hash algorithms are: md2, md5, sha1, sha256, sha384, sha512, sha224, sha512/224, sha512/256' + ); } $new->mgfHLen = $new->mgfHash->getLengthInBytes(); + return $new; } + /** * Returns the MGF hash algorithm currently being used * @@ -680,6 +768,7 @@ public function getMGFHash() { return clone $this->mgfHash; } + /** * Determines the salt length * @@ -698,6 +787,7 @@ public function withSaltLength($sLen) $new->sLen = $sLen; return $new; } + /** * Returns the salt length currently being used * @@ -706,6 +796,7 @@ public function getSaltLength() { return $this->sLen !== null ? $this->sLen : $this->hLen; } + /** * Determines the label * @@ -726,6 +817,7 @@ public function withLabel($label) $new->label = $label; return $new; } + /** * Returns the label currently being used * @@ -734,6 +826,7 @@ public function getLabel() { return $this->label; } + /** * Determines the padding modes * @@ -743,7 +836,11 @@ public function getLabel() */ public function withPadding($padding) { - $masks = [self::ENCRYPTION_OAEP, self::ENCRYPTION_PKCS1, self::ENCRYPTION_NONE]; + $masks = [ + self::ENCRYPTION_OAEP, + self::ENCRYPTION_PKCS1, + self::ENCRYPTION_NONE + ]; $encryptedCount = 0; $selected = 0; foreach ($masks as $mask) { @@ -756,7 +853,12 @@ public function withPadding($padding) throw new InconsistentSetupException('Multiple encryption padding modes have been selected; at most only one should be selected'); } $encryptionPadding = $selected; - $masks = [self::SIGNATURE_PSS, self::SIGNATURE_RELAXED_PKCS1, self::SIGNATURE_PKCS1]; + + $masks = [ + self::SIGNATURE_PSS, + self::SIGNATURE_RELAXED_PKCS1, + self::SIGNATURE_PKCS1 + ]; $signatureCount = 0; $selected = 0; foreach ($masks as $mask) { @@ -769,6 +871,7 @@ public function withPadding($padding) throw new InconsistentSetupException('Multiple signature padding modes have been selected; at most only one should be selected'); } $signaturePadding = $selected; + $new = clone $this; if ($encryptedCount) { $new->encryptionPadding = $encryptionPadding; @@ -778,6 +881,7 @@ public function withPadding($padding) } return $new; } + /** * Returns the padding currently being used * @@ -786,6 +890,7 @@ public function getPadding() { return $this->signaturePadding | $this->encryptionPadding; } + /** * Returns the current engine being used * @@ -803,22 +908,26 @@ public function getEngine() if (!isset(self::$engines['PHP'])) { self::useBestEngine(); } - return self::$engines['OpenSSL'] && self::$defaultExponent == 65537 ? 'OpenSSL' : 'PHP'; + return self::$engines['OpenSSL'] && self::$defaultExponent == 65537 ? + 'OpenSSL' : + 'PHP'; } + /** * Enable RSA Blinding * */ public static function enableBlinding() { - static::$enableBlinding = \true; + static::$enableBlinding = true; } + /** * Disable RSA Blinding * */ public static function disableBlinding() { - static::$enableBlinding = \false; + static::$enableBlinding = false; } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/JWK.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/JWK.php index 6d444b4..f1116c0 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/JWK.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/JWK.php @@ -10,16 +10,17 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\RSA\Formats\Keys; use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Keys\JWK as Progenitor; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * JWK Formatted RSA Handler * * @author Jim Wigginton - * @internal */ abstract class JWK extends Progenitor { @@ -33,17 +34,19 @@ abstract class JWK extends Progenitor public static function load($key, $password = '') { $key = parent::load($key, $password); + if ($key->kty != 'RSA') { throw new \RuntimeException('Only RSA JWK keys are supported'); } + $count = $publicCount = 0; $vars = ['n', 'e', 'd', 'p', 'q', 'dp', 'dq', 'qi']; foreach ($vars as $var) { - if (!isset($key->{$var}) || !\is_string($key->{$var})) { + if (!isset($key->$var) || !is_string($key->$var)) { continue; } $count++; - $value = new BigInteger(Strings::base64url_decode($key->{$var}), 256); + $value = new BigInteger(Strings::base64url_decode($key->$var), 256); switch ($var) { case 'n': $publicCount++; @@ -72,14 +75,18 @@ public static function load($key, $password = '') $components['coefficients'][2] = $value; } } - if ($count == \count($vars)) { - return $components + ['isPublicKey' => \false]; + + if ($count == count($vars)) { + return $components + ['isPublicKey' => false]; } + if ($count == 2 && $publicCount == 2) { - return $components + ['isPublicKey' => \true]; + return $components + ['isPublicKey' => true]; } + throw new \UnexpectedValueException('Key does not have an appropriate number of RSA parameters'); } + /** * Convert a private key to the appropriate format. * @@ -95,12 +102,25 @@ public static function load($key, $password = '') */ public static function savePrivateKey(BigInteger $n, BigInteger $e, BigInteger $d, array $primes, array $exponents, array $coefficients, $password = '', array $options = []) { - if (\count($primes) != 2) { + if (count($primes) != 2) { throw new \InvalidArgumentException('JWK does not support multi-prime RSA keys'); } - $key = ['kty' => 'RSA', 'n' => Strings::base64url_encode($n->toBytes()), 'e' => Strings::base64url_encode($e->toBytes()), 'd' => Strings::base64url_encode($d->toBytes()), 'p' => Strings::base64url_encode($primes[1]->toBytes()), 'q' => Strings::base64url_encode($primes[2]->toBytes()), 'dp' => Strings::base64url_encode($exponents[1]->toBytes()), 'dq' => Strings::base64url_encode($exponents[2]->toBytes()), 'qi' => Strings::base64url_encode($coefficients[2]->toBytes())]; + + $key = [ + 'kty' => 'RSA', + 'n' => Strings::base64url_encode($n->toBytes()), + 'e' => Strings::base64url_encode($e->toBytes()), + 'd' => Strings::base64url_encode($d->toBytes()), + 'p' => Strings::base64url_encode($primes[1]->toBytes()), + 'q' => Strings::base64url_encode($primes[2]->toBytes()), + 'dp' => Strings::base64url_encode($exponents[1]->toBytes()), + 'dq' => Strings::base64url_encode($exponents[2]->toBytes()), + 'qi' => Strings::base64url_encode($coefficients[2]->toBytes()) + ]; + return self::wrapKey($key, $options); } + /** * Convert a public key to the appropriate format * @@ -111,7 +131,12 @@ public static function savePrivateKey(BigInteger $n, BigInteger $e, BigInteger $ */ public static function savePublicKey(BigInteger $n, BigInteger $e, array $options = []) { - $key = ['kty' => 'RSA', 'n' => Strings::base64url_encode($n->toBytes()), 'e' => Strings::base64url_encode($e->toBytes())]; + $key = [ + 'kty' => 'RSA', + 'n' => Strings::base64url_encode($n->toBytes()), + 'e' => Strings::base64url_encode($e->toBytes()) + ]; + return self::wrapKey($key, $options); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/MSBLOB.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/MSBLOB.php index 820508c..f390302 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/MSBLOB.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/MSBLOB.php @@ -14,16 +14,17 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\RSA\Formats\Keys; use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedFormatException; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * Microsoft BLOB Formatted RSA Key Handler * * @author Jim Wigginton - * @internal */ abstract class MSBLOB { @@ -41,17 +42,17 @@ abstract class MSBLOB * Public Key * */ - const PUBLICKEYBLOBEX = 0xa; + const PUBLICKEYBLOBEX = 0xA; /** * RSA public key exchange algorithm * */ - const CALG_RSA_KEYX = 0xa400; + const CALG_RSA_KEYX = 0x0000A400; /** * RSA public key exchange algorithm * */ - const CALG_RSA_SIGN = 0x2400; + const CALG_RSA_SIGN = 0x00002400; /** * Public Key * @@ -62,6 +63,7 @@ abstract class MSBLOB * */ const RSA2 = 0x32415352; + /** * Break a public or private key down into its constituent components * @@ -72,34 +74,39 @@ abstract class MSBLOB public static function load($key, $password = '') { if (!Strings::is_stringable($key)) { - throw new \UnexpectedValueException('Key should be a string - not a ' . \gettype($key)); + throw new \UnexpectedValueException('Key should be a string - not a ' . gettype($key)); } + $key = Strings::base64_decode($key); - if (!\is_string($key)) { + + if (!is_string($key)) { throw new \UnexpectedValueException('Base64 decoding produced an error'); } - if (\strlen($key) < 20) { + if (strlen($key) < 20) { throw new \UnexpectedValueException('Key appears to be malformed'); } + // PUBLICKEYSTRUC publickeystruc // https://msdn.microsoft.com/en-us/library/windows/desktop/aa387453(v=vs.85).aspx - $unpacked = \unpack('atype/aversion/vreserved/Valgo', Strings::shift($key, 8)); + $unpacked = unpack('atype/aversion/vreserved/Valgo', Strings::shift($key, 8)); $type = $unpacked['type']; $version = $unpacked['version']; $reserved = $unpacked['reserved']; $algo = $unpacked['algo']; - switch (\ord($type)) { + switch (ord($type)) { case self::PUBLICKEYBLOB: case self::PUBLICKEYBLOBEX: - $publickey = \true; + $publickey = true; break; case self::PRIVATEKEYBLOB: - $publickey = \false; + $publickey = false; break; default: throw new \UnexpectedValueException('Key appears to be malformed'); } + $components = ['isPublicKey' => $publickey]; + // https://msdn.microsoft.com/en-us/library/windows/desktop/aa375549(v=vs.85).aspx switch ($algo) { case self::CALG_RSA_KEYX: @@ -108,50 +115,58 @@ public static function load($key, $password = '') default: throw new \UnexpectedValueException('Key appears to be malformed'); } + // RSAPUBKEY rsapubkey // https://msdn.microsoft.com/en-us/library/windows/desktop/aa387685(v=vs.85).aspx // could do V for pubexp but that's unsigned 32-bit whereas some PHP installs only do signed 32-bit - $unpacked = \unpack('Vmagic/Vbitlen/a4pubexp', Strings::shift($key, 12)); + $unpacked = unpack('Vmagic/Vbitlen/a4pubexp', Strings::shift($key, 12)); $magic = $unpacked['magic']; $bitlen = $unpacked['bitlen']; $pubexp = $unpacked['pubexp']; switch ($magic) { case self::RSA2: - $components['isPublicKey'] = \false; - // fall-through + $components['isPublicKey'] = false; + // fall-through case self::RSA1: break; default: throw new \UnexpectedValueException('Key appears to be malformed'); } + $baseLength = $bitlen / 16; - if (\strlen($key) != 2 * $baseLength && \strlen($key) != 9 * $baseLength) { + if (strlen($key) != 2 * $baseLength && strlen($key) != 9 * $baseLength) { throw new \UnexpectedValueException('Key appears to be malformed'); } - $components[$components['isPublicKey'] ? 'publicExponent' : 'privateExponent'] = new BigInteger(\strrev($pubexp), 256); + + $components[$components['isPublicKey'] ? 'publicExponent' : 'privateExponent'] = new BigInteger(strrev($pubexp), 256); // BYTE modulus[rsapubkey.bitlen/8] - $components['modulus'] = new BigInteger(\strrev(Strings::shift($key, $bitlen / 8)), 256); + $components['modulus'] = new BigInteger(strrev(Strings::shift($key, $bitlen / 8)), 256); + if ($publickey) { return $components; } - $components['isPublicKey'] = \false; + + $components['isPublicKey'] = false; + // BYTE prime1[rsapubkey.bitlen/16] - $components['primes'] = [1 => new BigInteger(\strrev(Strings::shift($key, $bitlen / 16)), 256)]; + $components['primes'] = [1 => new BigInteger(strrev(Strings::shift($key, $bitlen / 16)), 256)]; // BYTE prime2[rsapubkey.bitlen/16] - $components['primes'][] = new BigInteger(\strrev(Strings::shift($key, $bitlen / 16)), 256); + $components['primes'][] = new BigInteger(strrev(Strings::shift($key, $bitlen / 16)), 256); // BYTE exponent1[rsapubkey.bitlen/16] - $components['exponents'] = [1 => new BigInteger(\strrev(Strings::shift($key, $bitlen / 16)), 256)]; + $components['exponents'] = [1 => new BigInteger(strrev(Strings::shift($key, $bitlen / 16)), 256)]; // BYTE exponent2[rsapubkey.bitlen/16] - $components['exponents'][] = new BigInteger(\strrev(Strings::shift($key, $bitlen / 16)), 256); + $components['exponents'][] = new BigInteger(strrev(Strings::shift($key, $bitlen / 16)), 256); // BYTE coefficient[rsapubkey.bitlen/16] - $components['coefficients'] = [2 => new BigInteger(\strrev(Strings::shift($key, $bitlen / 16)), 256)]; + $components['coefficients'] = [2 => new BigInteger(strrev(Strings::shift($key, $bitlen / 16)), 256)]; if (isset($components['privateExponent'])) { $components['publicExponent'] = $components['privateExponent']; } // BYTE privateExponent[rsapubkey.bitlen/8] - $components['privateExponent'] = new BigInteger(\strrev(Strings::shift($key, $bitlen / 8)), 256); + $components['privateExponent'] = new BigInteger(strrev(Strings::shift($key, $bitlen / 8)), 256); + return $components; } + /** * Convert a private key to the appropriate format. * @@ -166,25 +181,29 @@ public static function load($key, $password = '') */ public static function savePrivateKey(BigInteger $n, BigInteger $e, BigInteger $d, array $primes, array $exponents, array $coefficients, $password = '') { - if (\count($primes) != 2) { + if (count($primes) != 2) { throw new \InvalidArgumentException('MSBLOB does not support multi-prime RSA keys'); } - if (!empty($password) && \is_string($password)) { + + if (!empty($password) && is_string($password)) { throw new UnsupportedFormatException('MSBLOB private keys do not support encryption'); } - $n = \strrev($n->toBytes()); - $e = \str_pad(\strrev($e->toBytes()), 4, "\x00"); - $key = \pack('aavV', \chr(self::PRIVATEKEYBLOB), \chr(2), 0, self::CALG_RSA_KEYX); - $key .= \pack('VVa*', self::RSA2, 8 * \strlen($n), $e); + + $n = strrev($n->toBytes()); + $e = str_pad(strrev($e->toBytes()), 4, "\0"); + $key = pack('aavV', chr(self::PRIVATEKEYBLOB), chr(2), 0, self::CALG_RSA_KEYX); + $key .= pack('VVa*', self::RSA2, 8 * strlen($n), $e); $key .= $n; - $key .= \strrev($primes[1]->toBytes()); - $key .= \strrev($primes[2]->toBytes()); - $key .= \strrev($exponents[1]->toBytes()); - $key .= \strrev($exponents[2]->toBytes()); - $key .= \strrev($coefficients[2]->toBytes()); - $key .= \strrev($d->toBytes()); + $key .= strrev($primes[1]->toBytes()); + $key .= strrev($primes[2]->toBytes()); + $key .= strrev($exponents[1]->toBytes()); + $key .= strrev($exponents[2]->toBytes()); + $key .= strrev($coefficients[2]->toBytes()); + $key .= strrev($d->toBytes()); + return Strings::base64_encode($key); } + /** * Convert a public key to the appropriate format * @@ -194,11 +213,12 @@ public static function savePrivateKey(BigInteger $n, BigInteger $e, BigInteger $ */ public static function savePublicKey(BigInteger $n, BigInteger $e) { - $n = \strrev($n->toBytes()); - $e = \str_pad(\strrev($e->toBytes()), 4, "\x00"); - $key = \pack('aavV', \chr(self::PUBLICKEYBLOB), \chr(2), 0, self::CALG_RSA_KEYX); - $key .= \pack('VVa*', self::RSA1, 8 * \strlen($n), $e); + $n = strrev($n->toBytes()); + $e = str_pad(strrev($e->toBytes()), 4, "\0"); + $key = pack('aavV', chr(self::PUBLICKEYBLOB), chr(2), 0, self::CALG_RSA_KEYX); + $key .= pack('VVa*', self::RSA1, 8 * strlen($n), $e); $key .= $n; + return Strings::base64_encode($key); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/OpenSSH.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/OpenSSH.php index ee47a2f..fb262cf 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/OpenSSH.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/OpenSSH.php @@ -12,16 +12,17 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\RSA\Formats\Keys; use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Keys\OpenSSH as Progenitor; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * OpenSSH Formatted RSA Key Handler * * @author Jim Wigginton - * @internal */ abstract class OpenSSH extends Progenitor { @@ -31,6 +32,7 @@ abstract class OpenSSH extends Progenitor * @var array */ protected static $types = ['ssh-rsa']; + /** * Break a public or private key down into its constituent components * @@ -44,24 +46,47 @@ public static function load($key, $password = '') if (!isset($one)) { $one = new BigInteger(1); } + $parsed = parent::load($key, $password); + if (isset($parsed['paddedKey'])) { list($type) = Strings::unpackSSH2('s', $parsed['paddedKey']); if ($type != $parsed['type']) { - throw new \RuntimeException("The public and private keys are not of the same type ({$type} vs {$parsed['type']})"); + throw new \RuntimeException("The public and private keys are not of the same type ($type vs $parsed[type])"); } + $primes = $coefficients = []; - list($modulus, $publicExponent, $privateExponent, $coefficients[2], $primes[1], $primes[2], $comment, ) = Strings::unpackSSH2('i6s', $parsed['paddedKey']); + + list( + $modulus, + $publicExponent, + $privateExponent, + $coefficients[2], + $primes[1], + $primes[2], + $comment, + ) = Strings::unpackSSH2('i6s', $parsed['paddedKey']); + $temp = $primes[1]->subtract($one); $exponents = [1 => $publicExponent->modInverse($temp)]; $temp = $primes[2]->subtract($one); $exponents[] = $publicExponent->modInverse($temp); - $isPublicKey = \false; - return \compact('publicExponent', 'modulus', 'privateExponent', 'primes', 'coefficients', 'exponents', 'comment', 'isPublicKey'); + + $isPublicKey = false; + + return compact('publicExponent', 'modulus', 'privateExponent', 'primes', 'coefficients', 'exponents', 'comment', 'isPublicKey'); } + list($publicExponent, $modulus) = Strings::unpackSSH2('ii', $parsed['publicKey']); - return ['isPublicKey' => \true, 'modulus' => $modulus, 'publicExponent' => $publicExponent, 'comment' => $parsed['comment']]; + + return [ + 'isPublicKey' => true, + 'modulus' => $modulus, + 'publicExponent' => $publicExponent, + 'comment' => $parsed['comment'] + ]; } + /** * Convert a public key to the appropriate format * @@ -73,13 +98,17 @@ public static function load($key, $password = '') public static function savePublicKey(BigInteger $n, BigInteger $e, array $options = []) { $RSAPublicKey = Strings::packSSH2('sii', 'ssh-rsa', $e, $n); + if (isset($options['binary']) ? $options['binary'] : self::$binary) { return $RSAPublicKey; } + $comment = isset($options['comment']) ? $options['comment'] : self::$comment; - $RSAPublicKey = 'ssh-rsa ' . \base64_encode($RSAPublicKey) . ' ' . $comment; + $RSAPublicKey = 'ssh-rsa ' . base64_encode($RSAPublicKey) . ' ' . $comment; + return $RSAPublicKey; } + /** * Convert a private key to the appropriate format. * @@ -95,8 +124,9 @@ public static function savePublicKey(BigInteger $n, BigInteger $e, array $option */ public static function savePrivateKey(BigInteger $n, BigInteger $e, BigInteger $d, array $primes, array $exponents, array $coefficients, $password = '', array $options = []) { - $publicKey = self::savePublicKey($n, $e, ['binary' => \true]); + $publicKey = self::savePublicKey($n, $e, ['binary' => true]); $privateKey = Strings::packSSH2('si6', 'ssh-rsa', $n, $e, $d, $coefficients[2], $primes[1], $primes[2]); + return self::wrapPrivateKey($publicKey, $privateKey, $password, $options); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PKCS1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PKCS1.php index ca41bea..097541b 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PKCS1.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PKCS1.php @@ -19,6 +19,7 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\RSA\Formats\Keys; use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; @@ -26,11 +27,11 @@ use OCA\Libresign\Vendor\phpseclib3\File\ASN1; use OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * PKCS#1 Formatted RSA Key Handler * * @author Jim Wigginton - * @internal */ abstract class PKCS1 extends Progenitor { @@ -44,23 +45,34 @@ abstract class PKCS1 extends Progenitor public static function load($key, $password = '') { if (!Strings::is_stringable($key)) { - throw new \UnexpectedValueException('Key should be a string - not a ' . \gettype($key)); + throw new \UnexpectedValueException('Key should be a string - not a ' . gettype($key)); } - if (\strpos($key, 'PUBLIC') !== \false) { - $components = ['isPublicKey' => \true]; - } elseif (\strpos($key, 'PRIVATE') !== \false) { - $components = ['isPublicKey' => \false]; + + if (strpos($key, 'PUBLIC') !== false) { + $components = ['isPublicKey' => true]; + } elseif (strpos($key, 'PRIVATE') !== false) { + $components = ['isPublicKey' => false]; } else { $components = []; } + $key = parent::load($key, $password); + $decoded = ASN1::decodeBER($key); if (!$decoded) { throw new \RuntimeException('Unable to decode BER'); } + $key = ASN1::asn1map($decoded[0], Maps\RSAPrivateKey::MAP); - if (\is_array($key)) { - $components += ['modulus' => $key['modulus'], 'publicExponent' => $key['publicExponent'], 'privateExponent' => $key['privateExponent'], 'primes' => [1 => $key['prime1'], $key['prime2']], 'exponents' => [1 => $key['exponent1'], $key['exponent2']], 'coefficients' => [2 => $key['coefficient']]]; + if (is_array($key)) { + $components += [ + 'modulus' => $key['modulus'], + 'publicExponent' => $key['publicExponent'], + 'privateExponent' => $key['privateExponent'], + 'primes' => [1 => $key['prime1'], $key['prime2']], + 'exponents' => [1 => $key['exponent1'], $key['exponent2']], + 'coefficients' => [2 => $key['coefficient']] + ]; if ($key['version'] == 'multi') { foreach ($key['otherPrimeInfos'] as $primeInfo) { $components['primes'][] = $primeInfo['prime']; @@ -69,23 +81,27 @@ public static function load($key, $password = '') } } if (!isset($components['isPublicKey'])) { - $components['isPublicKey'] = \false; + $components['isPublicKey'] = false; } return $components; } + $key = ASN1::asn1map($decoded[0], Maps\RSAPublicKey::MAP); - if (!\is_array($key)) { + + if (!is_array($key)) { throw new \RuntimeException('Unable to perform ASN1 mapping'); } + if (!isset($components['isPublicKey'])) { - $components['isPublicKey'] = \true; + $components['isPublicKey'] = true; } + $components = $components + $key; foreach ($components as &$val) { if ($val instanceof BigInteger) { $val = self::makePositive($val); } - if (\is_array($val)) { + if (is_array($val)) { foreach ($val as &$subval) { if ($subval instanceof BigInteger) { $subval = self::makePositive($subval); @@ -93,8 +109,10 @@ public static function load($key, $password = '') } } } + return $components + $key; } + /** * Convert a private key to the appropriate format. * @@ -110,14 +128,31 @@ public static function load($key, $password = '') */ public static function savePrivateKey(BigInteger $n, BigInteger $e, BigInteger $d, array $primes, array $exponents, array $coefficients, $password = '', array $options = []) { - $num_primes = \count($primes); - $key = ['version' => $num_primes == 2 ? 'two-prime' : 'multi', 'modulus' => $n, 'publicExponent' => $e, 'privateExponent' => $d, 'prime1' => $primes[1], 'prime2' => $primes[2], 'exponent1' => $exponents[1], 'exponent2' => $exponents[2], 'coefficient' => $coefficients[2]]; + $num_primes = count($primes); + $key = [ + 'version' => $num_primes == 2 ? 'two-prime' : 'multi', + 'modulus' => $n, + 'publicExponent' => $e, + 'privateExponent' => $d, + 'prime1' => $primes[1], + 'prime2' => $primes[2], + 'exponent1' => $exponents[1], + 'exponent2' => $exponents[2], + 'coefficient' => $coefficients[2] + ]; for ($i = 3; $i <= $num_primes; $i++) { - $key['otherPrimeInfos'][] = ['prime' => $primes[$i], 'exponent' => $exponents[$i], 'coefficient' => $coefficients[$i]]; + $key['otherPrimeInfos'][] = [ + 'prime' => $primes[$i], + 'exponent' => $exponents[$i], + 'coefficient' => $coefficients[$i] + ]; } + $key = ASN1::encodeDER($key, Maps\RSAPrivateKey::MAP); + return self::wrapPrivateKey($key, 'RSA', $password, $options); } + /** * Convert a public key to the appropriate format * @@ -127,10 +162,16 @@ public static function savePrivateKey(BigInteger $n, BigInteger $e, BigInteger $ */ public static function savePublicKey(BigInteger $n, BigInteger $e) { - $key = ['modulus' => $n, 'publicExponent' => $e]; + $key = [ + 'modulus' => $n, + 'publicExponent' => $e + ]; + $key = ASN1::encodeDER($key, Maps\RSAPublicKey::MAP); + return self::wrapPublicKey($key, 'RSA'); } + /** * Negative numbers make no sense in RSA so convert them to positive * @@ -139,6 +180,8 @@ public static function savePublicKey(BigInteger $n, BigInteger $e) */ private static function makePositive(BigInteger $x) { - return $x->isNegative() ? new BigInteger($x->toBytes(\true), 256) : $x; + return $x->isNegative() ? + new BigInteger($x->toBytes(true), 256) : + $x; } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PKCS8.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PKCS8.php index bd32159..0460767 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PKCS8.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PKCS8.php @@ -22,16 +22,17 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\RSA\Formats\Keys; use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Keys\PKCS8 as Progenitor; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * PKCS#8 Formatted RSA Key Handler * * @author Jim Wigginton - * @internal */ abstract class PKCS8 extends Progenitor { @@ -41,18 +42,21 @@ abstract class PKCS8 extends Progenitor * @var string */ const OID_NAME = 'rsaEncryption'; + /** * OID Value * * @var string */ const OID_VALUE = '1.2.840.113549.1.1.1'; + /** * Child OIDs loaded * * @var bool */ - protected static $childOIDsLoaded = \false; + protected static $childOIDsLoaded = false; + /** * Break a public or private key down into its constituent components * @@ -63,19 +67,24 @@ abstract class PKCS8 extends Progenitor public static function load($key, $password = '') { $key = parent::load($key, $password); + if (isset($key['privateKey'])) { - $components['isPublicKey'] = \false; + $components['isPublicKey'] = false; $type = 'private'; } else { - $components['isPublicKey'] = \true; + $components['isPublicKey'] = true; $type = 'public'; } + $result = $components + PKCS1::load($key[$type . 'Key']); + if (isset($key['meta'])) { $result['meta'] = $key['meta']; } + return $result; } + /** * Convert a private key to the appropriate format. * @@ -95,6 +104,7 @@ public static function savePrivateKey(BigInteger $n, BigInteger $e, BigInteger $ $key = ASN1::extractBER($key); return self::wrapPrivateKey($key, [], null, $password, null, '', $options); } + /** * Convert a public key to the appropriate format * diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PSS.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PSS.php index 5257658..c781b5f 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PSS.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PSS.php @@ -20,6 +20,7 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\RSA\Formats\Keys; use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; @@ -27,11 +28,11 @@ use OCA\Libresign\Vendor\phpseclib3\File\ASN1; use OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * PKCS#8 Formatted RSA-PSS Key Handler * * @author Jim Wigginton - * @internal */ abstract class PSS extends Progenitor { @@ -41,34 +42,52 @@ abstract class PSS extends Progenitor * @var string */ const OID_NAME = 'id-RSASSA-PSS'; + /** * OID Value * * @var string */ const OID_VALUE = '1.2.840.113549.1.1.10'; + /** * OIDs loaded * * @var bool */ - private static $oidsLoaded = \false; + private static $oidsLoaded = false; + /** * Child OIDs loaded * * @var bool */ - protected static $childOIDsLoaded = \false; + protected static $childOIDsLoaded = false; + /** * Initialize static variables */ private static function initialize_static_variables() { if (!self::$oidsLoaded) { - ASN1::loadOIDs(['md2' => '1.2.840.113549.2.2', 'md4' => '1.2.840.113549.2.4', 'md5' => '1.2.840.113549.2.5', 'id-sha1' => '1.3.14.3.2.26', 'id-sha256' => '2.16.840.1.101.3.4.2.1', 'id-sha384' => '2.16.840.1.101.3.4.2.2', 'id-sha512' => '2.16.840.1.101.3.4.2.3', 'id-sha224' => '2.16.840.1.101.3.4.2.4', 'id-sha512/224' => '2.16.840.1.101.3.4.2.5', 'id-sha512/256' => '2.16.840.1.101.3.4.2.6', 'id-mgf1' => '1.2.840.113549.1.1.8']); - self::$oidsLoaded = \true; + ASN1::loadOIDs([ + 'md2' => '1.2.840.113549.2.2', + 'md4' => '1.2.840.113549.2.4', + 'md5' => '1.2.840.113549.2.5', + 'id-sha1' => '1.3.14.3.2.26', + 'id-sha256' => '2.16.840.1.101.3.4.2.1', + 'id-sha384' => '2.16.840.1.101.3.4.2.2', + 'id-sha512' => '2.16.840.1.101.3.4.2.3', + 'id-sha224' => '2.16.840.1.101.3.4.2.4', + 'id-sha512/224' => '2.16.840.1.101.3.4.2.5', + 'id-sha512/256' => '2.16.840.1.101.3.4.2.6', + + 'id-mgf1' => '1.2.840.113549.1.1.8' + ]); + self::$oidsLoaded = true; } } + /** * Break a public or private key down into its constituent components * @@ -79,48 +98,59 @@ private static function initialize_static_variables() public static function load($key, $password = '') { self::initialize_static_variables(); + if (!Strings::is_stringable($key)) { - throw new \UnexpectedValueException('Key should be a string - not a ' . \gettype($key)); + throw new \UnexpectedValueException('Key should be a string - not a ' . gettype($key)); } - $components = ['isPublicKey' => \strpos($key, 'PUBLIC') !== \false]; + + $components = ['isPublicKey' => strpos($key, 'PUBLIC') !== false]; + $key = parent::load($key, $password); + $type = isset($key['privateKey']) ? 'private' : 'public'; + $result = $components + PKCS1::load($key[$type . 'Key']); + if (isset($key[$type . 'KeyAlgorithm']['parameters'])) { $decoded = ASN1::decodeBER($key[$type . 'KeyAlgorithm']['parameters']); - if ($decoded === \false) { + if ($decoded === false) { throw new \UnexpectedValueException('Unable to decode parameters'); } $params = ASN1::asn1map($decoded[0], Maps\RSASSA_PSS_params::MAP); } else { $params = []; } + if (isset($params['maskGenAlgorithm']['parameters'])) { $decoded = ASN1::decodeBER($params['maskGenAlgorithm']['parameters']); - if ($decoded === \false) { + if ($decoded === false) { throw new \UnexpectedValueException('Unable to decode parameters'); } $params['maskGenAlgorithm']['parameters'] = ASN1::asn1map($decoded[0], Maps\HashAlgorithm::MAP); } else { - $params['maskGenAlgorithm'] = ['algorithm' => 'id-mgf1', 'parameters' => ['algorithm' => 'id-sha1']]; + $params['maskGenAlgorithm'] = [ + 'algorithm' => 'id-mgf1', + 'parameters' => ['algorithm' => 'id-sha1'] + ]; } + if (!isset($params['hashAlgorithm']['algorithm'])) { $params['hashAlgorithm']['algorithm'] = 'id-sha1'; } - $result['hash'] = \str_replace('id-', '', $params['hashAlgorithm']['algorithm']); - $result['MGFHash'] = \str_replace('id-', '', $params['maskGenAlgorithm']['parameters']['algorithm']); + + $result['hash'] = str_replace('id-', '', $params['hashAlgorithm']['algorithm']); + $result['MGFHash'] = str_replace('id-', '', $params['maskGenAlgorithm']['parameters']['algorithm']); if (isset($params['saltLength'])) { - if (is_int($params['saltLength'])) { - $result['saltLength'] = $params['saltLength']; - } else { - $result['saltLength'] = (int) $params['saltLength']->toString(); - } + $result['saltLength'] = (int) $params['saltLength']->toString(); } + if (isset($key['meta'])) { $result['meta'] = $key['meta']; } + return $result; } + /** * Convert a private key to the appropriate format. * @@ -137,11 +167,13 @@ public static function load($key, $password = '') public static function savePrivateKey(BigInteger $n, BigInteger $e, BigInteger $d, array $primes, array $exponents, array $coefficients, $password = '', array $options = []) { self::initialize_static_variables(); + $key = PKCS1::savePrivateKey($n, $e, $d, $primes, $exponents, $coefficients); $key = ASN1::extractBER($key); $params = self::savePSSParams($options); return self::wrapPrivateKey($key, [], $params, $password, null, '', $options); } + /** * Convert a public key to the appropriate format * @@ -153,11 +185,13 @@ public static function savePrivateKey(BigInteger $n, BigInteger $e, BigInteger $ public static function savePublicKey(BigInteger $n, BigInteger $e, array $options = []) { self::initialize_static_variables(); + $key = PKCS1::savePublicKey($n, $e); $key = ASN1::extractBER($key); $params = self::savePSSParams($options); return self::wrapPublicKey($key, $params); } + /** * Encodes PSS parameters * @@ -178,21 +212,27 @@ public static function savePSSParams(array $options) Implementations that perform signature validation MUST recognize both a present trailerField field with value 1 and an absent trailerField field. - + source: https://tools.ietf.org/html/rfc4055#page-9 */ - $params = ['trailerField' => new BigInteger(1)]; + $params = [ + 'trailerField' => new BigInteger(1) + ]; if (isset($options['hash'])) { $params['hashAlgorithm']['algorithm'] = 'id-' . $options['hash']; } if (isset($options['MGFHash'])) { $temp = ['algorithm' => 'id-' . $options['MGFHash']]; $temp = ASN1::encodeDER($temp, Maps\HashAlgorithm::MAP); - $params['maskGenAlgorithm'] = ['algorithm' => 'id-mgf1', 'parameters' => new ASN1\Element($temp)]; + $params['maskGenAlgorithm'] = [ + 'algorithm' => 'id-mgf1', + 'parameters' => new ASN1\Element($temp) + ]; } if (isset($options['saltLength'])) { $params['saltLength'] = new BigInteger($options['saltLength']); } + return new ASN1\Element(ASN1::encodeDER($params, Maps\RSASSA_PSS_params::MAP)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PuTTY.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PuTTY.php index 14e348e..694c3b2 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PuTTY.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PuTTY.php @@ -10,16 +10,17 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\RSA\Formats\Keys; use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Keys\PuTTY as Progenitor; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * PuTTY Formatted RSA Key Handler * * @author Jim Wigginton - * @internal */ abstract class PuTTY extends Progenitor { @@ -28,13 +29,15 @@ abstract class PuTTY extends Progenitor * * @var string */ - const PUBLIC_HANDLER = 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\RSA\\Formats\\Keys\\OpenSSH'; + const PUBLIC_HANDLER = '\OCA\Libresign\Vendor\phpseclib3\Crypt\RSA\Formats\Keys\OpenSSH'; + /** * Algorithm Identifier * * @var array */ protected static $types = ['ssh-rsa']; + /** * Break a public or private key down into its constituent components * @@ -48,6 +51,7 @@ public static function load($key, $password = '') if (!isset($one)) { $one = new BigInteger(1); } + $components = parent::load($key, $password); if (!isset($components['private'])) { return $components; @@ -57,24 +61,30 @@ public static function load($key, $password = '') $public = $components['public']; $private = $components['private']; unset($components['public'], $components['private']); - $isPublicKey = \false; + + $isPublicKey = false; + $result = Strings::unpackSSH2('ii', $public); - if ($result === \false) { + if ($result === false) { throw new \UnexpectedValueException('Key appears to be malformed'); } list($publicExponent, $modulus) = $result; + $result = Strings::unpackSSH2('iiii', $private); - if ($result === \false) { + if ($result === false) { throw new \UnexpectedValueException('Key appears to be malformed'); } $primes = $coefficients = []; list($privateExponent, $primes[1], $primes[2], $coefficients[2]) = $result; + $temp = $primes[1]->subtract($one); $exponents = [1 => $publicExponent->modInverse($temp)]; $temp = $primes[2]->subtract($one); $exponents[] = $publicExponent->modInverse($temp); - return \compact('publicExponent', 'modulus', 'privateExponent', 'primes', 'coefficients', 'exponents', 'comment', 'isPublicKey'); + + return compact('publicExponent', 'modulus', 'privateExponent', 'primes', 'coefficients', 'exponents', 'comment', 'isPublicKey'); } + /** * Convert a private key to the appropriate format. * @@ -90,13 +100,16 @@ public static function load($key, $password = '') */ public static function savePrivateKey(BigInteger $n, BigInteger $e, BigInteger $d, array $primes, array $exponents, array $coefficients, $password = '', array $options = []) { - if (\count($primes) != 2) { + if (count($primes) != 2) { throw new \InvalidArgumentException('PuTTY does not support multi-prime RSA keys'); } - $public = Strings::packSSH2('ii', $e, $n); + + $public = Strings::packSSH2('ii', $e, $n); $private = Strings::packSSH2('iiii', $d, $primes[1], $primes[2], $coefficients[2]); + return self::wrapPrivateKey($public, $private, 'ssh-rsa', $password, $options); } + /** * Convert a public key to the appropriate format * diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/Raw.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/Raw.php index 9ddf349..93663eb 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/Raw.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/Raw.php @@ -20,14 +20,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\RSA\Formats\Keys; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * Raw RSA Key Handler * * @author Jim Wigginton - * @internal */ abstract class Raw { @@ -40,30 +41,39 @@ abstract class Raw */ public static function load($key, $password = '') { - if (!\is_array($key)) { - throw new \UnexpectedValueException('Key should be a array - not a ' . \gettype($key)); + if (!is_array($key)) { + throw new \UnexpectedValueException('Key should be a array - not a ' . gettype($key)); } - $key = \array_change_key_case($key, \CASE_LOWER); - $components = ['isPublicKey' => \false]; + + $key = array_change_key_case($key, CASE_LOWER); + + $components = ['isPublicKey' => false]; + foreach (['e', 'exponent', 'publicexponent', 0, 'privateexponent', 'd'] as $index) { if (isset($key[$index])) { $components['publicExponent'] = $key[$index]; break; } } + foreach (['n', 'modulo', 'modulus', 1] as $index) { if (isset($key[$index])) { $components['modulus'] = $key[$index]; break; } } + if (!isset($components['publicExponent']) || !isset($components['modulus'])) { throw new \UnexpectedValueException('Modulus / exponent not present'); } + if (isset($key['primes'])) { $components['primes'] = $key['primes']; } elseif (isset($key['p']) && isset($key['q'])) { - $indices = [['p', 'q'], ['prime1', 'prime2']]; + $indices = [ + ['p', 'q'], + ['prime1', 'prime2'] + ]; foreach ($indices as $index) { list($i0, $i1) = $index; if (isset($key[$i0]) && isset($key[$i1])) { @@ -71,10 +81,14 @@ public static function load($key, $password = '') } } } + if (isset($key['exponents'])) { $components['exponents'] = $key['exponents']; } else { - $indices = [['dp', 'dq'], ['exponent1', 'exponent2']]; + $indices = [ + ['dp', 'dq'], + ['exponent1', 'exponent2'] + ]; foreach ($indices as $index) { list($i0, $i1) = $index; if (isset($key[$i0]) && isset($key[$i1])) { @@ -82,6 +96,7 @@ public static function load($key, $password = '') } } } + if (isset($key['coefficients'])) { $components['coefficients'] = $key['coefficients']; } else { @@ -91,10 +106,12 @@ public static function load($key, $password = '') } } } + if (!isset($components['primes'])) { - $components['isPublicKey'] = \true; + $components['isPublicKey'] = true; return $components; } + if (!isset($components['exponents'])) { $one = new BigInteger(1); $temp = $components['primes'][1]->subtract($one); @@ -103,17 +120,21 @@ public static function load($key, $password = '') $exponents[] = $components['publicExponent']->modInverse($temp); $components['exponents'] = $exponents; } + if (!isset($components['coefficients'])) { $components['coefficients'] = [2 => $components['primes'][2]->modInverse($components['primes'][1])]; } + foreach (['privateexponent', 'd'] as $index) { if (isset($key[$index])) { $components['privateExponent'] = $key[$index]; break; } } + return $components; } + /** * Convert a private key to the appropriate format. * @@ -129,17 +150,26 @@ public static function load($key, $password = '') */ public static function savePrivateKey(BigInteger $n, BigInteger $e, BigInteger $d, array $primes, array $exponents, array $coefficients, $password = '', array $options = []) { - if (!empty($password) && \is_string($password)) { + if (!empty($password) && is_string($password)) { throw new UnsupportedFormatException('Raw private keys do not support encryption'); } - return ['e' => clone $e, 'n' => clone $n, 'd' => clone $d, 'primes' => \array_map(function ($var) { - return clone $var; - }, $primes), 'exponents' => \array_map(function ($var) { - return clone $var; - }, $exponents), 'coefficients' => \array_map(function ($var) { - return clone $var; - }, $coefficients)]; + + return [ + 'e' => clone $e, + 'n' => clone $n, + 'd' => clone $d, + 'primes' => array_map(function ($var) { + return clone $var; + }, $primes), + 'exponents' => array_map(function ($var) { + return clone $var; + }, $exponents), + 'coefficients' => array_map(function ($var) { + return clone $var; + }, $coefficients) + ]; } + /** * Convert a public key to the appropriate format * diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/XML.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/XML.php index 8fa8c28..6fea77f 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/XML.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/XML.php @@ -17,17 +17,18 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\RSA\Formats\Keys; use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; use OCA\Libresign\Vendor\phpseclib3\Exception\BadConfigurationException; use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedFormatException; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * XML Formatted RSA Key Handler * * @author Jim Wigginton - * @internal */ abstract class XML { @@ -41,26 +42,35 @@ abstract class XML public static function load($key, $password = '') { if (!Strings::is_stringable($key)) { - throw new \UnexpectedValueException('Key should be a string - not a ' . \gettype($key)); + throw new \UnexpectedValueException('Key should be a string - not a ' . gettype($key)); } - if (!\class_exists('DOMDocument')) { + + if (!class_exists('DOMDocument')) { throw new BadConfigurationException('The dom extension is not setup correctly on this system'); } - $components = ['isPublicKey' => \false, 'primes' => [], 'exponents' => [], 'coefficients' => []]; - $use_errors = \libxml_use_internal_errors(\true); + + $components = [ + 'isPublicKey' => false, + 'primes' => [], + 'exponents' => [], + 'coefficients' => [] + ]; + + $use_errors = libxml_use_internal_errors(true); + $dom = new \DOMDocument(); - if (\substr($key, 0, 5) != '' . $key . ''; } if (!$dom->loadXML($key)) { - \libxml_use_internal_errors($use_errors); + libxml_use_internal_errors($use_errors); throw new \UnexpectedValueException('Key does not appear to contain XML'); } $xpath = new \DOMXPath($dom); $keys = ['modulus', 'exponent', 'p', 'q', 'dp', 'dq', 'inverseq', 'd']; foreach ($keys as $key) { // $dom->getElementsByTagName($key) is case-sensitive - $temp = $xpath->query("//*[translate(local-name(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')='{$key}']"); + $temp = $xpath->query("//*[translate(local-name(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')='$key']"); if (!$temp->length) { continue; } @@ -91,20 +101,25 @@ public static function load($key, $password = '') $components['privateExponent'] = $value; } } - \libxml_use_internal_errors($use_errors); + + libxml_use_internal_errors($use_errors); + foreach ($components as $key => $value) { - if (\is_array($value) && !\count($value)) { + if (is_array($value) && !count($value)) { unset($components[$key]); } } + if (isset($components['modulus']) && isset($components['publicExponent'])) { - if (\count($components) == 3) { - $components['isPublicKey'] = \true; + if (count($components) == 3) { + $components['isPublicKey'] = true; } return $components; } + throw new \UnexpectedValueException('Modulus / exponent not present'); } + /** * Convert a private key to the appropriate format. * @@ -119,14 +134,26 @@ public static function load($key, $password = '') */ public static function savePrivateKey(BigInteger $n, BigInteger $e, BigInteger $d, array $primes, array $exponents, array $coefficients, $password = '') { - if (\count($primes) != 2) { + if (count($primes) != 2) { throw new \InvalidArgumentException('XML does not support multi-prime RSA keys'); } - if (!empty($password) && \is_string($password)) { + + if (!empty($password) && is_string($password)) { throw new UnsupportedFormatException('XML private keys do not support encryption'); } - return "\r\n" . ' ' . Strings::base64_encode($n->toBytes()) . "\r\n" . ' ' . Strings::base64_encode($e->toBytes()) . "\r\n" . '

' . Strings::base64_encode($primes[1]->toBytes()) . "

\r\n" . ' ' . Strings::base64_encode($primes[2]->toBytes()) . "\r\n" . ' ' . Strings::base64_encode($exponents[1]->toBytes()) . "\r\n" . ' ' . Strings::base64_encode($exponents[2]->toBytes()) . "\r\n" . ' ' . Strings::base64_encode($coefficients[2]->toBytes()) . "\r\n" . ' ' . Strings::base64_encode($d->toBytes()) . "\r\n" . '
'; + + return "\r\n" . + ' ' . Strings::base64_encode($n->toBytes()) . "\r\n" . + ' ' . Strings::base64_encode($e->toBytes()) . "\r\n" . + '

' . Strings::base64_encode($primes[1]->toBytes()) . "

\r\n" . + ' ' . Strings::base64_encode($primes[2]->toBytes()) . "\r\n" . + ' ' . Strings::base64_encode($exponents[1]->toBytes()) . "\r\n" . + ' ' . Strings::base64_encode($exponents[2]->toBytes()) . "\r\n" . + ' ' . Strings::base64_encode($coefficients[2]->toBytes()) . "\r\n" . + ' ' . Strings::base64_encode($d->toBytes()) . "\r\n" . + '
'; } + /** * Convert a public key to the appropriate format * @@ -136,6 +163,9 @@ public static function savePrivateKey(BigInteger $n, BigInteger $e, BigInteger $ */ public static function savePublicKey(BigInteger $n, BigInteger $e) { - return "\r\n" . ' ' . Strings::base64_encode($n->toBytes()) . "\r\n" . ' ' . Strings::base64_encode($e->toBytes()) . "\r\n" . ''; + return "\r\n" . + ' ' . Strings::base64_encode($n->toBytes()) . "\r\n" . + ' ' . Strings::base64_encode($e->toBytes()) . "\r\n" . + ''; } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/PrivateKey.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/PrivateKey.php index 1a0e4f9..1ad76e4 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/PrivateKey.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/PrivateKey.php @@ -8,6 +8,7 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\RSA; use OCA\Libresign\Vendor\phpseclib3\Crypt\Common; @@ -16,39 +17,44 @@ use OCA\Libresign\Vendor\phpseclib3\Crypt\RSA\Formats\Keys\PSS; use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedFormatException; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * Raw RSA Key Handler * * @author Jim Wigginton - * @internal */ final class PrivateKey extends RSA implements Common\PrivateKey { use Common\Traits\PasswordProtected; + /** * Primes for Chinese Remainder Theorem (ie. p and q) * * @var array */ protected $primes; + /** * Exponents for Chinese Remainder Theorem (ie. dP and dQ) * * @var array */ protected $exponents; + /** * Coefficients for Chinese Remainder Theorem (ie. qInv) * * @var array */ protected $coefficients; + /** * Private Exponent * * @var BigInteger */ protected $privateExponent; + /** * RSADP * @@ -63,6 +69,7 @@ private function rsadp(BigInteger $c) } return $this->exponentiate($c); } + /** * RSASP1 * @@ -77,6 +84,7 @@ private function rsasp1(BigInteger $m) } return $this->exponentiate($m); } + /** * Exponentiate * @@ -85,7 +93,7 @@ private function rsasp1(BigInteger $m) */ protected function exponentiate(BigInteger $x) { - switch (\true) { + switch (true) { case empty($this->primes): case $this->primes[1]->equals(self::$zero): case empty($this->coefficients): @@ -94,20 +102,29 @@ protected function exponentiate(BigInteger $x) case $this->exponents[1]->equals(self::$zero): return $x->modPow($this->exponent, $this->modulus); } - $num_primes = \count($this->primes); + + $num_primes = count($this->primes); + if (!static::$enableBlinding) { - $m_i = [1 => $x->modPow($this->exponents[1], $this->primes[1]), 2 => $x->modPow($this->exponents[2], $this->primes[2])]; + $m_i = [ + 1 => $x->modPow($this->exponents[1], $this->primes[1]), + 2 => $x->modPow($this->exponents[2], $this->primes[2]) + ]; $h = $m_i[1]->subtract($m_i[2]); $h = $h->multiply($this->coefficients[2]); list(, $h) = $h->divide($this->primes[1]); $m = $m_i[2]->add($h->multiply($this->primes[2])); + $r = $this->primes[1]; for ($i = 3; $i <= $num_primes; $i++) { $m_i = $x->modPow($this->exponents[$i], $this->primes[$i]); + $r = $r->multiply($this->primes[$i - 1]); + $h = $m_i->subtract($m); $h = $h->multiply($this->coefficients[$i]); list(, $h) = $h->divide($this->primes[$i]); + $m = $m->add($r->multiply($h)); } } else { @@ -117,24 +134,35 @@ protected function exponentiate(BigInteger $x) $smallest = $this->primes[$i]; } } + $r = BigInteger::randomRange(self::$one, $smallest->subtract(self::$one)); - $m_i = [1 => $this->blind($x, $r, 1), 2 => $this->blind($x, $r, 2)]; + + $m_i = [ + 1 => $this->blind($x, $r, 1), + 2 => $this->blind($x, $r, 2) + ]; $h = $m_i[1]->subtract($m_i[2]); $h = $h->multiply($this->coefficients[2]); list(, $h) = $h->divide($this->primes[1]); $m = $m_i[2]->add($h->multiply($this->primes[2])); + $r = $this->primes[1]; for ($i = 3; $i <= $num_primes; $i++) { $m_i = $this->blind($x, $r, $i); + $r = $r->multiply($this->primes[$i - 1]); + $h = $m_i->subtract($m); $h = $h->multiply($this->coefficients[$i]); list(, $h) = $h->divide($this->primes[$i]); + $m = $m->add($r->multiply($h)); } } + return $m; } + /** * Performs RSA Blinding * @@ -150,11 +178,14 @@ private function blind(BigInteger $x, BigInteger $r, $i) { $x = $x->multiply($r->modPow($this->publicExponent, $this->primes[$i])); $x = $x->modPow($this->exponents[$i], $this->primes[$i]); + $r = $r->modInverse($this->primes[$i]); $x = $x->multiply($r); list(, $x) = $x->divide($this->primes[$i]); + return $x; } + /** * EMSA-PSS-ENCODE * @@ -169,25 +200,28 @@ private function emsa_pss_encode($m, $emBits) { // if $m is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error // be output. - $emLen = $emBits + 1 >> 3; - // ie. ceil($emBits / 8) + + $emLen = ($emBits + 1) >> 3; // ie. ceil($emBits / 8) $sLen = $this->sLen !== null ? $this->sLen : $this->hLen; + $mHash = $this->hash->hash($m); if ($emLen < $this->hLen + $sLen + 2) { throw new \LengthException('RSA modulus too short'); } + $salt = Random::string($sLen); - $m2 = "\x00\x00\x00\x00\x00\x00\x00\x00" . $mHash . $salt; + $m2 = "\0\0\0\0\0\0\0\0" . $mHash . $salt; $h = $this->hash->hash($m2); - $ps = \str_repeat(\chr(0), $emLen - $sLen - $this->hLen - 2); - $db = $ps . \chr(1) . $salt; - $dbMask = $this->mgf1($h, $emLen - $this->hLen - 1); - // ie. stlren($db) + $ps = str_repeat(chr(0), $emLen - $sLen - $this->hLen - 2); + $db = $ps . chr(1) . $salt; + $dbMask = $this->mgf1($h, $emLen - $this->hLen - 1); // ie. stlren($db) $maskedDB = $db ^ $dbMask; - $maskedDB[0] = ~\chr(0xff << ($emBits & 7)) & $maskedDB[0]; - $em = $maskedDB . $h . \chr(0xbc); + $maskedDB[0] = ~chr(0xFF << ($emBits & 7)) & $maskedDB[0]; + $em = $maskedDB . $h . chr(0xBC); + return $em; } + /** * RSASSA-PSS-SIGN * @@ -199,14 +233,20 @@ private function emsa_pss_encode($m, $emBits) private function rsassa_pss_sign($m) { // EMSA-PSS encoding + $em = $this->emsa_pss_encode($m, 8 * $this->k - 1); + // RSA signature + $m = $this->os2ip($em); $s = $this->rsasp1($m); $s = $this->i2osp($s, $this->k); + // Output the signature S + return $s; } + /** * RSASSA-PKCS1-V1_5-SIGN * @@ -219,6 +259,7 @@ private function rsassa_pss_sign($m) private function rsassa_pkcs1_v1_5_sign($m) { // EMSA-PKCS1-v1_5 encoding + // If the encoding operation outputs "intended encoded message length too short," output "RSA modulus // too short" and stop. try { @@ -226,13 +267,18 @@ private function rsassa_pkcs1_v1_5_sign($m) } catch (\LengthException $e) { throw new \LengthException('RSA modulus too short'); } + // RSA signature + $m = $this->os2ip($em); $s = $this->rsasp1($m); $s = $this->i2osp($s, $this->k); + // Output the signature S + return $s; } + /** * Create a signature * @@ -251,6 +297,7 @@ public function sign($message) return $this->rsassa_pss_sign($message); } } + /** * RSAES-PKCS1-V1_5-DECRYPT * @@ -262,26 +309,35 @@ public function sign($message) private function rsaes_pkcs1_v1_5_decrypt($c) { // Length checking - if (\strlen($c) != $this->k) { - // or if k < 11 + + if (strlen($c) != $this->k) { // or if k < 11 throw new \LengthException('Ciphertext representative too long'); } + // RSA decryption + $c = $this->os2ip($c); $m = $this->rsadp($c); $em = $this->i2osp($m, $this->k); + // EME-PKCS1-v1_5 decoding - if (\ord($em[0]) != 0 || \ord($em[1]) > 2) { + + if (ord($em[0]) != 0 || ord($em[1]) > 2) { throw new \RuntimeException('Decryption error'); } - $ps = \substr($em, 2, \strpos($em, \chr(0), 2) - 2); - $m = \substr($em, \strlen($ps) + 3); - if (\strlen($ps) < 8) { + + $ps = substr($em, 2, strpos($em, chr(0), 2) - 2); + $m = substr($em, strlen($ps) + 3); + + if (strlen($ps) < 8) { throw new \RuntimeException('Decryption error'); } + // Output M + return $m; } + /** * RSAES-OAEP-DECRYPT * @@ -302,43 +358,53 @@ private function rsaes_pkcs1_v1_5_decrypt($c) private function rsaes_oaep_decrypt($c) { // Length checking + // if $l is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error // be output. - if (\strlen($c) != $this->k || $this->k < 2 * $this->hLen + 2) { + + if (strlen($c) != $this->k || $this->k < 2 * $this->hLen + 2) { throw new \LengthException('Ciphertext representative too long'); } + // RSA decryption + $c = $this->os2ip($c); $m = $this->rsadp($c); $em = $this->i2osp($m, $this->k); + // EME-OAEP decoding + $lHash = $this->hash->hash($this->label); - $y = \ord($em[0]); - $maskedSeed = \substr($em, 1, $this->hLen); - $maskedDB = \substr($em, $this->hLen + 1); + $y = ord($em[0]); + $maskedSeed = substr($em, 1, $this->hLen); + $maskedDB = substr($em, $this->hLen + 1); $seedMask = $this->mgf1($maskedDB, $this->hLen); $seed = $maskedSeed ^ $seedMask; $dbMask = $this->mgf1($seed, $this->k - $this->hLen - 1); $db = $maskedDB ^ $dbMask; - $lHash2 = \substr($db, 0, $this->hLen); - $m = \substr($db, $this->hLen); - $hashesMatch = \hash_equals($lHash, $lHash2); + $lHash2 = substr($db, 0, $this->hLen); + $m = substr($db, $this->hLen); + $hashesMatch = hash_equals($lHash, $lHash2); $leadingZeros = 1; $patternMatch = 0; $offset = 0; - for ($i = 0; $i < \strlen($m); $i++) { - $patternMatch |= $leadingZeros & $m[$i] === "\x01"; - $leadingZeros &= $m[$i] === "\x00"; + for ($i = 0; $i < strlen($m); $i++) { + $patternMatch |= $leadingZeros & ($m[$i] === "\1"); + $leadingZeros &= $m[$i] === "\0"; $offset += $patternMatch ? 0 : 1; } + // we do | instead of || to avoid https://en.wikipedia.org/wiki/Short-circuit_evaluation // to protect against timing attacks if (!$hashesMatch | !$patternMatch) { throw new \RuntimeException('Decryption error'); } + // Output the message M - return \substr($m, $offset + 1); + + return substr($m, $offset + 1); } + /** * Raw Encryption / Decryption * @@ -350,13 +416,15 @@ private function rsaes_oaep_decrypt($c) */ private function raw_encrypt($m) { - if (\strlen($m) > $this->k) { + if (strlen($m) > $this->k) { throw new \LengthException('Ciphertext representative too long'); } + $temp = $this->os2ip($m); $temp = $this->rsadp($temp); - return $this->i2osp($temp, $this->k); + return $this->i2osp($temp, $this->k); } + /** * Decryption * @@ -376,6 +444,7 @@ public function decrypt($ciphertext) return $this->rsaes_oaep_decrypt($ciphertext); } } + /** * Returns the public key * @@ -387,9 +456,16 @@ public function getPublicKey() if (empty($this->modulus) || empty($this->publicExponent)) { throw new \RuntimeException('Public key components not found'); } + $key = $type::savePublicKey($this->modulus, $this->publicExponent); - return RSA::loadFormat('PKCS8', $key)->withHash($this->hash->getHash())->withMGFHash($this->mgfHash->getHash())->withSaltLength($this->sLen)->withLabel($this->label)->withPadding($this->signaturePadding | $this->encryptionPadding); + return RSA::loadFormat('PKCS8', $key) + ->withHash($this->hash->getHash()) + ->withMGFHash($this->mgfHash->getHash()) + ->withSaltLength($this->sLen) + ->withLabel($this->label) + ->withPadding($this->signaturePadding | $this->encryptionPadding); } + /** * Returns the private key * @@ -399,26 +475,38 @@ public function getPublicKey() */ public function toString($type, array $options = []) { - $type = self::validatePlugin('Keys', $type, empty($this->primes) ? 'savePublicKey' : 'savePrivateKey'); + $type = self::validatePlugin( + 'Keys', + $type, + empty($this->primes) ? 'savePublicKey' : 'savePrivateKey' + ); + if ($type == PSS::class) { if ($this->signaturePadding == self::SIGNATURE_PSS) { - $options += ['hash' => $this->hash->getHash(), 'MGFHash' => $this->mgfHash->getHash(), 'saltLength' => $this->getSaltLength()]; + $options += [ + 'hash' => $this->hash->getHash(), + 'MGFHash' => $this->mgfHash->getHash(), + 'saltLength' => $this->getSaltLength() + ]; } else { throw new UnsupportedFormatException('The PSS format can only be used when the signature method has been explicitly set to PSS'); } } + if (empty($this->primes)) { return $type::savePublicKey($this->modulus, $this->exponent, $options); } + return $type::savePrivateKey($this->modulus, $this->publicExponent, $this->exponent, $this->primes, $this->exponents, $this->coefficients, $this->password, $options); + /* $key = $type::savePrivateKey($this->modulus, $this->publicExponent, $this->exponent, $this->primes, $this->exponents, $this->coefficients, $this->password, $options); if ($key !== false || count($this->primes) == 2) { return $key; } - + $nSize = $this->getSize() >> 1; - + $primes = [1 => clone self::$one, clone self::$one]; $i = 1; foreach ($this->primes as $prime) { @@ -427,15 +515,15 @@ public function toString($type, array $options = []) $i++; } } - + $exponents = []; $coefficients = [2 => $primes[2]->modInverse($primes[1])]; - + foreach ($primes as $i => $prime) { $temp = $prime->subtract(self::$one); $exponents[$i] = $this->modulus->modInverse($temp); } - + return $type::savePrivateKey($this->modulus, $this->publicExponent, $this->exponent, $primes, $exponents, $coefficients, $this->password, $options); */ } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/PublicKey.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/PublicKey.php index 3018516..4bbccfc 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/PublicKey.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/PublicKey.php @@ -8,6 +8,7 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt\RSA; use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; @@ -21,15 +22,16 @@ use OCA\Libresign\Vendor\phpseclib3\File\ASN1; use OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps\DigestInfo; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * Raw RSA Key Handler * * @author Jim Wigginton - * @internal */ final class PublicKey extends RSA implements Common\PublicKey { use Common\Traits\Fingerprint; + /** * Exponentiate * @@ -40,6 +42,7 @@ private function exponentiate(BigInteger $x) { return $x->modPow($this->exponent, $this->modulus); } + /** * RSAVP1 * @@ -51,10 +54,11 @@ private function exponentiate(BigInteger $x) private function rsavp1($s) { if ($s->compare(self::$zero) < 0 || $s->compare($this->modulus) > 0) { - return \false; + return false; } return $this->exponentiate($s); } + /** * RSASSA-PKCS1-V1_5-VERIFY * @@ -68,43 +72,53 @@ private function rsavp1($s) private function rsassa_pkcs1_v1_5_verify($m, $s) { // Length checking - if (\strlen($s) != $this->k) { - return \false; + + if (strlen($s) != $this->k) { + return false; } + // RSA verification + $s = $this->os2ip($s); $m2 = $this->rsavp1($s); - if ($m2 === \false) { - return \false; + if ($m2 === false) { + return false; } $em = $this->i2osp($m2, $this->k); - if ($em === \false) { - return \false; + if ($em === false) { + return false; } + // EMSA-PKCS1-v1_5 encoding - $exception = \false; + + $exception = false; + // If the encoding operation outputs "intended encoded message length too short," output "RSA modulus // too short" and stop. try { $em2 = $this->emsa_pkcs1_v1_5_encode($m, $this->k); - $r1 = \hash_equals($em, $em2); + $r1 = hash_equals($em, $em2); } catch (\LengthException $e) { - $exception = \true; + $exception = true; } + try { $em3 = $this->emsa_pkcs1_v1_5_encode_without_null($m, $this->k); - $r2 = \hash_equals($em, $em3); + $r2 = hash_equals($em, $em3); } catch (\LengthException $e) { - $exception = \true; + $exception = true; } catch (UnsupportedAlgorithmException $e) { - $r2 = \false; + $r2 = false; } + if ($exception) { throw new \LengthException('RSA modulus too short'); } + // Compare return $r1 || $r2; } + /** * RSASSA-PKCS1-V1_5-VERIFY (relaxed matching) * @@ -125,36 +139,42 @@ private function rsassa_pkcs1_v1_5_verify($m, $s) private function rsassa_pkcs1_v1_5_relaxed_verify($m, $s) { // Length checking - if (\strlen($s) != $this->k) { - return \false; + + if (strlen($s) != $this->k) { + return false; } + // RSA verification + $s = $this->os2ip($s); $m2 = $this->rsavp1($s); - if ($m2 === \false) { - return \false; + if ($m2 === false) { + return false; } $em = $this->i2osp($m2, $this->k); - if ($em === \false) { - return \false; + if ($em === false) { + return false; } - if (Strings::shift($em, 2) != "\x00\x01") { - return \false; + + if (Strings::shift($em, 2) != "\0\1") { + return false; } - $em = \ltrim($em, "\xff"); - if (Strings::shift($em) != "\x00") { - return \false; + + $em = ltrim($em, "\xFF"); + if (Strings::shift($em) != "\0") { + return false; } + $decoded = ASN1::decodeBER($em); - if (!\is_array($decoded) || empty($decoded[0]) || \strlen($em) > $decoded[0]['length']) { - return \false; + if (!is_array($decoded) || empty($decoded[0]) || strlen($em) > $decoded[0]['length']) { + return false; } + static $oids; if (!isset($oids)) { $oids = [ 'md2' => '1.2.840.113549.2.2', - 'md4' => '1.2.840.113549.2.4', - // from PKCS1 v1.5 + 'md4' => '1.2.840.113549.2.4', // from PKCS1 v1.5 'md5' => '1.2.840.113549.2.5', 'id-sha1' => '1.3.14.3.2.26', 'id-sha256' => '2.16.840.1.101.3.4.2.1', @@ -167,23 +187,31 @@ private function rsassa_pkcs1_v1_5_relaxed_verify($m, $s) ]; ASN1::loadOIDs($oids); } + $decoded = ASN1::asn1map($decoded[0], DigestInfo::MAP); - if (!isset($decoded) || $decoded === \false) { - return \false; + if (!isset($decoded) || $decoded === false) { + return false; } + if (!isset($oids[$decoded['digestAlgorithm']['algorithm']])) { - return \false; + return false; } + if (isset($decoded['digestAlgorithm']['parameters']) && $decoded['digestAlgorithm']['parameters'] !== ['null' => '']) { - return \false; + return false; } + $hash = $decoded['digestAlgorithm']['algorithm']; - $hash = \substr($hash, 0, 3) == 'id-' ? \substr($hash, 3) : $hash; + $hash = substr($hash, 0, 3) == 'id-' ? + substr($hash, 3) : + $hash; $hash = new Hash($hash); $em = $hash->hash($m); $em2 = $decoded['digest']; - return \hash_equals($em, $em2); + + return hash_equals($em, $em2); } + /** * EMSA-PSS-VERIFY * @@ -198,35 +226,38 @@ private function emsa_pss_verify($m, $em, $emBits) { // if $m is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error // be output. - $emLen = $emBits + 7 >> 3; - // ie. ceil($emBits / 8); + + $emLen = ($emBits + 7) >> 3; // ie. ceil($emBits / 8); $sLen = $this->sLen !== null ? $this->sLen : $this->hLen; + $mHash = $this->hash->hash($m); if ($emLen < $this->hLen + $sLen + 2) { - return \false; + return false; } - if ($em[\strlen($em) - 1] != \chr(0xbc)) { - return \false; + + if ($em[strlen($em) - 1] != chr(0xBC)) { + return false; } - $maskedDB = \substr($em, 0, -$this->hLen - 1); - $h = \substr($em, -$this->hLen - 1, $this->hLen); - $temp = \chr(0xff << ($emBits & 7)); + + $maskedDB = substr($em, 0, -$this->hLen - 1); + $h = substr($em, -$this->hLen - 1, $this->hLen); + $temp = chr(0xFF << ($emBits & 7)); if ((~$maskedDB[0] & $temp) != $temp) { - return \false; + return false; } $dbMask = $this->mgf1($h, $emLen - $this->hLen - 1); $db = $maskedDB ^ $dbMask; - $db[0] = ~\chr(0xff << ($emBits & 7)) & $db[0]; + $db[0] = ~chr(0xFF << ($emBits & 7)) & $db[0]; $temp = $emLen - $this->hLen - $sLen - 2; - if (\substr($db, 0, $temp) != \str_repeat(\chr(0), $temp) || \ord($db[$temp]) != 1) { - return \false; + if (substr($db, 0, $temp) != str_repeat(chr(0), $temp) || ord($db[$temp]) != 1) { + return false; } - $salt = \substr($db, $temp + 1); - // should be $sLen long - $m2 = "\x00\x00\x00\x00\x00\x00\x00\x00" . $mHash . $salt; + $salt = substr($db, $temp + 1); // should be $sLen long + $m2 = "\0\0\0\0\0\0\0\0" . $mHash . $salt; $h2 = $this->hash->hash($m2); - return \hash_equals($h, $h2); + return hash_equals($h, $h2); } + /** * RSASSA-PSS-VERIFY * @@ -239,20 +270,27 @@ private function emsa_pss_verify($m, $em, $emBits) private function rsassa_pss_verify($m, $s) { // Length checking - if (\strlen($s) != $this->k) { - return \false; + + if (strlen($s) != $this->k) { + return false; } + // RSA verification - $modBits = \strlen($this->modulus->toBits()); + + $modBits = strlen($this->modulus->toBits()); + $s2 = $this->os2ip($s); $m2 = $this->rsavp1($s2); $em = $this->i2osp($m2, $this->k); - if ($em === \false) { - return \false; + if ($em === false) { + return false; } + // EMSA-PSS verification + return $this->emsa_pss_verify($m, $em, $modBits - 1); } + /** * Verifies a signature * @@ -273,6 +311,7 @@ public function verify($message, $signature) return $this->rsassa_pss_verify($message, $signature); } } + /** * RSAES-PKCS1-V1_5-ENCRYPT * @@ -283,30 +322,38 @@ public function verify($message, $signature) * @throws \LengthException if strlen($m) > $this->k - 11 * @return bool|string */ - private function rsaes_pkcs1_v1_5_encrypt($m, $pkcs15_compat = \false) + private function rsaes_pkcs1_v1_5_encrypt($m, $pkcs15_compat = false) { - $mLen = \strlen($m); + $mLen = strlen($m); + // Length checking + if ($mLen > $this->k - 11) { throw new \LengthException('Message too long'); } + // EME-PKCS1-v1_5 encoding + $psLen = $this->k - $mLen - 3; $ps = ''; - while (\strlen($ps) != $psLen) { - $temp = Random::string($psLen - \strlen($ps)); - $temp = \str_replace("\x00", '', $temp); + while (strlen($ps) != $psLen) { + $temp = Random::string($psLen - strlen($ps)); + $temp = str_replace("\x00", '', $temp); $ps .= $temp; } $type = 2; - $em = \chr(0) . \chr($type) . $ps . \chr(0) . $m; + $em = chr(0) . chr($type) . $ps . chr(0) . $m; + // RSA encryption $m = $this->os2ip($em); $c = $this->rsaep($m); $c = $this->i2osp($c, $this->k); + // Output the ciphertext C + return $c; } + /** * RSAES-OAEP-ENCRYPT * @@ -319,30 +366,40 @@ private function rsaes_pkcs1_v1_5_encrypt($m, $pkcs15_compat = \false) */ private function rsaes_oaep_encrypt($m) { - $mLen = \strlen($m); + $mLen = strlen($m); + // Length checking + // if $l is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error // be output. + if ($mLen > $this->k - 2 * $this->hLen - 2) { throw new \LengthException('Message too long'); } + // EME-OAEP encoding + $lHash = $this->hash->hash($this->label); - $ps = \str_repeat(\chr(0), $this->k - $mLen - 2 * $this->hLen - 2); - $db = $lHash . $ps . \chr(1) . $m; + $ps = str_repeat(chr(0), $this->k - $mLen - 2 * $this->hLen - 2); + $db = $lHash . $ps . chr(1) . $m; $seed = Random::string($this->hLen); $dbMask = $this->mgf1($seed, $this->k - $this->hLen - 1); $maskedDB = $db ^ $dbMask; $seedMask = $this->mgf1($maskedDB, $this->hLen); $maskedSeed = $seed ^ $seedMask; - $em = \chr(0) . $maskedSeed . $maskedDB; + $em = chr(0) . $maskedSeed . $maskedDB; + // RSA encryption + $m = $this->os2ip($em); $c = $this->rsaep($m); $c = $this->i2osp($c, $this->k); + // Output the ciphertext C + return $c; } + /** * RSAEP * @@ -358,6 +415,7 @@ private function rsaep($m) } return $this->exponentiate($m); } + /** * Raw Encryption / Decryption * @@ -369,13 +427,15 @@ private function rsaep($m) */ private function raw_encrypt($m) { - if (\strlen($m) > $this->k) { + if (strlen($m) > $this->k) { throw new \LengthException('Message too long'); } + $temp = $this->os2ip($m); $temp = $this->rsaep($temp); - return $this->i2osp($temp, $this->k); + return $this->i2osp($temp, $this->k); } + /** * Encryption * @@ -400,6 +460,7 @@ public function encrypt($plaintext) return $this->rsaes_oaep_encrypt($plaintext); } } + /** * Returns the public key * @@ -414,15 +475,22 @@ public function encrypt($plaintext) public function toString($type, array $options = []) { $type = self::validatePlugin('Keys', $type, 'savePublicKey'); + if ($type == PSS::class) { if ($this->signaturePadding == self::SIGNATURE_PSS) { - $options += ['hash' => $this->hash->getHash(), 'MGFHash' => $this->mgfHash->getHash(), 'saltLength' => $this->getSaltLength()]; + $options += [ + 'hash' => $this->hash->getHash(), + 'MGFHash' => $this->mgfHash->getHash(), + 'saltLength' => $this->getSaltLength() + ]; } else { throw new UnsupportedFormatException('The PSS format can only be used when the signature method has been explicitly set to PSS'); } } + return $type::savePublicKey($this->modulus, $this->publicExponent, $options); } + /** * Converts a public key to a private key * @@ -435,6 +503,11 @@ public function asPrivateKey() $new->modulus = $this->modulus; $new->k = $this->k; $new->format = $this->format; - return $new->withHash($this->hash->getHash())->withMGFHash($this->mgfHash->getHash())->withSaltLength($this->sLen)->withLabel($this->label)->withPadding($this->signaturePadding | $this->encryptionPadding); + return $new + ->withHash($this->hash->getHash()) + ->withMGFHash($this->mgfHash->getHash()) + ->withSaltLength($this->sLen) + ->withLabel($this->label) + ->withPadding($this->signaturePadding | $this->encryptionPadding); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/Random.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/Random.php index 745db93..ca64c54 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/Random.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/Random.php @@ -19,13 +19,13 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt; /** * Pure-PHP Random Number Generator * * @author Jim Wigginton - * @internal */ abstract class Random { @@ -45,8 +45,9 @@ public static function string($length) if (!$length) { return ''; } + try { - return \random_bytes($length); + return random_bytes($length); } catch (\Exception $e) { // random_compat will throw an Exception, which in PHP 5 does not implement Throwable } catch (\Throwable $e) { @@ -58,6 +59,7 @@ public static function string($length) // the PHP implementation. } // at this point we have no choice but to use a pure-PHP CSPRNG + // cascade entropy across multiple PHP instances by fixing the session and collecting all // environmental variables, including the previous session data and the current session // data. @@ -75,41 +77,55 @@ public static function string($length) // a hash of the session data before that). certainly an attacker should be assumed to have // full control over his own http requests. he, however, is not going to have control over // everyone's http requests. - static $crypto = \false, $v; - if ($crypto === \false) { + static $crypto = false, $v; + if ($crypto === false) { // save old session data - $old_session_id = \session_id(); - $old_use_cookies = \ini_get('session.use_cookies'); - $old_session_cache_limiter = \session_cache_limiter(); - $_OLD_SESSION = isset($_SESSION) ? $_SESSION : \false; + $old_session_id = session_id(); + $old_use_cookies = ini_get('session.use_cookies'); + $old_session_cache_limiter = session_cache_limiter(); + $_OLD_SESSION = isset($_SESSION) ? $_SESSION : false; if ($old_session_id != '') { - \session_write_close(); + session_write_close(); } - \session_id(1); - \ini_set('session.use_cookies', 0); - \session_cache_limiter(''); - \session_start(); - $v = (isset($_SERVER) ? self::safe_serialize($_SERVER) : '') . (isset($_POST) ? self::safe_serialize($_POST) : '') . (isset($_GET) ? self::safe_serialize($_GET) : '') . (isset($_COOKIE) ? self::safe_serialize($_COOKIE) : '') . (\version_compare(\PHP_VERSION, '8.1.0', '>=') ? \serialize($GLOBALS) : self::safe_serialize($GLOBALS)) . self::safe_serialize($_SESSION) . self::safe_serialize($_OLD_SESSION); - $v = $seed = $_SESSION['seed'] = \sha1($v, \true); + + session_id(1); + ini_set('session.use_cookies', 0); + session_cache_limiter(''); + session_start(); + + $v = (isset($_SERVER) ? self::safe_serialize($_SERVER) : '') . + (isset($_POST) ? self::safe_serialize($_POST) : '') . + (isset($_GET) ? self::safe_serialize($_GET) : '') . + (isset($_COOKIE) ? self::safe_serialize($_COOKIE) : '') . + // as of PHP 8.1 $GLOBALS can't be accessed by reference, which eliminates + // the need for phpseclib_safe_serialize. see https://wiki.php.net/rfc/restrict_globals_usage + // for more info + (version_compare(PHP_VERSION, '8.1.0', '>=') ? serialize($GLOBALS) : self::safe_serialize($GLOBALS)) . + self::safe_serialize($_SESSION) . + self::safe_serialize($_OLD_SESSION); + $v = $seed = $_SESSION['seed'] = sha1($v, true); if (!isset($_SESSION['count'])) { $_SESSION['count'] = 0; } $_SESSION['count']++; - \session_write_close(); + + session_write_close(); + // restore old session data if ($old_session_id != '') { - \session_id($old_session_id); - \session_start(); - \ini_set('session.use_cookies', $old_use_cookies); - \session_cache_limiter($old_session_cache_limiter); + session_id($old_session_id); + session_start(); + ini_set('session.use_cookies', $old_use_cookies); + session_cache_limiter($old_session_cache_limiter); } else { - if ($_OLD_SESSION !== \false) { + if ($_OLD_SESSION !== false) { $_SESSION = $_OLD_SESSION; unset($_OLD_SESSION); } else { unset($_SESSION); } } + // in SSH2 a shared secret and an exchange hash are generated through the key exchange process. // the IV client to server is the hash of that "nonce" with the letter A and for the encryption key it's the letter C. // if the hash doesn't produce enough a key or an IV that's long enough concat successive hashes of the @@ -118,38 +134,42 @@ public static function string($length) // http://tools.ietf.org/html/rfc4253#section-7.2 // // see the is_string($crypto) part for an example of how to expand the keys - $key = \sha1($seed . 'A', \true); - $iv = \sha1($seed . 'C', \true); + $key = sha1($seed . 'A', true); + $iv = sha1($seed . 'C', true); + // ciphers are used as per the nist.gov link below. also, see this link: // // http://en.wikipedia.org/wiki/Cryptographically_secure_pseudorandom_number_generator#Designs_based_on_cryptographic_primitives - switch (\true) { - case \class_exists('OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\AES'): + switch (true) { + case class_exists('\phpseclib3\Crypt\AES'): $crypto = new AES('ctr'); break; - case \class_exists('OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Twofish'): + case class_exists('\phpseclib3\Crypt\Twofish'): $crypto = new Twofish('ctr'); break; - case \class_exists('OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Blowfish'): + case class_exists('\phpseclib3\Crypt\Blowfish'): $crypto = new Blowfish('ctr'); break; - case \class_exists('OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\TripleDES'): + case class_exists('\phpseclib3\Crypt\TripleDES'): $crypto = new TripleDES('ctr'); break; - case \class_exists('OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\DES'): + case class_exists('\phpseclib3\Crypt\DES'): $crypto = new DES('ctr'); break; - case \class_exists('OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\RC4'): + case class_exists('\phpseclib3\Crypt\RC4'): $crypto = new RC4(); break; default: throw new \RuntimeException(__CLASS__ . ' requires at least one symmetric cipher be loaded'); } - $crypto->setKey(\substr($key, 0, $crypto->getKeyLength() >> 3)); - $crypto->setIV(\substr($iv, 0, $crypto->getBlockLength() >> 3)); + + $crypto->setKey(substr($key, 0, $crypto->getKeyLength() >> 3)); + $crypto->setIV(substr($iv, 0, $crypto->getBlockLength() >> 3)); $crypto->enableContinuousBuffer(); } + //return $crypto->encrypt(str_repeat("\0", $length)); + // the following is based off of ANSI X9.31: // // http://csrc.nist.gov/groups/STM/cavp/documents/rng/931rngext.pdf @@ -159,17 +179,16 @@ public static function string($length) // http://www.opensource.apple.com/source/OpenSSL/OpenSSL-38/openssl/fips-1.0/rand/fips_rand.c // (do a search for "ANS X9.31 A.2.4") $result = ''; - while (\strlen($result) < $length) { - $i = $crypto->encrypt(\microtime()); - // strlen(microtime()) == 21 - $r = $crypto->encrypt($i ^ $v); - // strlen($v) == 20 - $v = $crypto->encrypt($r ^ $i); - // strlen($r) == 20 + while (strlen($result) < $length) { + $i = $crypto->encrypt(microtime()); // strlen(microtime()) == 21 + $r = $crypto->encrypt($i ^ $v); // strlen($v) == 20 + $v = $crypto->encrypt($r ^ $i); // strlen($r) == 20 $result .= $r; } - return \substr($result, 0, $length); + + return substr($result, 0, $length); } + /** * Safely serialize variables * @@ -179,25 +198,25 @@ public static function string($length) */ private static function safe_serialize(&$arr) { - if (\is_object($arr)) { + if (is_object($arr)) { return ''; } - if (!\is_array($arr)) { - return \serialize($arr); + if (!is_array($arr)) { + return serialize($arr); } // prevent circular array recursion if (isset($arr['__phpseclib_marker'])) { return ''; } $safearr = []; - $arr['__phpseclib_marker'] = \true; - foreach (\array_keys($arr) as $key) { + $arr['__phpseclib_marker'] = true; + foreach (array_keys($arr) as $key) { // do not recurse on the '__phpseclib_marker' key itself, for smaller memory usage if ($key !== '__phpseclib_marker') { $safearr[$key] = self::safe_serialize($arr[$key]); } } unset($arr['__phpseclib_marker']); - return \serialize($safearr); + return serialize($safearr); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/Rijndael.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/Rijndael.php index 0643a5e..5d7d89a 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/Rijndael.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/Rijndael.php @@ -49,6 +49,7 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt; use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; @@ -57,11 +58,11 @@ use OCA\Libresign\Vendor\phpseclib3\Exception\BadModeException; use OCA\Libresign\Vendor\phpseclib3\Exception\InconsistentSetupException; use OCA\Libresign\Vendor\phpseclib3\Exception\InsufficientSetupException; + /** * Pure-PHP implementation of Rijndael. * * @author Jim Wigginton - * @internal */ class Rijndael extends BlockCipher { @@ -79,6 +80,7 @@ class Rijndael extends BlockCipher * @var string */ protected $cipher_name_mcrypt = 'rijndael-128'; + /** * The Key Schedule * @@ -86,6 +88,7 @@ class Rijndael extends BlockCipher * @var array */ private $w; + /** * The Inverse Key Schedule * @@ -93,6 +96,7 @@ class Rijndael extends BlockCipher * @var array */ private $dw; + /** * The Block Length divided by 32 * @@ -105,6 +109,7 @@ class Rijndael extends BlockCipher * @var int */ private $Nb = 4; + /** * The Key Length (in bytes) * @@ -117,6 +122,7 @@ class Rijndael extends BlockCipher * @var int */ protected $key_length = 16; + /** * The Key Length divided by 32 * @@ -125,6 +131,7 @@ class Rijndael extends BlockCipher * @internal The max value is 256 / 32 = 8, the min value is 128 / 32 = 4 */ private $Nk = 4; + /** * The Number of Rounds * @@ -133,18 +140,21 @@ class Rijndael extends BlockCipher * @var int */ private $Nr; + /** * Shift offsets * * @var array */ private $c; + /** * Holds the last used key- and block_size information * * @var array */ private $kl; + /** * Default Constructor. * @@ -154,10 +164,12 @@ class Rijndael extends BlockCipher public function __construct($mode) { parent::__construct($mode); + if ($this->mode == self::MODE_STREAM) { throw new BadModeException('Block ciphers cannot be ran in stream mode'); } } + /** * Sets the key length. * @@ -190,8 +202,10 @@ public function setKeyLength($length) default: throw new \LengthException('Key size of ' . $length . ' bits is not supported by this algorithm. Only keys of sizes 128, 160, 192, 224 or 256 bits are supported'); } + parent::setKeyLength($length); } + /** * Sets the key. * @@ -203,7 +217,7 @@ public function setKeyLength($length) */ public function setKey($key) { - switch (\strlen($key)) { + switch (strlen($key)) { case 16: case 20: case 24: @@ -211,10 +225,12 @@ public function setKey($key) case 32: break; default: - throw new \LengthException('Key of size ' . \strlen($key) . ' not supported by this algorithm. Only keys of sizes 16, 20, 24, 28 or 32 are supported'); + throw new \LengthException('Key of size ' . strlen($key) . ' not supported by this algorithm. Only keys of sizes 16, 20, 24, 28 or 32 are supported'); } + parent::setKey($key); } + /** * Sets the block length * @@ -234,11 +250,13 @@ public function setBlockLength($length) default: throw new \LengthException('Key size of ' . $length . ' bits is not supported by this algorithm. Only keys of sizes 128, 160, 192, 224 or 256 bits are supported'); } + $this->Nb = $length >> 5; $this->block_size = $length >> 3; - $this->changed = $this->nonIVChanged = \true; + $this->changed = $this->nonIVChanged = true; $this->setEngine(); } + /** * Test for engine validity * @@ -252,30 +270,39 @@ protected function isValidEngineHelper($engine) { switch ($engine) { case self::ENGINE_LIBSODIUM: - return \function_exists('sodium_crypto_aead_aes256gcm_is_available') && \sodium_crypto_aead_aes256gcm_is_available() && $this->mode == self::MODE_GCM && $this->key_length == 32 && $this->nonce && \strlen($this->nonce) == 12 && $this->block_size == 16; + return function_exists('sodium_crypto_aead_aes256gcm_is_available') && + sodium_crypto_aead_aes256gcm_is_available() && + $this->mode == self::MODE_GCM && + $this->key_length == 32 && + $this->nonce && strlen($this->nonce) == 12 && + $this->block_size == 16; case self::ENGINE_OPENSSL_GCM: - if (!\extension_loaded('openssl')) { - return \false; + if (!extension_loaded('openssl')) { + return false; } - $methods = \openssl_get_cipher_methods(); - return $this->mode == self::MODE_GCM && \version_compare(\PHP_VERSION, '7.1.0', '>=') && \in_array('aes-' . $this->getKeyLength() . '-gcm', $methods) && $this->block_size == 16; + $methods = openssl_get_cipher_methods(); + return $this->mode == self::MODE_GCM && + version_compare(PHP_VERSION, '7.1.0', '>=') && + in_array('aes-' . $this->getKeyLength() . '-gcm', $methods) && + $this->block_size == 16; case self::ENGINE_OPENSSL: if ($this->block_size != 16) { - return \false; + return false; } $this->cipher_name_openssl_ecb = 'aes-' . ($this->key_length << 3) . '-ecb'; $this->cipher_name_openssl = 'aes-' . ($this->key_length << 3) . '-' . $this->openssl_translate_mode(); break; case self::ENGINE_MCRYPT: $this->cipher_name_mcrypt = 'rijndael-' . ($this->block_size << 3); - if ($this->key_length % 8) { - // is it a 160/224-bit key? + if ($this->key_length % 8) { // is it a 160/224-bit key? // mcrypt is not usable for them, only for 128/192/256-bit keys - return \false; + return false; } } + return parent::isValidEngineHelper($engine); } + /** * Encrypts a block * @@ -286,40 +313,49 @@ protected function encryptBlock($in) { static $tables; if (empty($tables)) { - $tables =& $this->getTables(); + $tables = &$this->getTables(); } - $t0 = $tables[0]; - $t1 = $tables[1]; - $t2 = $tables[2]; - $t3 = $tables[3]; + $t0 = $tables[0]; + $t1 = $tables[1]; + $t2 = $tables[2]; + $t3 = $tables[3]; $sbox = $tables[4]; + $state = []; - $words = \unpack('N*', $in); + $words = unpack('N*', $in); + $c = $this->c; $w = $this->w; $Nb = $this->Nb; $Nr = $this->Nr; + // addRoundKey $wc = $Nb - 1; foreach ($words as $word) { $state[] = $word ^ $w[++$wc]; } + // fips-197.pdf#page=19, "Figure 5. Pseudo Code for the Cipher", states that this loop has four components - // subBytes, shiftRows, mixColumns, and addRoundKey. fips-197.pdf#page=30, "Implementation Suggestions Regarding // Various Platforms" suggests that performs enhanced implementations are described in Rijndael-ammended.pdf. // Rijndael-ammended.pdf#page=20, "Implementation aspects / 32-bit processor", discusses such an optimization. // Unfortunately, the description given there is not quite correct. Per aes.spec.v316.pdf#page=19 [1], // equation (7.4.7) is supposed to use addition instead of subtraction, so we'll do that here, as well. + // [1] http://fp.gladman.plus.com/cryptography_technology/rijndael/aes.spec.v316.pdf $temp = []; for ($round = 1; $round < $Nr; ++$round) { - $i = 0; - // $c[0] == 0 + $i = 0; // $c[0] == 0 $j = $c[1]; $k = $c[2]; $l = $c[3]; + while ($i < $Nb) { - $temp[$i] = $t0[$state[$i] >> 24 & 0xff] ^ $t1[$state[$j] >> 16 & 0xff] ^ $t2[$state[$k] >> 8 & 0xff] ^ $t3[$state[$l] & 0xff] ^ $w[++$wc]; + $temp[$i] = $t0[$state[$i] >> 24 & 0x000000FF] ^ + $t1[$state[$j] >> 16 & 0x000000FF] ^ + $t2[$state[$k] >> 8 & 0x000000FF] ^ + $t3[$state[$l] & 0x000000FF] ^ + $w[++$wc]; ++$i; $j = ($j + 1) % $Nb; $k = ($k + 1) % $Nb; @@ -327,25 +363,35 @@ protected function encryptBlock($in) } $state = $temp; } + // subWord for ($i = 0; $i < $Nb; ++$i) { - $state[$i] = $sbox[$state[$i] & 0xff] | $sbox[$state[$i] >> 8 & 0xff] << 8 | $sbox[$state[$i] >> 16 & 0xff] << 16 | $sbox[$state[$i] >> 24 & 0xff] << 24; + $state[$i] = $sbox[$state[$i] & 0x000000FF] | + ($sbox[$state[$i] >> 8 & 0x000000FF] << 8) | + ($sbox[$state[$i] >> 16 & 0x000000FF] << 16) | + ($sbox[$state[$i] >> 24 & 0x000000FF] << 24); } + // shiftRows + addRoundKey - $i = 0; - // $c[0] == 0 + $i = 0; // $c[0] == 0 $j = $c[1]; $k = $c[2]; $l = $c[3]; while ($i < $Nb) { - $temp[$i] = $state[$i] & \intval(0xff000000) ^ $state[$j] & 0xff0000 ^ $state[$k] & 0xff00 ^ $state[$l] & 0xff ^ $w[$i]; + $temp[$i] = ($state[$i] & intval(0xFF000000)) ^ + ($state[$j] & 0x00FF0000) ^ + ($state[$k] & 0x0000FF00) ^ + ($state[$l] & 0x000000FF) ^ + $w[$i]; ++$i; $j = ($j + 1) % $Nb; $k = ($k + 1) % $Nb; $l = ($l + 1) % $Nb; } - return \pack('N*', ...$temp); + + return pack('N*', ...$temp); } + /** * Decrypts a block * @@ -356,33 +402,41 @@ protected function decryptBlock($in) { static $invtables; if (empty($invtables)) { - $invtables =& $this->getInvTables(); + $invtables = &$this->getInvTables(); } - $dt0 = $invtables[0]; - $dt1 = $invtables[1]; - $dt2 = $invtables[2]; - $dt3 = $invtables[3]; + $dt0 = $invtables[0]; + $dt1 = $invtables[1]; + $dt2 = $invtables[2]; + $dt3 = $invtables[3]; $isbox = $invtables[4]; + $state = []; - $words = \unpack('N*', $in); - $c = $this->c; + $words = unpack('N*', $in); + + $c = $this->c; $dw = $this->dw; $Nb = $this->Nb; $Nr = $this->Nr; + // addRoundKey $wc = $Nb - 1; foreach ($words as $word) { $state[] = $word ^ $dw[++$wc]; } + $temp = []; for ($round = $Nr - 1; $round > 0; --$round) { - $i = 0; - // $c[0] == 0 + $i = 0; // $c[0] == 0 $j = $Nb - $c[1]; $k = $Nb - $c[2]; $l = $Nb - $c[3]; + while ($i < $Nb) { - $temp[$i] = $dt0[$state[$i] >> 24 & 0xff] ^ $dt1[$state[$j] >> 16 & 0xff] ^ $dt2[$state[$k] >> 8 & 0xff] ^ $dt3[$state[$l] & 0xff] ^ $dw[++$wc]; + $temp[$i] = $dt0[$state[$i] >> 24 & 0x000000FF] ^ + $dt1[$state[$j] >> 16 & 0x000000FF] ^ + $dt2[$state[$k] >> 8 & 0x000000FF] ^ + $dt3[$state[$l] & 0x000000FF] ^ + $dw[++$wc]; ++$i; $j = ($j + 1) % $Nb; $k = ($k + 1) % $Nb; @@ -390,22 +444,32 @@ protected function decryptBlock($in) } $state = $temp; } + // invShiftRows + invSubWord + addRoundKey - $i = 0; - // $c[0] == 0 + $i = 0; // $c[0] == 0 $j = $Nb - $c[1]; $k = $Nb - $c[2]; $l = $Nb - $c[3]; + while ($i < $Nb) { - $word = $state[$i] & \intval(0xff000000) | $state[$j] & 0xff0000 | $state[$k] & 0xff00 | $state[$l] & 0xff; - $temp[$i] = $dw[$i] ^ ($isbox[$word & 0xff] | $isbox[$word >> 8 & 0xff] << 8 | $isbox[$word >> 16 & 0xff] << 16 | $isbox[$word >> 24 & 0xff] << 24); + $word = ($state[$i] & intval(0xFF000000)) | + ($state[$j] & 0x00FF0000) | + ($state[$k] & 0x0000FF00) | + ($state[$l] & 0x000000FF); + + $temp[$i] = $dw[$i] ^ ($isbox[$word & 0x000000FF] | + ($isbox[$word >> 8 & 0x000000FF] << 8) | + ($isbox[$word >> 16 & 0x000000FF] << 16) | + ($isbox[$word >> 24 & 0x000000FF] << 24)); ++$i; $j = ($j + 1) % $Nb; $k = ($k + 1) % $Nb; $l = ($l + 1) % $Nb; } - return \pack('N*', ...$temp); + + return pack('N*', ...$temp); } + /** * Setup the self::ENGINE_INTERNAL $engine * @@ -436,11 +500,14 @@ protected function setup() if (!$this->changed) { return; } + parent::setup(); - if (\is_string($this->iv) && \strlen($this->iv) != $this->block_size) { - throw new InconsistentSetupException('The IV length (' . \strlen($this->iv) . ') does not match the block size (' . $this->block_size . ')'); + + if (is_string($this->iv) && strlen($this->iv) != $this->block_size) { + throw new InconsistentSetupException('The IV length (' . strlen($this->iv) . ') does not match the block size (' . $this->block_size . ')'); } } + /** * Setup the key (expansion) * @@ -451,18 +518,29 @@ protected function setupKey() // Each number in $rcon is equal to the previous number multiplied by two in Rijndael's finite field. // See http://en.wikipedia.org/wiki/Finite_field_arithmetic#Multiplicative_inverse static $rcon; + if (!isset($rcon)) { - $rcon = [0, 0x1000000, 0x2000000, 0x4000000, 0x8000000, 0x10000000, 0x20000000, 0x40000000, 0x80000000, 0x1b000000, 0x36000000, 0x6c000000, 0xd8000000, 0xab000000, 0x4d000000, 0x9a000000, 0x2f000000, 0x5e000000, 0xbc000000, 0x63000000, 0xc6000000, 0x97000000, 0x35000000, 0x6a000000, 0xd4000000, 0xb3000000, 0x7d000000, 0xfa000000, 0xef000000, 0xc5000000, 0x91000000]; - $rcon = \array_map('intval', $rcon); + $rcon = [0, + 0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000, + 0x20000000, 0x40000000, 0x80000000, 0x1B000000, 0x36000000, + 0x6C000000, 0xD8000000, 0xAB000000, 0x4D000000, 0x9A000000, + 0x2F000000, 0x5E000000, 0xBC000000, 0x63000000, 0xC6000000, + 0x97000000, 0x35000000, 0x6A000000, 0xD4000000, 0xB3000000, + 0x7D000000, 0xFA000000, 0xEF000000, 0xC5000000, 0x91000000 + ]; + $rcon = array_map('intval', $rcon); } + if (isset($this->kl['key']) && $this->key === $this->kl['key'] && $this->key_length === $this->kl['key_length'] && $this->block_size === $this->kl['block_size']) { // already expanded return; } $this->kl = ['key' => $this->key, 'key_length' => $this->key_length, 'block_size' => $this->block_size]; + $this->Nk = $this->key_length >> 2; // see Rijndael-ammended.pdf#page=44 - $this->Nr = \max($this->Nk, $this->Nb) + 6; + $this->Nr = max($this->Nk, $this->Nb) + 6; + // shift offsets for Nb = 5, 7 are defined in Rijndael-ammended.pdf#page=44, // "Table 8: Shift offsets in Shiftrow for the alternative block lengths" // shift offsets for Nb = 4, 6, 8 are defined in Rijndael-ammended.pdf#page=14, @@ -479,7 +557,9 @@ protected function setupKey() case 8: $this->c = [0, 1, 3, 4]; } - $w = \array_values(\unpack('N*words', $this->key)); + + $w = array_values(unpack('N*words', $this->key)); + $length = $this->Nb * ($this->Nr + 1); for ($i = $this->Nk; $i < $length; $i++) { $temp = $w[$i - 1]; @@ -488,14 +568,14 @@ protected function setupKey() // on a 32-bit machine, it's 32-bits, and on a 64-bit machine, it's 64-bits. on a 32-bit machine, // 0xFFFFFFFF << 8 == 0xFFFFFF00, but on a 64-bit machine, it equals 0xFFFFFFFF00. as such, doing 'and' // with 0xFFFFFFFF (or 0xFFFFFF00) on a 32-bit machine is unnecessary, but on a 64-bit machine, it is. - $temp = $temp << 8 & \intval(0xffffff00) | $temp >> 24 & 0xff; - // rotWord + $temp = (($temp << 8) & intval(0xFFFFFF00)) | (($temp >> 24) & 0x000000FF); // rotWord $temp = $this->subWord($temp) ^ $rcon[$i / $this->Nk]; } elseif ($this->Nk > 6 && $i % $this->Nk == 4) { $temp = $this->subWord($temp); } $w[$i] = $w[$i - $this->Nk] ^ $temp; } + // convert the key schedule from a vector of $Nb * ($Nr + 1) length to a matrix with $Nr + 1 rows and $Nb columns // and generate the inverse key schedule. more specifically, // according to (section 5.3.3), @@ -514,30 +594,37 @@ protected function setupKey() $j = 0; while ($j < $this->Nb) { $dw = $this->subWord($this->w[$row][$j]); - $temp[$j] = $dt0[$dw >> 24 & 0xff] ^ $dt1[$dw >> 16 & 0xff] ^ $dt2[$dw >> 8 & 0xff] ^ $dt3[$dw & 0xff]; + $temp[$j] = $dt0[$dw >> 24 & 0x000000FF] ^ + $dt1[$dw >> 16 & 0x000000FF] ^ + $dt2[$dw >> 8 & 0x000000FF] ^ + $dt3[$dw & 0x000000FF]; $j++; } $this->dw[$row] = $temp; } + $col = 0; $row++; } $this->w[$row][$col] = $w[$i]; } + $this->dw[$row] = $this->w[$row]; + // Converting to 1-dim key arrays (both ascending) - $this->dw = \array_reverse($this->dw); - $w = \array_pop($this->w); - $dw = \array_pop($this->dw); + $this->dw = array_reverse($this->dw); + $w = array_pop($this->w); + $dw = array_pop($this->dw); foreach ($this->w as $r => $wr) { foreach ($wr as $c => $wc) { - $w[] = $wc; + $w[] = $wc; $dw[] = $this->dw[$r][$c]; } } - $this->w = $w; + $this->w = $w; $this->dw = $dw; } + /** * Performs S-Box substitutions * @@ -550,8 +637,13 @@ private function subWord($word) if (empty($sbox)) { list(, , , , $sbox) = self::getTables(); } - return $sbox[$word & 0xff] | $sbox[$word >> 8 & 0xff] << 8 | $sbox[$word >> 16 & 0xff] << 16 | $sbox[$word >> 24 & 0xff] << 24; + + return $sbox[$word & 0x000000FF] | + ($sbox[$word >> 8 & 0x000000FF] << 8) | + ($sbox[$word >> 16 & 0x000000FF] << 16) | + ($sbox[$word >> 24 & 0x000000FF] << 24); } + /** * Provides the mixColumns and sboxes tables * @@ -567,271 +659,49 @@ protected function &getTables() // according to (section 5.2.1), // precomputed tables can be used in the mixColumns phase. in that example, they're assigned t0...t3, so // those are the names we'll use. - $t3 = \array_map('intval', [ + $t3 = array_map('intval', [ // with array_map('intval', ...) we ensure we have only int's and not // some slower floats converted by php automatically on high values - 0x6363a5c6, - 0x7c7c84f8, - 0x777799ee, - 0x7b7b8df6, - 0xf2f20dff, - 0x6b6bbdd6, - 0x6f6fb1de, - 0xc5c55491, - 0x30305060, - 0x1010302, - 0x6767a9ce, - 0x2b2b7d56, - 0xfefe19e7, - 0xd7d762b5, - 0xababe64d, - 0x76769aec, - 0xcaca458f, - 0x82829d1f, - 0xc9c94089, - 0x7d7d87fa, - 0xfafa15ef, - 0x5959ebb2, - 0x4747c98e, - 0xf0f00bfb, - 0xadadec41, - 0xd4d467b3, - 0xa2a2fd5f, - 0xafafea45, - 0x9c9cbf23, - 0xa4a4f753, - 0x727296e4, - 0xc0c05b9b, - 0xb7b7c275, - 0xfdfd1ce1, - 0x9393ae3d, - 0x26266a4c, - 0x36365a6c, - 0x3f3f417e, - 0xf7f702f5, - 0xcccc4f83, - 0x34345c68, - 0xa5a5f451, - 0xe5e534d1, - 0xf1f108f9, - 0x717193e2, - 0xd8d873ab, - 0x31315362, - 0x15153f2a, - 0x4040c08, - 0xc7c75295, - 0x23236546, - 0xc3c35e9d, - 0x18182830, - 0x9696a137, - 0x5050f0a, - 0x9a9ab52f, - 0x707090e, - 0x12123624, - 0x80809b1b, - 0xe2e23ddf, - 0xebeb26cd, - 0x2727694e, - 0xb2b2cd7f, - 0x75759fea, - 0x9091b12, - 0x83839e1d, - 0x2c2c7458, - 0x1a1a2e34, - 0x1b1b2d36, - 0x6e6eb2dc, - 0x5a5aeeb4, - 0xa0a0fb5b, - 0x5252f6a4, - 0x3b3b4d76, - 0xd6d661b7, - 0xb3b3ce7d, - 0x29297b52, - 0xe3e33edd, - 0x2f2f715e, - 0x84849713, - 0x5353f5a6, - 0xd1d168b9, - 0x0, - 0xeded2cc1, - 0x20206040, - 0xfcfc1fe3, - 0xb1b1c879, - 0x5b5bedb6, - 0x6a6abed4, - 0xcbcb468d, - 0xbebed967, - 0x39394b72, - 0x4a4ade94, - 0x4c4cd498, - 0x5858e8b0, - 0xcfcf4a85, - 0xd0d06bbb, - 0xefef2ac5, - 0xaaaae54f, - 0xfbfb16ed, - 0x4343c586, - 0x4d4dd79a, - 0x33335566, - 0x85859411, - 0x4545cf8a, - 0xf9f910e9, - 0x2020604, - 0x7f7f81fe, - 0x5050f0a0, - 0x3c3c4478, - 0x9f9fba25, - 0xa8a8e34b, - 0x5151f3a2, - 0xa3a3fe5d, - 0x4040c080, - 0x8f8f8a05, - 0x9292ad3f, - 0x9d9dbc21, - 0x38384870, - 0xf5f504f1, - 0xbcbcdf63, - 0xb6b6c177, - 0xdada75af, - 0x21216342, - 0x10103020, - 0xffff1ae5, - 0xf3f30efd, - 0xd2d26dbf, - 0xcdcd4c81, - 0xc0c1418, - 0x13133526, - 0xecec2fc3, - 0x5f5fe1be, - 0x9797a235, - 0x4444cc88, - 0x1717392e, - 0xc4c45793, - 0xa7a7f255, - 0x7e7e82fc, - 0x3d3d477a, - 0x6464acc8, - 0x5d5de7ba, - 0x19192b32, - 0x737395e6, - 0x6060a0c0, - 0x81819819, - 0x4f4fd19e, - 0xdcdc7fa3, - 0x22226644, - 0x2a2a7e54, - 0x9090ab3b, - 0x8888830b, - 0x4646ca8c, - 0xeeee29c7, - 0xb8b8d36b, - 0x14143c28, - 0xdede79a7, - 0x5e5ee2bc, - 0xb0b1d16, - 0xdbdb76ad, - 0xe0e03bdb, - 0x32325664, - 0x3a3a4e74, - 0xa0a1e14, - 0x4949db92, - 0x6060a0c, - 0x24246c48, - 0x5c5ce4b8, - 0xc2c25d9f, - 0xd3d36ebd, - 0xacacef43, - 0x6262a6c4, - 0x9191a839, - 0x9595a431, - 0xe4e437d3, - 0x79798bf2, - 0xe7e732d5, - 0xc8c8438b, - 0x3737596e, - 0x6d6db7da, - 0x8d8d8c01, - 0xd5d564b1, - 0x4e4ed29c, - 0xa9a9e049, - 0x6c6cb4d8, - 0x5656faac, - 0xf4f407f3, - 0xeaea25cf, - 0x6565afca, - 0x7a7a8ef4, - 0xaeaee947, - 0x8081810, - 0xbabad56f, - 0x787888f0, - 0x25256f4a, - 0x2e2e725c, - 0x1c1c2438, - 0xa6a6f157, - 0xb4b4c773, - 0xc6c65197, - 0xe8e823cb, - 0xdddd7ca1, - 0x74749ce8, - 0x1f1f213e, - 0x4b4bdd96, - 0xbdbddc61, - 0x8b8b860d, - 0x8a8a850f, - 0x707090e0, - 0x3e3e427c, - 0xb5b5c471, - 0x6666aacc, - 0x4848d890, - 0x3030506, - 0xf6f601f7, - 0xe0e121c, - 0x6161a3c2, - 0x35355f6a, - 0x5757f9ae, - 0xb9b9d069, - 0x86869117, - 0xc1c15899, - 0x1d1d273a, - 0x9e9eb927, - 0xe1e138d9, - 0xf8f813eb, - 0x9898b32b, - 0x11113322, - 0x6969bbd2, - 0xd9d970a9, - 0x8e8e8907, - 0x9494a733, - 0x9b9bb62d, - 0x1e1e223c, - 0x87879215, - 0xe9e920c9, - 0xcece4987, - 0x5555ffaa, - 0x28287850, - 0xdfdf7aa5, - 0x8c8c8f03, - 0xa1a1f859, - 0x89898009, - 0xd0d171a, - 0xbfbfda65, - 0xe6e631d7, - 0x4242c684, - 0x6868b8d0, - 0x4141c382, - 0x9999b029, - 0x2d2d775a, - 0xf0f111e, - 0xb0b0cb7b, - 0x5454fca8, - 0xbbbbd66d, - 0x16163a2c, + 0x6363A5C6, 0x7C7C84F8, 0x777799EE, 0x7B7B8DF6, 0xF2F20DFF, 0x6B6BBDD6, 0x6F6FB1DE, 0xC5C55491, + 0x30305060, 0x01010302, 0x6767A9CE, 0x2B2B7D56, 0xFEFE19E7, 0xD7D762B5, 0xABABE64D, 0x76769AEC, + 0xCACA458F, 0x82829D1F, 0xC9C94089, 0x7D7D87FA, 0xFAFA15EF, 0x5959EBB2, 0x4747C98E, 0xF0F00BFB, + 0xADADEC41, 0xD4D467B3, 0xA2A2FD5F, 0xAFAFEA45, 0x9C9CBF23, 0xA4A4F753, 0x727296E4, 0xC0C05B9B, + 0xB7B7C275, 0xFDFD1CE1, 0x9393AE3D, 0x26266A4C, 0x36365A6C, 0x3F3F417E, 0xF7F702F5, 0xCCCC4F83, + 0x34345C68, 0xA5A5F451, 0xE5E534D1, 0xF1F108F9, 0x717193E2, 0xD8D873AB, 0x31315362, 0x15153F2A, + 0x04040C08, 0xC7C75295, 0x23236546, 0xC3C35E9D, 0x18182830, 0x9696A137, 0x05050F0A, 0x9A9AB52F, + 0x0707090E, 0x12123624, 0x80809B1B, 0xE2E23DDF, 0xEBEB26CD, 0x2727694E, 0xB2B2CD7F, 0x75759FEA, + 0x09091B12, 0x83839E1D, 0x2C2C7458, 0x1A1A2E34, 0x1B1B2D36, 0x6E6EB2DC, 0x5A5AEEB4, 0xA0A0FB5B, + 0x5252F6A4, 0x3B3B4D76, 0xD6D661B7, 0xB3B3CE7D, 0x29297B52, 0xE3E33EDD, 0x2F2F715E, 0x84849713, + 0x5353F5A6, 0xD1D168B9, 0x00000000, 0xEDED2CC1, 0x20206040, 0xFCFC1FE3, 0xB1B1C879, 0x5B5BEDB6, + 0x6A6ABED4, 0xCBCB468D, 0xBEBED967, 0x39394B72, 0x4A4ADE94, 0x4C4CD498, 0x5858E8B0, 0xCFCF4A85, + 0xD0D06BBB, 0xEFEF2AC5, 0xAAAAE54F, 0xFBFB16ED, 0x4343C586, 0x4D4DD79A, 0x33335566, 0x85859411, + 0x4545CF8A, 0xF9F910E9, 0x02020604, 0x7F7F81FE, 0x5050F0A0, 0x3C3C4478, 0x9F9FBA25, 0xA8A8E34B, + 0x5151F3A2, 0xA3A3FE5D, 0x4040C080, 0x8F8F8A05, 0x9292AD3F, 0x9D9DBC21, 0x38384870, 0xF5F504F1, + 0xBCBCDF63, 0xB6B6C177, 0xDADA75AF, 0x21216342, 0x10103020, 0xFFFF1AE5, 0xF3F30EFD, 0xD2D26DBF, + 0xCDCD4C81, 0x0C0C1418, 0x13133526, 0xECEC2FC3, 0x5F5FE1BE, 0x9797A235, 0x4444CC88, 0x1717392E, + 0xC4C45793, 0xA7A7F255, 0x7E7E82FC, 0x3D3D477A, 0x6464ACC8, 0x5D5DE7BA, 0x19192B32, 0x737395E6, + 0x6060A0C0, 0x81819819, 0x4F4FD19E, 0xDCDC7FA3, 0x22226644, 0x2A2A7E54, 0x9090AB3B, 0x8888830B, + 0x4646CA8C, 0xEEEE29C7, 0xB8B8D36B, 0x14143C28, 0xDEDE79A7, 0x5E5EE2BC, 0x0B0B1D16, 0xDBDB76AD, + 0xE0E03BDB, 0x32325664, 0x3A3A4E74, 0x0A0A1E14, 0x4949DB92, 0x06060A0C, 0x24246C48, 0x5C5CE4B8, + 0xC2C25D9F, 0xD3D36EBD, 0xACACEF43, 0x6262A6C4, 0x9191A839, 0x9595A431, 0xE4E437D3, 0x79798BF2, + 0xE7E732D5, 0xC8C8438B, 0x3737596E, 0x6D6DB7DA, 0x8D8D8C01, 0xD5D564B1, 0x4E4ED29C, 0xA9A9E049, + 0x6C6CB4D8, 0x5656FAAC, 0xF4F407F3, 0xEAEA25CF, 0x6565AFCA, 0x7A7A8EF4, 0xAEAEE947, 0x08081810, + 0xBABAD56F, 0x787888F0, 0x25256F4A, 0x2E2E725C, 0x1C1C2438, 0xA6A6F157, 0xB4B4C773, 0xC6C65197, + 0xE8E823CB, 0xDDDD7CA1, 0x74749CE8, 0x1F1F213E, 0x4B4BDD96, 0xBDBDDC61, 0x8B8B860D, 0x8A8A850F, + 0x707090E0, 0x3E3E427C, 0xB5B5C471, 0x6666AACC, 0x4848D890, 0x03030506, 0xF6F601F7, 0x0E0E121C, + 0x6161A3C2, 0x35355F6A, 0x5757F9AE, 0xB9B9D069, 0x86869117, 0xC1C15899, 0x1D1D273A, 0x9E9EB927, + 0xE1E138D9, 0xF8F813EB, 0x9898B32B, 0x11113322, 0x6969BBD2, 0xD9D970A9, 0x8E8E8907, 0x9494A733, + 0x9B9BB62D, 0x1E1E223C, 0x87879215, 0xE9E920C9, 0xCECE4987, 0x5555FFAA, 0x28287850, 0xDFDF7AA5, + 0x8C8C8F03, 0xA1A1F859, 0x89898009, 0x0D0D171A, 0xBFBFDA65, 0xE6E631D7, 0x4242C684, 0x6868B8D0, + 0x4141C382, 0x9999B029, 0x2D2D775A, 0x0F0F111E, 0xB0B0CB7B, 0x5454FCA8, 0xBBBBD66D, 0x16163A2C ]); + foreach ($t3 as $t3i) { - $t0[] = $t3i << 24 & \intval(0xff000000) | $t3i >> 8 & 0xffffff; - $t1[] = $t3i << 16 & \intval(0xffff0000) | $t3i >> 16 & 0xffff; - $t2[] = $t3i << 8 & \intval(0xffffff00) | $t3i >> 24 & 0xff; + $t0[] = (($t3i << 24) & intval(0xFF000000)) | (($t3i >> 8) & 0x00FFFFFF); + $t1[] = (($t3i << 16) & intval(0xFFFF0000)) | (($t3i >> 16) & 0x0000FFFF); + $t2[] = (($t3i << 8) & intval(0xFFFFFF00)) | (($t3i >> 24) & 0x000000FF); } + $tables = [ // The Precomputed mixColumns tables t0 - t3 $t0, @@ -839,11 +709,29 @@ protected function &getTables() $t2, $t3, // The SubByte S-Box - [0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x1, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, 0x4, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x5, 0x9a, 0x7, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, 0x9, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, 0x53, 0xd1, 0x0, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x2, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, 0xcd, 0xc, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0xb, 0xdb, 0xe0, 0x32, 0x3a, 0xa, 0x49, 0x6, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x8, 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x3, 0xf6, 0xe, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, 0x8c, 0xa1, 0x89, 0xd, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0xf, 0xb0, 0x54, 0xbb, 0x16], + [ + 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76, + 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, + 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15, + 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75, + 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, + 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF, + 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8, + 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, + 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73, + 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB, + 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79, + 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08, + 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A, + 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, + 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF, + 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16 + ] ]; } return $tables; } + /** * Provides the inverse mixColumns and inverse sboxes tables * @@ -856,12 +744,47 @@ protected function &getInvTables() { static $tables; if (empty($tables)) { - $dt3 = \array_map('intval', [0xf4a75051, 0x4165537e, 0x17a4c31a, 0x275e963a, 0xab6bcb3b, 0x9d45f11f, 0xfa58abac, 0xe303934b, 0x30fa5520, 0x766df6ad, 0xcc769188, 0x24c25f5, 0xe5d7fc4f, 0x2acbd7c5, 0x35448026, 0x62a38fb5, 0xb15a49de, 0xba1b6725, 0xea0e9845, 0xfec0e15d, 0x2f7502c3, 0x4cf01281, 0x4697a38d, 0xd3f9c66b, 0x8f5fe703, 0x929c9515, 0x6d7aebbf, 0x5259da95, 0xbe832dd4, 0x7421d358, 0xe0692949, 0xc9c8448e, 0xc2896a75, 0x8e7978f4, 0x583e6b99, 0xb971dd27, 0xe14fb6be, 0x88ad17f0, 0x20ac66c9, 0xce3ab47d, 0xdf4a1863, 0x1a3182e5, 0x51336097, 0x537f4562, 0x6477e0b1, 0x6bae84bb, 0x81a01cfe, 0x82b94f9, 0x48685870, 0x45fd198f, 0xde6c8794, 0x7bf8b752, 0x73d323ab, 0x4b02e272, 0x1f8f57e3, 0x55ab2a66, 0xeb2807b2, 0xb5c2032f, 0xc57b9a86, 0x3708a5d3, 0x2887f230, 0xbfa5b223, 0x36aba02, 0x16825ced, 0xcf1c2b8a, 0x79b492a7, 0x7f2f0f3, 0x69e2a14e, 0xdaf4cd65, 0x5bed506, 0x34621fd1, 0xa6fe8ac4, 0x2e539d34, 0xf355a0a2, 0x8ae13205, 0xf6eb75a4, 0x83ec390b, 0x60efaa40, 0x719f065e, 0x6e1051bd, 0x218af93e, 0xdd063d96, 0x3e05aedd, 0xe6bd464d, 0x548db591, 0xc45d0571, 0x6d46f04, 0x5015ff60, 0x98fb2419, 0xbde997d6, 0x4043cc89, 0xd99e7767, 0xe842bdb0, 0x898b8807, 0x195b38e7, 0xc8eedb79, 0x7c0a47a1, 0x420fe97c, 0x841ec9f8, 0x0, 0x80868309, 0x2bed4832, 0x1170ac1e, 0x5a724e6c, 0xefffbfd, 0x8538560f, 0xaed51e3d, 0x2d392736, 0xfd9640a, 0x5ca62168, 0x5b54d19b, 0x362e3a24, 0xa67b10c, 0x57e70f93, 0xee96d2b4, 0x9b919e1b, 0xc0c54f80, 0xdc20a261, 0x774b695a, 0x121a161c, 0x93ba0ae2, 0xa02ae5c0, 0x22e0433c, 0x1b171d12, 0x90d0b0e, 0x8bc7adf2, 0xb6a8b92d, 0x1ea9c814, 0xf1198557, 0x75074caf, 0x99ddbbee, 0x7f60fda3, 0x1269ff7, 0x72f5bc5c, 0x663bc544, 0xfb7e345b, 0x4329768b, 0x23c6dccb, 0xedfc68b6, 0xe4f163b8, 0x31dccad7, 0x63851042, 0x97224013, 0xc6112084, 0x4a247d85, 0xbb3df8d2, 0xf93211ae, 0x29a16dc7, 0x9e2f4b1d, 0xb230f3dc, 0x8652ec0d, 0xc1e3d077, 0xb3166c2b, 0x70b999a9, 0x9448fa11, 0xe9642247, 0xfc8cc4a8, 0xf03f1aa0, 0x7d2cd856, 0x3390ef22, 0x494ec787, 0x38d1c1d9, 0xcaa2fe8c, 0xd40b3698, 0xf581cfa6, 0x7ade28a5, 0xb78e26da, 0xadbfa43f, 0x3a9de42c, 0x78920d50, 0x5fcc9b6a, 0x7e466254, 0x8d13c2f6, 0xd8b8e890, 0x39f75e2e, 0xc3aff582, 0x5d80be9f, 0xd0937c69, 0xd52da96f, 0x2512b3cf, 0xac993bc8, 0x187da710, 0x9c636ee8, 0x3bbb7bdb, 0x267809cd, 0x5918f46e, 0x9ab701ec, 0x4f9aa883, 0x956e65e6, 0xffe67eaa, 0xbccf0821, 0x15e8e6ef, 0xe79bd9ba, 0x6f36ce4a, 0x9f09d4ea, 0xb07cd629, 0xa4b2af31, 0x3f23312a, 0xa59430c6, 0xa266c035, 0x4ebc3774, 0x82caa6fc, 0x90d0b0e0, 0xa7d81533, 0x4984af1, 0xecdaf741, 0xcd500e7f, 0x91f62f17, 0x4dd68d76, 0xefb04d43, 0xaa4d54cc, 0x9604dfe4, 0xd1b5e39e, 0x6a881b4c, 0x2c1fb8c1, 0x65517f46, 0x5eea049d, 0x8c355d01, 0x877473fa, 0xb412efb, 0x671d5ab3, 0xdbd25292, 0x105633e9, 0xd647136d, 0xd7618c9a, 0xa10c7a37, 0xf8148e59, 0x133c89eb, 0xa927eece, 0x61c935b7, 0x1ce5ede1, 0x47b13c7a, 0xd2df599c, 0xf2733f55, 0x14ce7918, 0xc737bf73, 0xf7cdea53, 0xfdaa5b5f, 0x3d6f14df, 0x44db8678, 0xaff381ca, 0x68c43eb9, 0x24342c38, 0xa3405fc2, 0x1dc37216, 0xe2250cbc, 0x3c498b28, 0xd9541ff, 0xa8017139, 0xcb3de08, 0xb4e49cd8, 0x56c19064, 0xcb84617b, 0x32b670d5, 0x6c5c7448, 0xb85742d0]); + $dt3 = array_map('intval', [ + 0xF4A75051, 0x4165537E, 0x17A4C31A, 0x275E963A, 0xAB6BCB3B, 0x9D45F11F, 0xFA58ABAC, 0xE303934B, + 0x30FA5520, 0x766DF6AD, 0xCC769188, 0x024C25F5, 0xE5D7FC4F, 0x2ACBD7C5, 0x35448026, 0x62A38FB5, + 0xB15A49DE, 0xBA1B6725, 0xEA0E9845, 0xFEC0E15D, 0x2F7502C3, 0x4CF01281, 0x4697A38D, 0xD3F9C66B, + 0x8F5FE703, 0x929C9515, 0x6D7AEBBF, 0x5259DA95, 0xBE832DD4, 0x7421D358, 0xE0692949, 0xC9C8448E, + 0xC2896A75, 0x8E7978F4, 0x583E6B99, 0xB971DD27, 0xE14FB6BE, 0x88AD17F0, 0x20AC66C9, 0xCE3AB47D, + 0xDF4A1863, 0x1A3182E5, 0x51336097, 0x537F4562, 0x6477E0B1, 0x6BAE84BB, 0x81A01CFE, 0x082B94F9, + 0x48685870, 0x45FD198F, 0xDE6C8794, 0x7BF8B752, 0x73D323AB, 0x4B02E272, 0x1F8F57E3, 0x55AB2A66, + 0xEB2807B2, 0xB5C2032F, 0xC57B9A86, 0x3708A5D3, 0x2887F230, 0xBFA5B223, 0x036ABA02, 0x16825CED, + 0xCF1C2B8A, 0x79B492A7, 0x07F2F0F3, 0x69E2A14E, 0xDAF4CD65, 0x05BED506, 0x34621FD1, 0xA6FE8AC4, + 0x2E539D34, 0xF355A0A2, 0x8AE13205, 0xF6EB75A4, 0x83EC390B, 0x60EFAA40, 0x719F065E, 0x6E1051BD, + 0x218AF93E, 0xDD063D96, 0x3E05AEDD, 0xE6BD464D, 0x548DB591, 0xC45D0571, 0x06D46F04, 0x5015FF60, + 0x98FB2419, 0xBDE997D6, 0x4043CC89, 0xD99E7767, 0xE842BDB0, 0x898B8807, 0x195B38E7, 0xC8EEDB79, + 0x7C0A47A1, 0x420FE97C, 0x841EC9F8, 0x00000000, 0x80868309, 0x2BED4832, 0x1170AC1E, 0x5A724E6C, + 0x0EFFFBFD, 0x8538560F, 0xAED51E3D, 0x2D392736, 0x0FD9640A, 0x5CA62168, 0x5B54D19B, 0x362E3A24, + 0x0A67B10C, 0x57E70F93, 0xEE96D2B4, 0x9B919E1B, 0xC0C54F80, 0xDC20A261, 0x774B695A, 0x121A161C, + 0x93BA0AE2, 0xA02AE5C0, 0x22E0433C, 0x1B171D12, 0x090D0B0E, 0x8BC7ADF2, 0xB6A8B92D, 0x1EA9C814, + 0xF1198557, 0x75074CAF, 0x99DDBBEE, 0x7F60FDA3, 0x01269FF7, 0x72F5BC5C, 0x663BC544, 0xFB7E345B, + 0x4329768B, 0x23C6DCCB, 0xEDFC68B6, 0xE4F163B8, 0x31DCCAD7, 0x63851042, 0x97224013, 0xC6112084, + 0x4A247D85, 0xBB3DF8D2, 0xF93211AE, 0x29A16DC7, 0x9E2F4B1D, 0xB230F3DC, 0x8652EC0D, 0xC1E3D077, + 0xB3166C2B, 0x70B999A9, 0x9448FA11, 0xE9642247, 0xFC8CC4A8, 0xF03F1AA0, 0x7D2CD856, 0x3390EF22, + 0x494EC787, 0x38D1C1D9, 0xCAA2FE8C, 0xD40B3698, 0xF581CFA6, 0x7ADE28A5, 0xB78E26DA, 0xADBFA43F, + 0x3A9DE42C, 0x78920D50, 0x5FCC9B6A, 0x7E466254, 0x8D13C2F6, 0xD8B8E890, 0x39F75E2E, 0xC3AFF582, + 0x5D80BE9F, 0xD0937C69, 0xD52DA96F, 0x2512B3CF, 0xAC993BC8, 0x187DA710, 0x9C636EE8, 0x3BBB7BDB, + 0x267809CD, 0x5918F46E, 0x9AB701EC, 0x4F9AA883, 0x956E65E6, 0xFFE67EAA, 0xBCCF0821, 0x15E8E6EF, + 0xE79BD9BA, 0x6F36CE4A, 0x9F09D4EA, 0xB07CD629, 0xA4B2AF31, 0x3F23312A, 0xA59430C6, 0xA266C035, + 0x4EBC3774, 0x82CAA6FC, 0x90D0B0E0, 0xA7D81533, 0x04984AF1, 0xECDAF741, 0xCD500E7F, 0x91F62F17, + 0x4DD68D76, 0xEFB04D43, 0xAA4D54CC, 0x9604DFE4, 0xD1B5E39E, 0x6A881B4C, 0x2C1FB8C1, 0x65517F46, + 0x5EEA049D, 0x8C355D01, 0x877473FA, 0x0B412EFB, 0x671D5AB3, 0xDBD25292, 0x105633E9, 0xD647136D, + 0xD7618C9A, 0xA10C7A37, 0xF8148E59, 0x133C89EB, 0xA927EECE, 0x61C935B7, 0x1CE5EDE1, 0x47B13C7A, + 0xD2DF599C, 0xF2733F55, 0x14CE7918, 0xC737BF73, 0xF7CDEA53, 0xFDAA5B5F, 0x3D6F14DF, 0x44DB8678, + 0xAFF381CA, 0x68C43EB9, 0x24342C38, 0xA3405FC2, 0x1DC37216, 0xE2250CBC, 0x3C498B28, 0x0D9541FF, + 0xA8017139, 0x0CB3DE08, 0xB4E49CD8, 0x56C19064, 0xCB84617B, 0x32B670D5, 0x6C5C7448, 0xB85742D0 + ]); + foreach ($dt3 as $dt3i) { - $dt0[] = $dt3i << 24 & \intval(0xff000000) | $dt3i >> 8 & 0xffffff; - $dt1[] = $dt3i << 16 & \intval(0xffff0000) | $dt3i >> 16 & 0xffff; - $dt2[] = $dt3i << 8 & \intval(0xffffff00) | $dt3i >> 24 & 0xff; - } + $dt0[] = (($dt3i << 24) & intval(0xFF000000)) | (($dt3i >> 8) & 0x00FFFFFF); + $dt1[] = (($dt3i << 16) & intval(0xFFFF0000)) | (($dt3i >> 16) & 0x0000FFFF); + $dt2[] = (($dt3i << 8) & intval(0xFFFFFF00)) | (($dt3i >> 24) & 0x000000FF); + }; + $tables = [ // The Precomputed inverse mixColumns tables dt0 - dt3 $dt0, @@ -869,11 +792,29 @@ protected function &getInvTables() $dt2, $dt3, // The inverse SubByte S-Box - [0x52, 0x9, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb, 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb, 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0xb, 0x42, 0xfa, 0xc3, 0x4e, 0x8, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25, 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92, 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84, 0x90, 0xd8, 0xab, 0x0, 0x8c, 0xbc, 0xd3, 0xa, 0xf7, 0xe4, 0x58, 0x5, 0xb8, 0xb3, 0x45, 0x6, 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0xf, 0x2, 0xc1, 0xaf, 0xbd, 0x3, 0x1, 0x13, 0x8a, 0x6b, 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73, 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e, 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0xe, 0xaa, 0x18, 0xbe, 0x1b, 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4, 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x7, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f, 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0xd, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef, 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61, 0x17, 0x2b, 0x4, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0xc, 0x7d], + [ + 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB, + 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB, + 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E, + 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25, + 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92, + 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84, + 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06, + 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, + 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73, + 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E, + 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B, + 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4, + 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F, + 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, + 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61, + 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D + ] ]; } return $tables; } + /** * Setup the performance-optimized function for de/encrypt() * @@ -881,13 +822,15 @@ protected function &getInvTables() */ protected function setupInlineCrypt() { - $w = $this->w; + $w = $this->w; $dw = $this->dw; $init_encrypt = ''; $init_decrypt = ''; + $Nr = $this->Nr; $Nb = $this->Nb; - $c = $this->c; + $c = $this->c; + // Generating encrypt code: $init_encrypt .= ' if (empty($tables)) { @@ -899,29 +842,35 @@ protected function setupInlineCrypt() $t3 = $tables[3]; $sbox = $tables[4]; '; - $s = 'e'; - $e = 's'; + + $s = 'e'; + $e = 's'; $wc = $Nb - 1; + // Preround: addRoundKey $encrypt_block = '$in = unpack("N*", $in);' . "\n"; for ($i = 0; $i < $Nb; ++$i) { $encrypt_block .= '$s' . $i . ' = $in[' . ($i + 1) . '] ^ ' . $w[++$wc] . ";\n"; } + // Mainrounds: shiftRows + subWord + mixColumns + addRoundKey for ($round = 1; $round < $Nr; ++$round) { list($s, $e) = [$e, $s]; for ($i = 0; $i < $Nb; ++$i) { - $encrypt_block .= '$' . $e . $i . ' = - $t0[($' . $s . $i . ' >> 24) & 0xff] ^ - $t1[($' . $s . ($i + $c[1]) % $Nb . ' >> 16) & 0xff] ^ - $t2[($' . $s . ($i + $c[2]) % $Nb . ' >> 8) & 0xff] ^ - $t3[ $' . $s . ($i + $c[3]) % $Nb . ' & 0xff] ^ + $encrypt_block .= + '$' . $e . $i . ' = + $t0[($' . $s . $i . ' >> 24) & 0xff] ^ + $t1[($' . $s . (($i + $c[1]) % $Nb) . ' >> 16) & 0xff] ^ + $t2[($' . $s . (($i + $c[2]) % $Nb) . ' >> 8) & 0xff] ^ + $t3[ $' . $s . (($i + $c[3]) % $Nb) . ' & 0xff] ^ ' . $w[++$wc] . ";\n"; } } + // Finalround: subWord + shiftRows + addRoundKey for ($i = 0; $i < $Nb; ++$i) { - $encrypt_block .= '$' . $e . $i . ' = + $encrypt_block .= + '$' . $e . $i . ' = $sbox[ $' . $e . $i . ' & 0xff] | ($sbox[($' . $e . $i . ' >> 8) & 0xff] << 8) | ($sbox[($' . $e . $i . ' >> 16) & 0xff] << 16) | @@ -930,13 +879,14 @@ protected function setupInlineCrypt() $encrypt_block .= '$in = pack("N*"' . "\n"; for ($i = 0; $i < $Nb; ++$i) { $encrypt_block .= ', - ($' . $e . $i . ' & ' . (int) 0xff000000 . ') ^ - ($' . $e . ($i + $c[1]) % $Nb . ' & 0x00FF0000 ) ^ - ($' . $e . ($i + $c[2]) % $Nb . ' & 0x0000FF00 ) ^ - ($' . $e . ($i + $c[3]) % $Nb . ' & 0x000000FF ) ^ + ($' . $e . $i . ' & ' . ((int)0xFF000000) . ') ^ + ($' . $e . (($i + $c[1]) % $Nb) . ' & 0x00FF0000 ) ^ + ($' . $e . (($i + $c[2]) % $Nb) . ' & 0x0000FF00 ) ^ + ($' . $e . (($i + $c[3]) % $Nb) . ' & 0x000000FF ) ^ ' . $w[$i] . "\n"; } $encrypt_block .= ');'; + // Generating decrypt code: $init_decrypt .= ' if (empty($invtables)) { @@ -948,29 +898,35 @@ protected function setupInlineCrypt() $dt3 = $invtables[3]; $isbox = $invtables[4]; '; - $s = 'e'; - $e = 's'; + + $s = 'e'; + $e = 's'; $wc = $Nb - 1; + // Preround: addRoundKey $decrypt_block = '$in = unpack("N*", $in);' . "\n"; for ($i = 0; $i < $Nb; ++$i) { $decrypt_block .= '$s' . $i . ' = $in[' . ($i + 1) . '] ^ ' . $dw[++$wc] . ';' . "\n"; } + // Mainrounds: shiftRows + subWord + mixColumns + addRoundKey for ($round = 1; $round < $Nr; ++$round) { list($s, $e) = [$e, $s]; for ($i = 0; $i < $Nb; ++$i) { - $decrypt_block .= '$' . $e . $i . ' = - $dt0[($' . $s . $i . ' >> 24) & 0xff] ^ - $dt1[($' . $s . ($Nb + $i - $c[1]) % $Nb . ' >> 16) & 0xff] ^ - $dt2[($' . $s . ($Nb + $i - $c[2]) % $Nb . ' >> 8) & 0xff] ^ - $dt3[ $' . $s . ($Nb + $i - $c[3]) % $Nb . ' & 0xff] ^ + $decrypt_block .= + '$' . $e . $i . ' = + $dt0[($' . $s . $i . ' >> 24) & 0xff] ^ + $dt1[($' . $s . (($Nb + $i - $c[1]) % $Nb) . ' >> 16) & 0xff] ^ + $dt2[($' . $s . (($Nb + $i - $c[2]) % $Nb) . ' >> 8) & 0xff] ^ + $dt3[ $' . $s . (($Nb + $i - $c[3]) % $Nb) . ' & 0xff] ^ ' . $dw[++$wc] . ";\n"; } } + // Finalround: subWord + shiftRows + addRoundKey for ($i = 0; $i < $Nb; ++$i) { - $decrypt_block .= '$' . $e . $i . ' = + $decrypt_block .= + '$' . $e . $i . ' = $isbox[ $' . $e . $i . ' & 0xff] | ($isbox[($' . $e . $i . ' >> 8) & 0xff] << 8) | ($isbox[($' . $e . $i . ' >> 16) & 0xff] << 16) | @@ -979,15 +935,25 @@ protected function setupInlineCrypt() $decrypt_block .= '$in = pack("N*"' . "\n"; for ($i = 0; $i < $Nb; ++$i) { $decrypt_block .= ', - ($' . $e . $i . ' & ' . (int) 0xff000000 . ') ^ - ($' . $e . ($Nb + $i - $c[1]) % $Nb . ' & 0x00FF0000 ) ^ - ($' . $e . ($Nb + $i - $c[2]) % $Nb . ' & 0x0000FF00 ) ^ - ($' . $e . ($Nb + $i - $c[3]) % $Nb . ' & 0x000000FF ) ^ + ($' . $e . $i . ' & ' . ((int)0xFF000000) . ') ^ + ($' . $e . (($Nb + $i - $c[1]) % $Nb) . ' & 0x00FF0000 ) ^ + ($' . $e . (($Nb + $i - $c[2]) % $Nb) . ' & 0x0000FF00 ) ^ + ($' . $e . (($Nb + $i - $c[3]) % $Nb) . ' & 0x000000FF ) ^ ' . $dw[$i] . "\n"; } $decrypt_block .= ');'; - $this->inline_crypt = $this->createInlineCryptFunction(['init_crypt' => 'static $tables; static $invtables;', 'init_encrypt' => $init_encrypt, 'init_decrypt' => $init_decrypt, 'encrypt_block' => $encrypt_block, 'decrypt_block' => $decrypt_block]); + + $this->inline_crypt = $this->createInlineCryptFunction( + [ + 'init_crypt' => 'static $tables; static $invtables;', + 'init_encrypt' => $init_encrypt, + 'init_decrypt' => $init_decrypt, + 'encrypt_block' => $encrypt_block, + 'decrypt_block' => $decrypt_block + ] + ); } + /** * Encrypts a message. * @@ -999,15 +965,26 @@ protected function setupInlineCrypt() public function encrypt($plaintext) { $this->setup(); + switch ($this->engine) { case self::ENGINE_LIBSODIUM: - $this->newtag = \sodium_crypto_aead_aes256gcm_encrypt($plaintext, $this->aad, $this->nonce, $this->key); - return Strings::shift($this->newtag, \strlen($plaintext)); + $this->newtag = sodium_crypto_aead_aes256gcm_encrypt($plaintext, $this->aad, $this->nonce, $this->key); + return Strings::shift($this->newtag, strlen($plaintext)); case self::ENGINE_OPENSSL_GCM: - return \openssl_encrypt($plaintext, 'aes-' . $this->getKeyLength() . '-gcm', $this->key, \OPENSSL_RAW_DATA, $this->nonce, $this->newtag, $this->aad); + return openssl_encrypt( + $plaintext, + 'aes-' . $this->getKeyLength() . '-gcm', + $this->key, + OPENSSL_RAW_DATA, + $this->nonce, + $this->newtag, + $this->aad + ); } + return parent::encrypt($plaintext); } + /** * Decrypts a message. * @@ -1019,31 +996,41 @@ public function encrypt($plaintext) public function decrypt($ciphertext) { $this->setup(); + switch ($this->engine) { case self::ENGINE_LIBSODIUM: - if ($this->oldtag === \false) { + if ($this->oldtag === false) { throw new InsufficientSetupException('Authentication Tag has not been set'); } - if (\strlen($this->oldtag) != 16) { + if (strlen($this->oldtag) != 16) { break; } - $plaintext = \sodium_crypto_aead_aes256gcm_decrypt($ciphertext . $this->oldtag, $this->aad, $this->nonce, $this->key); - if ($plaintext === \false) { - $this->oldtag = \false; + $plaintext = sodium_crypto_aead_aes256gcm_decrypt($ciphertext . $this->oldtag, $this->aad, $this->nonce, $this->key); + if ($plaintext === false) { + $this->oldtag = false; throw new BadDecryptionException('Error decrypting ciphertext with libsodium'); } return $plaintext; case self::ENGINE_OPENSSL_GCM: - if ($this->oldtag === \false) { + if ($this->oldtag === false) { throw new InsufficientSetupException('Authentication Tag has not been set'); } - $plaintext = \openssl_decrypt($ciphertext, 'aes-' . $this->getKeyLength() . '-gcm', $this->key, \OPENSSL_RAW_DATA, $this->nonce, $this->oldtag, $this->aad); - if ($plaintext === \false) { - $this->oldtag = \false; + $plaintext = openssl_decrypt( + $ciphertext, + 'aes-' . $this->getKeyLength() . '-gcm', + $this->key, + OPENSSL_RAW_DATA, + $this->nonce, + $this->oldtag, + $this->aad + ); + if ($plaintext === false) { + $this->oldtag = false; throw new BadDecryptionException('Error decrypting ciphertext with OpenSSL'); } return $plaintext; } + return parent::decrypt($ciphertext); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/Salsa20.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/Salsa20.php index a9c2b7a..ef3e346 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/Salsa20.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/Salsa20.php @@ -10,17 +10,18 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt; use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\StreamCipher; use OCA\Libresign\Vendor\phpseclib3\Exception\BadDecryptionException; use OCA\Libresign\Vendor\phpseclib3\Exception\InsufficientSetupException; + /** * Pure-PHP implementation of Salsa20. * * @author Jim Wigginton - * @internal */ class Salsa20 extends StreamCipher { @@ -29,52 +30,60 @@ class Salsa20 extends StreamCipher * * @var string|false */ - protected $p1 = \false; + protected $p1 = false; + /** * Part 2 of the state * * @var string|false */ - protected $p2 = \false; + protected $p2 = false; + /** * Key Length (in bytes) * * @var int */ - protected $key_length = 32; - // = 256 bits + protected $key_length = 32; // = 256 bits + /** * @see \phpseclib3\Crypt\Salsa20::crypt() */ const ENCRYPT = 0; + /** * @see \phpseclib3\Crypt\Salsa20::crypt() */ const DECRYPT = 1; + /** * Encryption buffer for continuous mode * * @var array */ protected $enbuffer; + /** * Decryption buffer for continuous mode * * @var array */ protected $debuffer; + /** * Counter * * @var int */ protected $counter = 0; + /** * Using Generated Poly1305 Key * * @var boolean */ - protected $usingGeneratedPoly1305Key = \false; + protected $usingGeneratedPoly1305Key = false; + /** * Salsa20 uses a nonce * @@ -82,8 +91,9 @@ class Salsa20 extends StreamCipher */ public function usesNonce() { - return \true; + return true; } + /** * Sets the key. * @@ -92,15 +102,17 @@ public function usesNonce() */ public function setKey($key) { - switch (\strlen($key)) { + switch (strlen($key)) { case 16: case 32: break; default: - throw new \LengthException('Key of size ' . \strlen($key) . ' not supported by this algorithm. Only keys of sizes 16 or 32 are supported'); + throw new \LengthException('Key of size ' . strlen($key) . ' not supported by this algorithm. Only keys of sizes 16 or 32 are supported'); } + parent::setKey($key); } + /** * Sets the nonce. * @@ -108,13 +120,15 @@ public function setKey($key) */ public function setNonce($nonce) { - if (\strlen($nonce) != 8) { - throw new \LengthException('Nonce of size ' . \strlen($key) . ' not supported by this algorithm. Only an 64-bit nonce is supported'); + if (strlen($nonce) != 8) { + throw new \LengthException('Nonce of size ' . strlen($key) . ' not supported by this algorithm. Only an 64-bit nonce is supported'); } + $this->nonce = $nonce; - $this->changed = \true; + $this->changed = true; $this->setEngine(); } + /** * Sets the counter. * @@ -125,6 +139,7 @@ public function setCounter($counter) $this->counter = $counter; $this->setEngine(); } + /** * Creates a Poly1305 key using the method discussed in RFC8439 * @@ -132,21 +147,25 @@ public function setCounter($counter) */ protected function createPoly1305Key() { - if ($this->nonce === \false) { + if ($this->nonce === false) { throw new InsufficientSetupException('No nonce has been defined'); } - if ($this->key === \false) { + + if ($this->key === false) { throw new InsufficientSetupException('No key has been defined'); } + $c = clone $this; $c->setCounter(0); - $c->usePoly1305 = \false; - $block = $c->encrypt(\str_repeat("\x00", 256)); - $this->setPoly1305Key(\substr($block, 0, 32)); + $c->usePoly1305 = false; + $block = $c->encrypt(str_repeat("\0", 256)); + $this->setPoly1305Key(substr($block, 0, 32)); + if ($this->counter == 0) { $this->counter++; } } + /** * Setup the self::ENGINE_INTERNAL $engine * @@ -170,28 +189,42 @@ protected function setup() if (!$this->changed) { return; } + $this->enbuffer = $this->debuffer = ['ciphertext' => '', 'counter' => $this->counter]; - $this->changed = $this->nonIVChanged = \false; - if ($this->nonce === \false) { + + $this->changed = $this->nonIVChanged = false; + + if ($this->nonce === false) { throw new InsufficientSetupException('No nonce has been defined'); } - if ($this->key === \false) { + + if ($this->key === false) { throw new InsufficientSetupException('No key has been defined'); } + if ($this->usePoly1305 && !isset($this->poly1305Key)) { - $this->usingGeneratedPoly1305Key = \true; + $this->usingGeneratedPoly1305Key = true; $this->createPoly1305Key(); } + $key = $this->key; - if (\strlen($key) == 16) { + if (strlen($key) == 16) { $constant = 'expand 16-byte k'; $key .= $key; } else { $constant = 'expand 32-byte k'; } - $this->p1 = \substr($constant, 0, 4) . \substr($key, 0, 16) . \substr($constant, 4, 4) . $this->nonce . "\x00\x00\x00\x00"; - $this->p2 = \substr($constant, 8, 4) . \substr($key, 16, 16) . \substr($constant, 12, 4); + + $this->p1 = substr($constant, 0, 4) . + substr($key, 0, 16) . + substr($constant, 4, 4) . + $this->nonce . + "\0\0\0\0"; + $this->p2 = substr($constant, 8, 4) . + substr($key, 16, 16) . + substr($constant, 12, 4); } + /** * Setup the key (expansion) */ @@ -199,6 +232,7 @@ protected function setupKey() { // Salsa20 does not utilize this method } + /** * Encrypts a message. * @@ -215,6 +249,7 @@ public function encrypt($plaintext) } return $ciphertext; } + /** * Decrypts a message. * @@ -229,18 +264,20 @@ public function encrypt($plaintext) public function decrypt($ciphertext) { if (isset($this->poly1305Key)) { - if ($this->oldtag === \false) { + if ($this->oldtag === false) { throw new InsufficientSetupException('Authentication Tag has not been set'); } $newtag = $this->poly1305($ciphertext); - if ($this->oldtag != \substr($newtag, 0, \strlen($this->oldtag))) { - $this->oldtag = \false; + if ($this->oldtag != substr($newtag, 0, strlen($this->oldtag))) { + $this->oldtag = false; throw new BadDecryptionException('Derived authentication tag and supplied authentication tag do not match'); } - $this->oldtag = \false; + $this->oldtag = false; } + return $this->crypt($ciphertext, self::DECRYPT); } + /** * Encrypts a block * @@ -250,6 +287,7 @@ protected function encryptBlock($in) { // Salsa20 does not utilize this method } + /** * Decrypts a block * @@ -259,6 +297,7 @@ protected function decryptBlock($in) { // Salsa20 does not utilize this method } + /** * Encrypts or decrypts a message. * @@ -273,71 +312,91 @@ private function crypt($text, $mode) $this->setup(); if (!$this->continuousBuffer) { if ($this->engine == self::ENGINE_OPENSSL) { - $iv = \pack('V', $this->counter) . $this->p2; - return \openssl_encrypt($text, $this->cipher_name_openssl, $this->key, \OPENSSL_RAW_DATA, $iv); + $iv = pack('V', $this->counter) . $this->p2; + return openssl_encrypt( + $text, + $this->cipher_name_openssl, + $this->key, + OPENSSL_RAW_DATA, + $iv + ); } $i = $this->counter; - $blocks = \str_split($text, 64); + $blocks = str_split($text, 64); foreach ($blocks as &$block) { - $block ^= static::salsa20($this->p1 . \pack('V', $i++) . $this->p2); + $block ^= static::salsa20($this->p1 . pack('V', $i++) . $this->p2); } unset($block); - return \implode('', $blocks); + return implode('', $blocks); } + if ($mode == self::ENCRYPT) { - $buffer =& $this->enbuffer; + $buffer = &$this->enbuffer; } else { - $buffer =& $this->debuffer; + $buffer = &$this->debuffer; } - if (!\strlen($buffer['ciphertext'])) { + if (!strlen($buffer['ciphertext'])) { $ciphertext = ''; } else { - $ciphertext = $text ^ Strings::shift($buffer['ciphertext'], \strlen($text)); - $text = \substr($text, \strlen($ciphertext)); - if (!\strlen($text)) { + $ciphertext = $text ^ Strings::shift($buffer['ciphertext'], strlen($text)); + $text = substr($text, strlen($ciphertext)); + if (!strlen($text)) { return $ciphertext; } } - $overflow = \strlen($text) % 64; - // & 0x3F + + $overflow = strlen($text) % 64; // & 0x3F if ($overflow) { $text2 = Strings::pop($text, $overflow); if ($this->engine == self::ENGINE_OPENSSL) { - $iv = \pack('V', $buffer['counter']) . $this->p2; + $iv = pack('V', $buffer['counter']) . $this->p2; // at this point $text should be a multiple of 64 - $buffer['counter'] += (\strlen($text) >> 6) + 1; - // ie. divide by 64 - $encrypted = \openssl_encrypt($text . \str_repeat("\x00", 64), $this->cipher_name_openssl, $this->key, \OPENSSL_RAW_DATA, $iv); + $buffer['counter'] += (strlen($text) >> 6) + 1; // ie. divide by 64 + $encrypted = openssl_encrypt( + $text . str_repeat("\0", 64), + $this->cipher_name_openssl, + $this->key, + OPENSSL_RAW_DATA, + $iv + ); $temp = Strings::pop($encrypted, 64); } else { - $blocks = \str_split($text, 64); - if (\strlen($text)) { + $blocks = str_split($text, 64); + if (strlen($text)) { foreach ($blocks as &$block) { - $block ^= static::salsa20($this->p1 . \pack('V', $buffer['counter']++) . $this->p2); + $block ^= static::salsa20($this->p1 . pack('V', $buffer['counter']++) . $this->p2); } unset($block); } - $encrypted = \implode('', $blocks); - $temp = static::salsa20($this->p1 . \pack('V', $buffer['counter']++) . $this->p2); + $encrypted = implode('', $blocks); + $temp = static::salsa20($this->p1 . pack('V', $buffer['counter']++) . $this->p2); } $ciphertext .= $encrypted . ($text2 ^ $temp); - $buffer['ciphertext'] = \substr($temp, $overflow); - } elseif (!\strlen($buffer['ciphertext'])) { + $buffer['ciphertext'] = substr($temp, $overflow); + } elseif (!strlen($buffer['ciphertext'])) { if ($this->engine == self::ENGINE_OPENSSL) { - $iv = \pack('V', $buffer['counter']) . $this->p2; - $buffer['counter'] += \strlen($text) >> 6; - $ciphertext .= \openssl_encrypt($text, $this->cipher_name_openssl, $this->key, \OPENSSL_RAW_DATA, $iv); + $iv = pack('V', $buffer['counter']) . $this->p2; + $buffer['counter'] += (strlen($text) >> 6); + $ciphertext .= openssl_encrypt( + $text, + $this->cipher_name_openssl, + $this->key, + OPENSSL_RAW_DATA, + $iv + ); } else { - $blocks = \str_split($text, 64); + $blocks = str_split($text, 64); foreach ($blocks as &$block) { - $block ^= static::salsa20($this->p1 . \pack('V', $buffer['counter']++) . $this->p2); + $block ^= static::salsa20($this->p1 . pack('V', $buffer['counter']++) . $this->p2); } unset($block); - $ciphertext .= \implode('', $blocks); + $ciphertext .= implode('', $blocks); } } + return $ciphertext; } + /** * Left Rotate * @@ -347,18 +406,19 @@ private function crypt($text, $mode) */ protected static function leftRotate($x, $n) { - if (\PHP_INT_SIZE == 8) { + if (PHP_INT_SIZE == 8) { $r1 = $x << $n; - $r1 &= 0xffffffff; - $r2 = ($x & 0xffffffff) >> 32 - $n; + $r1 &= 0xFFFFFFFF; + $r2 = ($x & 0xFFFFFFFF) >> (32 - $n); } else { $x = (int) $x; $r1 = $x << $n; - $r2 = $x >> 32 - $n; + $r2 = $x >> (32 - $n); $r2 &= (1 << $n) - 1; } return $r1 | $r2; } + /** * The quarterround function * @@ -374,6 +434,7 @@ protected static function quarterRound(&$a, &$b, &$c, &$d) $d ^= self::leftRotate($c + $b, 13); $a ^= self::leftRotate($d + $c, 18); } + /** * The doubleround function * @@ -407,6 +468,7 @@ protected static function doubleRound(&$x0, &$x1, &$x2, &$x3, &$x4, &$x5, &$x6, static::quarterRound($x10, $x11, $x8, $x9); static::quarterRound($x15, $x12, $x13, $x14); } + /** * The Salsa20 hash function function * @@ -414,15 +476,18 @@ protected static function doubleRound(&$x0, &$x1, &$x2, &$x3, &$x4, &$x5, &$x6, */ protected static function salsa20($x) { - $z = $x = \unpack('V*', $x); + $z = $x = unpack('V*', $x); for ($i = 0; $i < 10; $i++) { static::doubleRound($z[1], $z[2], $z[3], $z[4], $z[5], $z[6], $z[7], $z[8], $z[9], $z[10], $z[11], $z[12], $z[13], $z[14], $z[15], $z[16]); } + for ($i = 1; $i <= 16; $i++) { $x[$i] += $z[$i]; } - return \pack('V*', ...$x); + + return pack('V*', ...$x); } + /** * Calculates Poly1305 MAC * @@ -441,18 +506,23 @@ protected function poly1305($ciphertext) the same way sodium_crypto_aead_chacha20poly1305_ietf_encrypt does. you can see how the latter encrypts it in Salsa20::encrypt(). here's how the former encrypts it: - + $this->newtag = $this->poly1305( $this->aad . pack('V', strlen($this->aad)) . "\0\0\0\0" . $ciphertext . pack('V', strlen($ciphertext)) . "\0\0\0\0" ); - + phpseclib opts to use the IETF construction, even when the nonce is 64-bits instead of 96-bits */ - return parent::poly1305(self::nullPad128($this->aad) . self::nullPad128($ciphertext) . \pack('V', \strlen($this->aad)) . "\x00\x00\x00\x00" . \pack('V', \strlen($ciphertext)) . "\x00\x00\x00\x00"); + return parent::poly1305( + self::nullPad128($this->aad) . + self::nullPad128($ciphertext) . + pack('V', strlen($this->aad)) . "\0\0\0\0" . + pack('V', strlen($ciphertext)) . "\0\0\0\0" + ); } } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/TripleDES.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/TripleDES.php index 131c4ad..9a28457 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/TripleDES.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/TripleDES.php @@ -31,13 +31,13 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt; /** * Pure-PHP implementation of Triple DES. * * @author Jim Wigginton - * @internal */ class TripleDES extends DES { @@ -47,12 +47,14 @@ class TripleDES extends DES * Inner chaining is used by SSH-1 and is generally considered to be less secure then outer chaining (self::MODE_CBC3). */ const MODE_3CBC = -2; + /** * Encrypt / decrypt using outer chaining * * Outer chaining is used by SSH-2 and when the mode is set to \phpseclib3\Crypt\Common\BlockCipher::MODE_CBC. */ const MODE_CBC3 = self::MODE_CBC; + /** * Key Length (in bytes) * @@ -60,6 +62,7 @@ class TripleDES extends DES * @var int */ protected $key_length = 24; + /** * The mcrypt specific name of the cipher * @@ -68,6 +71,7 @@ class TripleDES extends DES * @var string */ protected $cipher_name_mcrypt = 'tripledes'; + /** * Optimizing value while CFB-encrypting * @@ -75,6 +79,7 @@ class TripleDES extends DES * @var int */ protected $cfb_init_len = 750; + /** * max possible size of $key * @@ -83,12 +88,14 @@ class TripleDES extends DES * @var string */ protected $key_length_max = 24; + /** * Internal flag whether using self::MODE_3CBC or not * * @var bool */ private $mode_3cbc; + /** * The \phpseclib3\Crypt\DES objects * @@ -97,6 +104,7 @@ class TripleDES extends DES * @var array */ private $des; + /** * Default Constructor. * @@ -124,14 +132,20 @@ class TripleDES extends DES */ public function __construct($mode) { - switch (\strtolower($mode)) { + switch (strtolower($mode)) { // In case of self::MODE_3CBC, we init as CRYPT_DES_MODE_CBC // and additional flag us internally as 3CBC case '3cbc': parent::__construct('cbc'); - $this->mode_3cbc = \true; + $this->mode_3cbc = true; + // This three $des'es will do the 3CBC work (if $key > 64bits) - $this->des = [new DES('cbc'), new DES('cbc'), new DES('cbc')]; + $this->des = [ + new DES('cbc'), + new DES('cbc'), + new DES('cbc'), + ]; + // we're going to be doing the padding, ourselves, so disable it in the \phpseclib3\Crypt\DES objects $this->des[0]->disablePadding(); $this->des[1]->disablePadding(); @@ -139,15 +153,17 @@ public function __construct($mode) break; case 'cbc3': $mode = 'cbc'; - // fall-through + // fall-through // If not 3CBC, we init as usual default: parent::__construct($mode); + if ($this->mode == self::MODE_STREAM) { throw new BadModeException('Block ciphers cannot be ran in stream mode'); } } } + /** * Test for engine validity * @@ -164,8 +180,10 @@ protected function isValidEngineHelper($engine) $mode = $this->openssl_translate_mode(); $this->cipher_name_openssl = $mode == 'ecb' ? 'des-ede3' : 'des-ede3-' . $mode; } + return parent::isValidEngineHelper($engine); } + /** * Sets the initialization vector. * @@ -183,6 +201,7 @@ public function setIV($iv) $this->des[2]->setIV($iv); } } + /** * Sets the key length. * @@ -203,8 +222,10 @@ public function setKeyLength($length) default: throw new \LengthException('Key size of ' . $length . ' bits is not supported by this algorithm. Only keys of sizes 128 or 192 bits are supported'); } + parent::setKeyLength($length); } + /** * Sets the key. * @@ -219,29 +240,33 @@ public function setKeyLength($length) */ public function setKey($key) { - if ($this->explicit_key_length !== \false && \strlen($key) != $this->explicit_key_length) { - throw new \LengthException('Key length has already been set to ' . $this->explicit_key_length . ' bytes and this key is ' . \strlen($key) . ' bytes'); + if ($this->explicit_key_length !== false && strlen($key) != $this->explicit_key_length) { + throw new \LengthException('Key length has already been set to ' . $this->explicit_key_length . ' bytes and this key is ' . strlen($key) . ' bytes'); } - switch (\strlen($key)) { + + switch (strlen($key)) { case 16: - $key .= \substr($key, 0, 8); + $key .= substr($key, 0, 8); break; case 24: break; default: - throw new \LengthException('Key of size ' . \strlen($key) . ' not supported by this algorithm. Only keys of sizes 16 or 24 are supported'); + throw new \LengthException('Key of size ' . strlen($key) . ' not supported by this algorithm. Only keys of sizes 16 or 24 are supported'); } + // copied from self::setKey() $this->key = $key; - $this->key_length = \strlen($key); - $this->changed = $this->nonIVChanged = \true; + $this->key_length = strlen($key); + $this->changed = $this->nonIVChanged = true; $this->setEngine(); + if ($this->mode_3cbc) { - $this->des[0]->setKey(\substr($key, 0, 8)); - $this->des[1]->setKey(\substr($key, 8, 8)); - $this->des[2]->setKey(\substr($key, 16, 8)); + $this->des[0]->setKey(substr($key, 0, 8)); + $this->des[1]->setKey(substr($key, 8, 8)); + $this->des[2]->setKey(substr($key, 16, 8)); } } + /** * Encrypts a message. * @@ -253,12 +278,21 @@ public function encrypt($plaintext) { // parent::en/decrypt() is able to do all the work for all modes and keylengths, // except for: self::MODE_3CBC (inner chaining CBC) with a key > 64bits + // if the key is smaller then 8, do what we'd normally do - if ($this->mode_3cbc && \strlen($this->key) > 8) { - return $this->des[2]->encrypt($this->des[1]->decrypt($this->des[0]->encrypt($this->pad($plaintext)))); + if ($this->mode_3cbc && strlen($this->key) > 8) { + return $this->des[2]->encrypt( + $this->des[1]->decrypt( + $this->des[0]->encrypt( + $this->pad($plaintext) + ) + ) + ); } + return parent::encrypt($plaintext); } + /** * Decrypts a message. * @@ -268,11 +302,21 @@ public function encrypt($plaintext) */ public function decrypt($ciphertext) { - if ($this->mode_3cbc && \strlen($this->key) > 8) { - return $this->unpad($this->des[0]->decrypt($this->des[1]->encrypt($this->des[2]->decrypt(\str_pad($ciphertext, \strlen($ciphertext) + 7 & 0xfffffff8, "\x00"))))); + if ($this->mode_3cbc && strlen($this->key) > 8) { + return $this->unpad( + $this->des[0]->decrypt( + $this->des[1]->encrypt( + $this->des[2]->decrypt( + str_pad($ciphertext, (strlen($ciphertext) + 7) & 0xFFFFFFF8, "\0") + ) + ) + ) + ); } + return parent::decrypt($ciphertext); } + /** * Treat consecutive "packets" as if they are a continuous buffer. * @@ -319,6 +363,7 @@ public function enableContinuousBuffer() $this->des[2]->enableContinuousBuffer(); } } + /** * Treat consecutive packets as if they are a discontinuous buffer. * @@ -336,6 +381,7 @@ public function disableContinuousBuffer() $this->des[2]->disableContinuousBuffer(); } } + /** * Creates the key schedule * @@ -344,20 +390,23 @@ public function disableContinuousBuffer() */ protected function setupKey() { - switch (\true) { + switch (true) { // if $key <= 64bits we configure our internal pure-php cipher engine // to act as regular [1]DES, not as 3DES. mcrypt.so::tripledes does the same. - case \strlen($this->key) <= 8: + case strlen($this->key) <= 8: $this->des_rounds = 1; break; + // otherwise, if $key > 64bits, we configure our engine to work as 3DES. default: $this->des_rounds = 3; + // (only) if 3CBC is used we have, of course, to setup the $des[0-2] keys also separately. if ($this->mode_3cbc) { $this->des[0]->setupKey(); $this->des[1]->setupKey(); $this->des[2]->setupKey(); + // because $des[0-2] will, now, do all the work we can return here // not need unnecessary stress parent::setupKey() with our, now unused, $key. return; @@ -366,6 +415,7 @@ protected function setupKey() // setup our key parent::setupKey(); } + /** * Sets the internal crypt engine * @@ -380,6 +430,7 @@ public function setPreferredEngine($engine) $this->des[1]->setPreferredEngine($engine); $this->des[2]->setPreferredEngine($engine); } + parent::setPreferredEngine($engine); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/Twofish.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/Twofish.php index f0be1d5..d211982 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/Twofish.php +++ b/composer/phpseclib/phpseclib/phpseclib/Crypt/Twofish.php @@ -32,16 +32,17 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Crypt; use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\BlockCipher; use OCA\Libresign\Vendor\phpseclib3\Exception\BadModeException; + /** * Pure-PHP implementation of Twofish. * * @author Jim Wigginton * @author Hans-Juergen Petrich - * @internal */ class Twofish extends BlockCipher { @@ -52,6 +53,7 @@ class Twofish extends BlockCipher * @var string */ protected $cipher_name_mcrypt = 'twofish'; + /** * Optimizing value while CFB-encrypting * @@ -59,78 +61,289 @@ class Twofish extends BlockCipher * @var int */ protected $cfb_init_len = 800; + /** * Q-Table * * @var array */ - private static $q0 = [0xa9, 0x67, 0xb3, 0xe8, 0x4, 0xfd, 0xa3, 0x76, 0x9a, 0x92, 0x80, 0x78, 0xe4, 0xdd, 0xd1, 0x38, 0xd, 0xc6, 0x35, 0x98, 0x18, 0xf7, 0xec, 0x6c, 0x43, 0x75, 0x37, 0x26, 0xfa, 0x13, 0x94, 0x48, 0xf2, 0xd0, 0x8b, 0x30, 0x84, 0x54, 0xdf, 0x23, 0x19, 0x5b, 0x3d, 0x59, 0xf3, 0xae, 0xa2, 0x82, 0x63, 0x1, 0x83, 0x2e, 0xd9, 0x51, 0x9b, 0x7c, 0xa6, 0xeb, 0xa5, 0xbe, 0x16, 0xc, 0xe3, 0x61, 0xc0, 0x8c, 0x3a, 0xf5, 0x73, 0x2c, 0x25, 0xb, 0xbb, 0x4e, 0x89, 0x6b, 0x53, 0x6a, 0xb4, 0xf1, 0xe1, 0xe6, 0xbd, 0x45, 0xe2, 0xf4, 0xb6, 0x66, 0xcc, 0x95, 0x3, 0x56, 0xd4, 0x1c, 0x1e, 0xd7, 0xfb, 0xc3, 0x8e, 0xb5, 0xe9, 0xcf, 0xbf, 0xba, 0xea, 0x77, 0x39, 0xaf, 0x33, 0xc9, 0x62, 0x71, 0x81, 0x79, 0x9, 0xad, 0x24, 0xcd, 0xf9, 0xd8, 0xe5, 0xc5, 0xb9, 0x4d, 0x44, 0x8, 0x86, 0xe7, 0xa1, 0x1d, 0xaa, 0xed, 0x6, 0x70, 0xb2, 0xd2, 0x41, 0x7b, 0xa0, 0x11, 0x31, 0xc2, 0x27, 0x90, 0x20, 0xf6, 0x60, 0xff, 0x96, 0x5c, 0xb1, 0xab, 0x9e, 0x9c, 0x52, 0x1b, 0x5f, 0x93, 0xa, 0xef, 0x91, 0x85, 0x49, 0xee, 0x2d, 0x4f, 0x8f, 0x3b, 0x47, 0x87, 0x6d, 0x46, 0xd6, 0x3e, 0x69, 0x64, 0x2a, 0xce, 0xcb, 0x2f, 0xfc, 0x97, 0x5, 0x7a, 0xac, 0x7f, 0xd5, 0x1a, 0x4b, 0xe, 0xa7, 0x5a, 0x28, 0x14, 0x3f, 0x29, 0x88, 0x3c, 0x4c, 0x2, 0xb8, 0xda, 0xb0, 0x17, 0x55, 0x1f, 0x8a, 0x7d, 0x57, 0xc7, 0x8d, 0x74, 0xb7, 0xc4, 0x9f, 0x72, 0x7e, 0x15, 0x22, 0x12, 0x58, 0x7, 0x99, 0x34, 0x6e, 0x50, 0xde, 0x68, 0x65, 0xbc, 0xdb, 0xf8, 0xc8, 0xa8, 0x2b, 0x40, 0xdc, 0xfe, 0x32, 0xa4, 0xca, 0x10, 0x21, 0xf0, 0xd3, 0x5d, 0xf, 0x0, 0x6f, 0x9d, 0x36, 0x42, 0x4a, 0x5e, 0xc1, 0xe0]; + private static $q0 = [ + 0xA9, 0x67, 0xB3, 0xE8, 0x04, 0xFD, 0xA3, 0x76, + 0x9A, 0x92, 0x80, 0x78, 0xE4, 0xDD, 0xD1, 0x38, + 0x0D, 0xC6, 0x35, 0x98, 0x18, 0xF7, 0xEC, 0x6C, + 0x43, 0x75, 0x37, 0x26, 0xFA, 0x13, 0x94, 0x48, + 0xF2, 0xD0, 0x8B, 0x30, 0x84, 0x54, 0xDF, 0x23, + 0x19, 0x5B, 0x3D, 0x59, 0xF3, 0xAE, 0xA2, 0x82, + 0x63, 0x01, 0x83, 0x2E, 0xD9, 0x51, 0x9B, 0x7C, + 0xA6, 0xEB, 0xA5, 0xBE, 0x16, 0x0C, 0xE3, 0x61, + 0xC0, 0x8C, 0x3A, 0xF5, 0x73, 0x2C, 0x25, 0x0B, + 0xBB, 0x4E, 0x89, 0x6B, 0x53, 0x6A, 0xB4, 0xF1, + 0xE1, 0xE6, 0xBD, 0x45, 0xE2, 0xF4, 0xB6, 0x66, + 0xCC, 0x95, 0x03, 0x56, 0xD4, 0x1C, 0x1E, 0xD7, + 0xFB, 0xC3, 0x8E, 0xB5, 0xE9, 0xCF, 0xBF, 0xBA, + 0xEA, 0x77, 0x39, 0xAF, 0x33, 0xC9, 0x62, 0x71, + 0x81, 0x79, 0x09, 0xAD, 0x24, 0xCD, 0xF9, 0xD8, + 0xE5, 0xC5, 0xB9, 0x4D, 0x44, 0x08, 0x86, 0xE7, + 0xA1, 0x1D, 0xAA, 0xED, 0x06, 0x70, 0xB2, 0xD2, + 0x41, 0x7B, 0xA0, 0x11, 0x31, 0xC2, 0x27, 0x90, + 0x20, 0xF6, 0x60, 0xFF, 0x96, 0x5C, 0xB1, 0xAB, + 0x9E, 0x9C, 0x52, 0x1B, 0x5F, 0x93, 0x0A, 0xEF, + 0x91, 0x85, 0x49, 0xEE, 0x2D, 0x4F, 0x8F, 0x3B, + 0x47, 0x87, 0x6D, 0x46, 0xD6, 0x3E, 0x69, 0x64, + 0x2A, 0xCE, 0xCB, 0x2F, 0xFC, 0x97, 0x05, 0x7A, + 0xAC, 0x7F, 0xD5, 0x1A, 0x4B, 0x0E, 0xA7, 0x5A, + 0x28, 0x14, 0x3F, 0x29, 0x88, 0x3C, 0x4C, 0x02, + 0xB8, 0xDA, 0xB0, 0x17, 0x55, 0x1F, 0x8A, 0x7D, + 0x57, 0xC7, 0x8D, 0x74, 0xB7, 0xC4, 0x9F, 0x72, + 0x7E, 0x15, 0x22, 0x12, 0x58, 0x07, 0x99, 0x34, + 0x6E, 0x50, 0xDE, 0x68, 0x65, 0xBC, 0xDB, 0xF8, + 0xC8, 0xA8, 0x2B, 0x40, 0xDC, 0xFE, 0x32, 0xA4, + 0xCA, 0x10, 0x21, 0xF0, 0xD3, 0x5D, 0x0F, 0x00, + 0x6F, 0x9D, 0x36, 0x42, 0x4A, 0x5E, 0xC1, 0xE0 + ]; + /** * Q-Table * * @var array */ - private static $q1 = [0x75, 0xf3, 0xc6, 0xf4, 0xdb, 0x7b, 0xfb, 0xc8, 0x4a, 0xd3, 0xe6, 0x6b, 0x45, 0x7d, 0xe8, 0x4b, 0xd6, 0x32, 0xd8, 0xfd, 0x37, 0x71, 0xf1, 0xe1, 0x30, 0xf, 0xf8, 0x1b, 0x87, 0xfa, 0x6, 0x3f, 0x5e, 0xba, 0xae, 0x5b, 0x8a, 0x0, 0xbc, 0x9d, 0x6d, 0xc1, 0xb1, 0xe, 0x80, 0x5d, 0xd2, 0xd5, 0xa0, 0x84, 0x7, 0x14, 0xb5, 0x90, 0x2c, 0xa3, 0xb2, 0x73, 0x4c, 0x54, 0x92, 0x74, 0x36, 0x51, 0x38, 0xb0, 0xbd, 0x5a, 0xfc, 0x60, 0x62, 0x96, 0x6c, 0x42, 0xf7, 0x10, 0x7c, 0x28, 0x27, 0x8c, 0x13, 0x95, 0x9c, 0xc7, 0x24, 0x46, 0x3b, 0x70, 0xca, 0xe3, 0x85, 0xcb, 0x11, 0xd0, 0x93, 0xb8, 0xa6, 0x83, 0x20, 0xff, 0x9f, 0x77, 0xc3, 0xcc, 0x3, 0x6f, 0x8, 0xbf, 0x40, 0xe7, 0x2b, 0xe2, 0x79, 0xc, 0xaa, 0x82, 0x41, 0x3a, 0xea, 0xb9, 0xe4, 0x9a, 0xa4, 0x97, 0x7e, 0xda, 0x7a, 0x17, 0x66, 0x94, 0xa1, 0x1d, 0x3d, 0xf0, 0xde, 0xb3, 0xb, 0x72, 0xa7, 0x1c, 0xef, 0xd1, 0x53, 0x3e, 0x8f, 0x33, 0x26, 0x5f, 0xec, 0x76, 0x2a, 0x49, 0x81, 0x88, 0xee, 0x21, 0xc4, 0x1a, 0xeb, 0xd9, 0xc5, 0x39, 0x99, 0xcd, 0xad, 0x31, 0x8b, 0x1, 0x18, 0x23, 0xdd, 0x1f, 0x4e, 0x2d, 0xf9, 0x48, 0x4f, 0xf2, 0x65, 0x8e, 0x78, 0x5c, 0x58, 0x19, 0x8d, 0xe5, 0x98, 0x57, 0x67, 0x7f, 0x5, 0x64, 0xaf, 0x63, 0xb6, 0xfe, 0xf5, 0xb7, 0x3c, 0xa5, 0xce, 0xe9, 0x68, 0x44, 0xe0, 0x4d, 0x43, 0x69, 0x29, 0x2e, 0xac, 0x15, 0x59, 0xa8, 0xa, 0x9e, 0x6e, 0x47, 0xdf, 0x34, 0x35, 0x6a, 0xcf, 0xdc, 0x22, 0xc9, 0xc0, 0x9b, 0x89, 0xd4, 0xed, 0xab, 0x12, 0xa2, 0xd, 0x52, 0xbb, 0x2, 0x2f, 0xa9, 0xd7, 0x61, 0x1e, 0xb4, 0x50, 0x4, 0xf6, 0xc2, 0x16, 0x25, 0x86, 0x56, 0x55, 0x9, 0xbe, 0x91]; + private static $q1 = [ + 0x75, 0xF3, 0xC6, 0xF4, 0xDB, 0x7B, 0xFB, 0xC8, + 0x4A, 0xD3, 0xE6, 0x6B, 0x45, 0x7D, 0xE8, 0x4B, + 0xD6, 0x32, 0xD8, 0xFD, 0x37, 0x71, 0xF1, 0xE1, + 0x30, 0x0F, 0xF8, 0x1B, 0x87, 0xFA, 0x06, 0x3F, + 0x5E, 0xBA, 0xAE, 0x5B, 0x8A, 0x00, 0xBC, 0x9D, + 0x6D, 0xC1, 0xB1, 0x0E, 0x80, 0x5D, 0xD2, 0xD5, + 0xA0, 0x84, 0x07, 0x14, 0xB5, 0x90, 0x2C, 0xA3, + 0xB2, 0x73, 0x4C, 0x54, 0x92, 0x74, 0x36, 0x51, + 0x38, 0xB0, 0xBD, 0x5A, 0xFC, 0x60, 0x62, 0x96, + 0x6C, 0x42, 0xF7, 0x10, 0x7C, 0x28, 0x27, 0x8C, + 0x13, 0x95, 0x9C, 0xC7, 0x24, 0x46, 0x3B, 0x70, + 0xCA, 0xE3, 0x85, 0xCB, 0x11, 0xD0, 0x93, 0xB8, + 0xA6, 0x83, 0x20, 0xFF, 0x9F, 0x77, 0xC3, 0xCC, + 0x03, 0x6F, 0x08, 0xBF, 0x40, 0xE7, 0x2B, 0xE2, + 0x79, 0x0C, 0xAA, 0x82, 0x41, 0x3A, 0xEA, 0xB9, + 0xE4, 0x9A, 0xA4, 0x97, 0x7E, 0xDA, 0x7A, 0x17, + 0x66, 0x94, 0xA1, 0x1D, 0x3D, 0xF0, 0xDE, 0xB3, + 0x0B, 0x72, 0xA7, 0x1C, 0xEF, 0xD1, 0x53, 0x3E, + 0x8F, 0x33, 0x26, 0x5F, 0xEC, 0x76, 0x2A, 0x49, + 0x81, 0x88, 0xEE, 0x21, 0xC4, 0x1A, 0xEB, 0xD9, + 0xC5, 0x39, 0x99, 0xCD, 0xAD, 0x31, 0x8B, 0x01, + 0x18, 0x23, 0xDD, 0x1F, 0x4E, 0x2D, 0xF9, 0x48, + 0x4F, 0xF2, 0x65, 0x8E, 0x78, 0x5C, 0x58, 0x19, + 0x8D, 0xE5, 0x98, 0x57, 0x67, 0x7F, 0x05, 0x64, + 0xAF, 0x63, 0xB6, 0xFE, 0xF5, 0xB7, 0x3C, 0xA5, + 0xCE, 0xE9, 0x68, 0x44, 0xE0, 0x4D, 0x43, 0x69, + 0x29, 0x2E, 0xAC, 0x15, 0x59, 0xA8, 0x0A, 0x9E, + 0x6E, 0x47, 0xDF, 0x34, 0x35, 0x6A, 0xCF, 0xDC, + 0x22, 0xC9, 0xC0, 0x9B, 0x89, 0xD4, 0xED, 0xAB, + 0x12, 0xA2, 0x0D, 0x52, 0xBB, 0x02, 0x2F, 0xA9, + 0xD7, 0x61, 0x1E, 0xB4, 0x50, 0x04, 0xF6, 0xC2, + 0x16, 0x25, 0x86, 0x56, 0x55, 0x09, 0xBE, 0x91 + ]; + /** * M-Table * * @var array */ - private static $m0 = [0xbcbc3275, 0xecec21f3, 0x202043c6, 0xb3b3c9f4, 0xdada03db, 0x2028b7b, 0xe2e22bfb, 0x9e9efac8, 0xc9c9ec4a, 0xd4d409d3, 0x18186be6, 0x1e1e9f6b, 0x98980e45, 0xb2b2387d, 0xa6a6d2e8, 0x2626b74b, 0x3c3c57d6, 0x93938a32, 0x8282eed8, 0x525298fd, 0x7b7bd437, 0xbbbb3771, 0x5b5b97f1, 0x474783e1, 0x24243c30, 0x5151e20f, 0xbabac6f8, 0x4a4af31b, 0xbfbf4887, 0xd0d70fa, 0xb0b0b306, 0x7575de3f, 0xd2d2fd5e, 0x7d7d20ba, 0x666631ae, 0x3a3aa35b, 0x59591c8a, 0x0, 0xcdcd93bc, 0x1a1ae09d, 0xaeae2c6d, 0x7f7fabc1, 0x2b2bc7b1, 0xbebeb90e, 0xe0e0a080, 0x8a8a105d, 0x3b3b52d2, 0x6464bad5, 0xd8d888a0, 0xe7e7a584, 0x5f5fe807, 0x1b1b1114, 0x2c2cc2b5, 0xfcfcb490, 0x3131272c, 0x808065a3, 0x73732ab2, 0xc0c8173, 0x79795f4c, 0x6b6b4154, 0x4b4b0292, 0x53536974, 0x94948f36, 0x83831f51, 0x2a2a3638, 0xc4c49cb0, 0x2222c8bd, 0xd5d5f85a, 0xbdbdc3fc, 0x48487860, 0xffffce62, 0x4c4c0796, 0x4141776c, 0xc7c7e642, 0xebeb24f7, 0x1c1c1410, 0x5d5d637c, 0x36362228, 0x6767c027, 0xe9e9af8c, 0x4444f913, 0x1414ea95, 0xf5f5bb9c, 0xcfcf18c7, 0x3f3f2d24, 0xc0c0e346, 0x7272db3b, 0x54546c70, 0x29294cca, 0xf0f035e3, 0x808fe85, 0xc6c617cb, 0xf3f34f11, 0x8c8ce4d0, 0xa4a45993, 0xcaca96b8, 0x68683ba6, 0xb8b84d83, 0x38382820, 0xe5e52eff, 0xadad569f, 0xb0b8477, 0xc8c81dc3, 0x9999ffcc, 0x5858ed03, 0x19199a6f, 0xe0e0a08, 0x95957ebf, 0x70705040, 0xf7f730e7, 0x6e6ecf2b, 0x1f1f6ee2, 0xb5b53d79, 0x9090f0c, 0x616134aa, 0x57571682, 0x9f9f0b41, 0x9d9d803a, 0x111164ea, 0x2525cdb9, 0xafafdde4, 0x4545089a, 0xdfdf8da4, 0xa3a35c97, 0xeaead57e, 0x353558da, 0xededd07a, 0x4343fc17, 0xf8f8cb66, 0xfbfbb194, 0x3737d3a1, 0xfafa401d, 0xc2c2683d, 0xb4b4ccf0, 0x32325dde, 0x9c9c71b3, 0x5656e70b, 0xe3e3da72, 0x878760a7, 0x15151b1c, 0xf9f93aef, 0x6363bfd1, 0x3434a953, 0x9a9a853e, 0xb1b1428f, 0x7c7cd133, 0x88889b26, 0x3d3da65f, 0xa1a1d7ec, 0xe4e4df76, 0x8181942a, 0x91910149, 0xf0ffb81, 0xeeeeaa88, 0x161661ee, 0xd7d77321, 0x9797f5c4, 0xa5a5a81a, 0xfefe3feb, 0x6d6db5d9, 0x7878aec5, 0xc5c56d39, 0x1d1de599, 0x7676a4cd, 0x3e3edcad, 0xcbcb6731, 0xb6b6478b, 0xefef5b01, 0x12121e18, 0x6060c523, 0x6a6ab0dd, 0x4d4df61f, 0xcecee94e, 0xdede7c2d, 0x55559df9, 0x7e7e5a48, 0x2121b24f, 0x3037af2, 0xa0a02665, 0x5e5e198e, 0x5a5a6678, 0x65654b5c, 0x62624e58, 0xfdfd4519, 0x606f48d, 0x404086e5, 0xf2f2be98, 0x3333ac57, 0x17179067, 0x5058e7f, 0xe8e85e05, 0x4f4f7d64, 0x89896aaf, 0x10109563, 0x74742fb6, 0xa0a75fe, 0x5c5c92f5, 0x9b9b74b7, 0x2d2d333c, 0x3030d6a5, 0x2e2e49ce, 0x494989e9, 0x46467268, 0x77775544, 0xa8a8d8e0, 0x9696044d, 0x2828bd43, 0xa9a92969, 0xd9d97929, 0x8686912e, 0xd1d187ac, 0xf4f44a15, 0x8d8d1559, 0xd6d682a8, 0xb9b9bc0a, 0x42420d9e, 0xf6f6c16e, 0x2f2fb847, 0xdddd06df, 0x23233934, 0xcccc6235, 0xf1f1c46a, 0xc1c112cf, 0x8585ebdc, 0x8f8f9e22, 0x7171a1c9, 0x9090f0c0, 0xaaaa539b, 0x101f189, 0x8b8be1d4, 0x4e4e8ced, 0x8e8e6fab, 0xababa212, 0x6f6f3ea2, 0xe6e6540d, 0xdbdbf252, 0x92927bbb, 0xb7b7b602, 0x6969ca2f, 0x3939d9a9, 0xd3d30cd7, 0xa7a72361, 0xa2a2ad1e, 0xc3c399b4, 0x6c6c4450, 0x7070504, 0x4047ff6, 0x272746c2, 0xacaca716, 0xd0d07625, 0x50501386, 0xdcdcf756, 0x84841a55, 0xe1e15109, 0x7a7a25be, 0x1313ef91]; + private static $m0 = [ + 0xBCBC3275, 0xECEC21F3, 0x202043C6, 0xB3B3C9F4, 0xDADA03DB, 0x02028B7B, 0xE2E22BFB, 0x9E9EFAC8, + 0xC9C9EC4A, 0xD4D409D3, 0x18186BE6, 0x1E1E9F6B, 0x98980E45, 0xB2B2387D, 0xA6A6D2E8, 0x2626B74B, + 0x3C3C57D6, 0x93938A32, 0x8282EED8, 0x525298FD, 0x7B7BD437, 0xBBBB3771, 0x5B5B97F1, 0x474783E1, + 0x24243C30, 0x5151E20F, 0xBABAC6F8, 0x4A4AF31B, 0xBFBF4887, 0x0D0D70FA, 0xB0B0B306, 0x7575DE3F, + 0xD2D2FD5E, 0x7D7D20BA, 0x666631AE, 0x3A3AA35B, 0x59591C8A, 0x00000000, 0xCDCD93BC, 0x1A1AE09D, + 0xAEAE2C6D, 0x7F7FABC1, 0x2B2BC7B1, 0xBEBEB90E, 0xE0E0A080, 0x8A8A105D, 0x3B3B52D2, 0x6464BAD5, + 0xD8D888A0, 0xE7E7A584, 0x5F5FE807, 0x1B1B1114, 0x2C2CC2B5, 0xFCFCB490, 0x3131272C, 0x808065A3, + 0x73732AB2, 0x0C0C8173, 0x79795F4C, 0x6B6B4154, 0x4B4B0292, 0x53536974, 0x94948F36, 0x83831F51, + 0x2A2A3638, 0xC4C49CB0, 0x2222C8BD, 0xD5D5F85A, 0xBDBDC3FC, 0x48487860, 0xFFFFCE62, 0x4C4C0796, + 0x4141776C, 0xC7C7E642, 0xEBEB24F7, 0x1C1C1410, 0x5D5D637C, 0x36362228, 0x6767C027, 0xE9E9AF8C, + 0x4444F913, 0x1414EA95, 0xF5F5BB9C, 0xCFCF18C7, 0x3F3F2D24, 0xC0C0E346, 0x7272DB3B, 0x54546C70, + 0x29294CCA, 0xF0F035E3, 0x0808FE85, 0xC6C617CB, 0xF3F34F11, 0x8C8CE4D0, 0xA4A45993, 0xCACA96B8, + 0x68683BA6, 0xB8B84D83, 0x38382820, 0xE5E52EFF, 0xADAD569F, 0x0B0B8477, 0xC8C81DC3, 0x9999FFCC, + 0x5858ED03, 0x19199A6F, 0x0E0E0A08, 0x95957EBF, 0x70705040, 0xF7F730E7, 0x6E6ECF2B, 0x1F1F6EE2, + 0xB5B53D79, 0x09090F0C, 0x616134AA, 0x57571682, 0x9F9F0B41, 0x9D9D803A, 0x111164EA, 0x2525CDB9, + 0xAFAFDDE4, 0x4545089A, 0xDFDF8DA4, 0xA3A35C97, 0xEAEAD57E, 0x353558DA, 0xEDEDD07A, 0x4343FC17, + 0xF8F8CB66, 0xFBFBB194, 0x3737D3A1, 0xFAFA401D, 0xC2C2683D, 0xB4B4CCF0, 0x32325DDE, 0x9C9C71B3, + 0x5656E70B, 0xE3E3DA72, 0x878760A7, 0x15151B1C, 0xF9F93AEF, 0x6363BFD1, 0x3434A953, 0x9A9A853E, + 0xB1B1428F, 0x7C7CD133, 0x88889B26, 0x3D3DA65F, 0xA1A1D7EC, 0xE4E4DF76, 0x8181942A, 0x91910149, + 0x0F0FFB81, 0xEEEEAA88, 0x161661EE, 0xD7D77321, 0x9797F5C4, 0xA5A5A81A, 0xFEFE3FEB, 0x6D6DB5D9, + 0x7878AEC5, 0xC5C56D39, 0x1D1DE599, 0x7676A4CD, 0x3E3EDCAD, 0xCBCB6731, 0xB6B6478B, 0xEFEF5B01, + 0x12121E18, 0x6060C523, 0x6A6AB0DD, 0x4D4DF61F, 0xCECEE94E, 0xDEDE7C2D, 0x55559DF9, 0x7E7E5A48, + 0x2121B24F, 0x03037AF2, 0xA0A02665, 0x5E5E198E, 0x5A5A6678, 0x65654B5C, 0x62624E58, 0xFDFD4519, + 0x0606F48D, 0x404086E5, 0xF2F2BE98, 0x3333AC57, 0x17179067, 0x05058E7F, 0xE8E85E05, 0x4F4F7D64, + 0x89896AAF, 0x10109563, 0x74742FB6, 0x0A0A75FE, 0x5C5C92F5, 0x9B9B74B7, 0x2D2D333C, 0x3030D6A5, + 0x2E2E49CE, 0x494989E9, 0x46467268, 0x77775544, 0xA8A8D8E0, 0x9696044D, 0x2828BD43, 0xA9A92969, + 0xD9D97929, 0x8686912E, 0xD1D187AC, 0xF4F44A15, 0x8D8D1559, 0xD6D682A8, 0xB9B9BC0A, 0x42420D9E, + 0xF6F6C16E, 0x2F2FB847, 0xDDDD06DF, 0x23233934, 0xCCCC6235, 0xF1F1C46A, 0xC1C112CF, 0x8585EBDC, + 0x8F8F9E22, 0x7171A1C9, 0x9090F0C0, 0xAAAA539B, 0x0101F189, 0x8B8BE1D4, 0x4E4E8CED, 0x8E8E6FAB, + 0xABABA212, 0x6F6F3EA2, 0xE6E6540D, 0xDBDBF252, 0x92927BBB, 0xB7B7B602, 0x6969CA2F, 0x3939D9A9, + 0xD3D30CD7, 0xA7A72361, 0xA2A2AD1E, 0xC3C399B4, 0x6C6C4450, 0x07070504, 0x04047FF6, 0x272746C2, + 0xACACA716, 0xD0D07625, 0x50501386, 0xDCDCF756, 0x84841A55, 0xE1E15109, 0x7A7A25BE, 0x1313EF91 + ]; + /** * M-Table * * @var array */ - private static $m1 = [0xa9d93939, 0x67901717, 0xb3719c9c, 0xe8d2a6a6, 0x4050707, 0xfd985252, 0xa3658080, 0x76dfe4e4, 0x9a084545, 0x92024b4b, 0x80a0e0e0, 0x78665a5a, 0xe4ddafaf, 0xddb06a6a, 0xd1bf6363, 0x38362a2a, 0xd54e6e6, 0xc6432020, 0x3562cccc, 0x98bef2f2, 0x181e1212, 0xf724ebeb, 0xecd7a1a1, 0x6c774141, 0x43bd2828, 0x7532bcbc, 0x37d47b7b, 0x269b8888, 0xfa700d0d, 0x13f94444, 0x94b1fbfb, 0x485a7e7e, 0xf27a0303, 0xd0e48c8c, 0x8b47b6b6, 0x303c2424, 0x84a5e7e7, 0x54416b6b, 0xdf06dddd, 0x23c56060, 0x1945fdfd, 0x5ba33a3a, 0x3d68c2c2, 0x59158d8d, 0xf321ecec, 0xae316666, 0xa23e6f6f, 0x82165757, 0x63951010, 0x15befef, 0x834db8b8, 0x2e918686, 0xd9b56d6d, 0x511f8383, 0x9b53aaaa, 0x7c635d5d, 0xa63b6868, 0xeb3ffefe, 0xa5d63030, 0xbe257a7a, 0x16a7acac, 0xc0f0909, 0xe335f0f0, 0x6123a7a7, 0xc0f09090, 0x8cafe9e9, 0x3a809d9d, 0xf5925c5c, 0x73810c0c, 0x2c273131, 0x2576d0d0, 0xbe75656, 0xbb7b9292, 0x4ee9cece, 0x89f10101, 0x6b9f1e1e, 0x53a93434, 0x6ac4f1f1, 0xb499c3c3, 0xf1975b5b, 0xe1834747, 0xe66b1818, 0xbdc82222, 0x450e9898, 0xe26e1f1f, 0xf4c9b3b3, 0xb62f7474, 0x66cbf8f8, 0xccff9999, 0x95ea1414, 0x3ed5858, 0x56f7dcdc, 0xd4e18b8b, 0x1c1b1515, 0x1eada2a2, 0xd70cd3d3, 0xfb2be2e2, 0xc31dc8c8, 0x8e195e5e, 0xb5c22c2c, 0xe9894949, 0xcf12c1c1, 0xbf7e9595, 0xba207d7d, 0xea641111, 0x77840b0b, 0x396dc5c5, 0xaf6a8989, 0x33d17c7c, 0xc9a17171, 0x62ceffff, 0x7137bbbb, 0x81fb0f0f, 0x793db5b5, 0x951e1e1, 0xaddc3e3e, 0x242d3f3f, 0xcda47676, 0xf99d5555, 0xd8ee8282, 0xe5864040, 0xc5ae7878, 0xb9cd2525, 0x4d049696, 0x44557777, 0x80a0e0e, 0x86135050, 0xe730f7f7, 0xa1d33737, 0x1d40fafa, 0xaa346161, 0xed8c4e4e, 0x6b3b0b0, 0x706c5454, 0xb22a7373, 0xd2523b3b, 0x410b9f9f, 0x7b8b0202, 0xa088d8d8, 0x114ff3f3, 0x3167cbcb, 0xc2462727, 0x27c06767, 0x90b4fcfc, 0x20283838, 0xf67f0404, 0x60784848, 0xff2ee5e5, 0x96074c4c, 0x5c4b6565, 0xb1c72b2b, 0xab6f8e8e, 0x9e0d4242, 0x9cbbf5f5, 0x52f2dbdb, 0x1bf34a4a, 0x5fa63d3d, 0x9359a4a4, 0xabcb9b9, 0xef3af9f9, 0x91ef1313, 0x85fe0808, 0x49019191, 0xee611616, 0x2d7cdede, 0x4fb22121, 0x8f42b1b1, 0x3bdb7272, 0x47b82f2f, 0x8748bfbf, 0x6d2caeae, 0x46e3c0c0, 0xd6573c3c, 0x3e859a9a, 0x6929a9a9, 0x647d4f4f, 0x2a948181, 0xce492e2e, 0xcb17c6c6, 0x2fca6969, 0xfcc3bdbd, 0x975ca3a3, 0x55ee8e8, 0x7ad0eded, 0xac87d1d1, 0x7f8e0505, 0xd5ba6464, 0x1aa8a5a5, 0x4bb72626, 0xeb9bebe, 0xa7608787, 0x5af8d5d5, 0x28223636, 0x14111b1b, 0x3fde7575, 0x2979d9d9, 0x88aaeeee, 0x3c332d2d, 0x4c5f7979, 0x2b6b7b7, 0xb896caca, 0xda583535, 0xb09cc4c4, 0x17fc4343, 0x551a8484, 0x1ff64d4d, 0x8a1c5959, 0x7d38b2b2, 0x57ac3333, 0xc718cfcf, 0x8df40606, 0x74695353, 0xb7749b9b, 0xc4f59797, 0x9f56adad, 0x72dae3e3, 0x7ed5eaea, 0x154af4f4, 0x229e8f8f, 0x12a2abab, 0x584e6262, 0x7e85f5f, 0x99e51d1d, 0x34392323, 0x6ec1f6f6, 0x50446c6c, 0xde5d3232, 0x68724646, 0x6526a0a0, 0xbc93cdcd, 0xdb03dada, 0xf8c6baba, 0xc8fa9e9e, 0xa882d6d6, 0x2bcf6e6e, 0x40507070, 0xdceb8585, 0xfe750a0a, 0x328a9393, 0xa48ddfdf, 0xca4c2929, 0x10141c1c, 0x2173d7d7, 0xf0ccb4b4, 0xd309d4d4, 0x5d108a8a, 0xfe25151, 0x0, 0x6f9a1919, 0x9de01a1a, 0x368f9494, 0x42e6c7c7, 0x4aecc9c9, 0x5efdd2d2, 0xc1ab7f7f, 0xe0d8a8a8]; + private static $m1 = [ + 0xA9D93939, 0x67901717, 0xB3719C9C, 0xE8D2A6A6, 0x04050707, 0xFD985252, 0xA3658080, 0x76DFE4E4, + 0x9A084545, 0x92024B4B, 0x80A0E0E0, 0x78665A5A, 0xE4DDAFAF, 0xDDB06A6A, 0xD1BF6363, 0x38362A2A, + 0x0D54E6E6, 0xC6432020, 0x3562CCCC, 0x98BEF2F2, 0x181E1212, 0xF724EBEB, 0xECD7A1A1, 0x6C774141, + 0x43BD2828, 0x7532BCBC, 0x37D47B7B, 0x269B8888, 0xFA700D0D, 0x13F94444, 0x94B1FBFB, 0x485A7E7E, + 0xF27A0303, 0xD0E48C8C, 0x8B47B6B6, 0x303C2424, 0x84A5E7E7, 0x54416B6B, 0xDF06DDDD, 0x23C56060, + 0x1945FDFD, 0x5BA33A3A, 0x3D68C2C2, 0x59158D8D, 0xF321ECEC, 0xAE316666, 0xA23E6F6F, 0x82165757, + 0x63951010, 0x015BEFEF, 0x834DB8B8, 0x2E918686, 0xD9B56D6D, 0x511F8383, 0x9B53AAAA, 0x7C635D5D, + 0xA63B6868, 0xEB3FFEFE, 0xA5D63030, 0xBE257A7A, 0x16A7ACAC, 0x0C0F0909, 0xE335F0F0, 0x6123A7A7, + 0xC0F09090, 0x8CAFE9E9, 0x3A809D9D, 0xF5925C5C, 0x73810C0C, 0x2C273131, 0x2576D0D0, 0x0BE75656, + 0xBB7B9292, 0x4EE9CECE, 0x89F10101, 0x6B9F1E1E, 0x53A93434, 0x6AC4F1F1, 0xB499C3C3, 0xF1975B5B, + 0xE1834747, 0xE66B1818, 0xBDC82222, 0x450E9898, 0xE26E1F1F, 0xF4C9B3B3, 0xB62F7474, 0x66CBF8F8, + 0xCCFF9999, 0x95EA1414, 0x03ED5858, 0x56F7DCDC, 0xD4E18B8B, 0x1C1B1515, 0x1EADA2A2, 0xD70CD3D3, + 0xFB2BE2E2, 0xC31DC8C8, 0x8E195E5E, 0xB5C22C2C, 0xE9894949, 0xCF12C1C1, 0xBF7E9595, 0xBA207D7D, + 0xEA641111, 0x77840B0B, 0x396DC5C5, 0xAF6A8989, 0x33D17C7C, 0xC9A17171, 0x62CEFFFF, 0x7137BBBB, + 0x81FB0F0F, 0x793DB5B5, 0x0951E1E1, 0xADDC3E3E, 0x242D3F3F, 0xCDA47676, 0xF99D5555, 0xD8EE8282, + 0xE5864040, 0xC5AE7878, 0xB9CD2525, 0x4D049696, 0x44557777, 0x080A0E0E, 0x86135050, 0xE730F7F7, + 0xA1D33737, 0x1D40FAFA, 0xAA346161, 0xED8C4E4E, 0x06B3B0B0, 0x706C5454, 0xB22A7373, 0xD2523B3B, + 0x410B9F9F, 0x7B8B0202, 0xA088D8D8, 0x114FF3F3, 0x3167CBCB, 0xC2462727, 0x27C06767, 0x90B4FCFC, + 0x20283838, 0xF67F0404, 0x60784848, 0xFF2EE5E5, 0x96074C4C, 0x5C4B6565, 0xB1C72B2B, 0xAB6F8E8E, + 0x9E0D4242, 0x9CBBF5F5, 0x52F2DBDB, 0x1BF34A4A, 0x5FA63D3D, 0x9359A4A4, 0x0ABCB9B9, 0xEF3AF9F9, + 0x91EF1313, 0x85FE0808, 0x49019191, 0xEE611616, 0x2D7CDEDE, 0x4FB22121, 0x8F42B1B1, 0x3BDB7272, + 0x47B82F2F, 0x8748BFBF, 0x6D2CAEAE, 0x46E3C0C0, 0xD6573C3C, 0x3E859A9A, 0x6929A9A9, 0x647D4F4F, + 0x2A948181, 0xCE492E2E, 0xCB17C6C6, 0x2FCA6969, 0xFCC3BDBD, 0x975CA3A3, 0x055EE8E8, 0x7AD0EDED, + 0xAC87D1D1, 0x7F8E0505, 0xD5BA6464, 0x1AA8A5A5, 0x4BB72626, 0x0EB9BEBE, 0xA7608787, 0x5AF8D5D5, + 0x28223636, 0x14111B1B, 0x3FDE7575, 0x2979D9D9, 0x88AAEEEE, 0x3C332D2D, 0x4C5F7979, 0x02B6B7B7, + 0xB896CACA, 0xDA583535, 0xB09CC4C4, 0x17FC4343, 0x551A8484, 0x1FF64D4D, 0x8A1C5959, 0x7D38B2B2, + 0x57AC3333, 0xC718CFCF, 0x8DF40606, 0x74695353, 0xB7749B9B, 0xC4F59797, 0x9F56ADAD, 0x72DAE3E3, + 0x7ED5EAEA, 0x154AF4F4, 0x229E8F8F, 0x12A2ABAB, 0x584E6262, 0x07E85F5F, 0x99E51D1D, 0x34392323, + 0x6EC1F6F6, 0x50446C6C, 0xDE5D3232, 0x68724646, 0x6526A0A0, 0xBC93CDCD, 0xDB03DADA, 0xF8C6BABA, + 0xC8FA9E9E, 0xA882D6D6, 0x2BCF6E6E, 0x40507070, 0xDCEB8585, 0xFE750A0A, 0x328A9393, 0xA48DDFDF, + 0xCA4C2929, 0x10141C1C, 0x2173D7D7, 0xF0CCB4B4, 0xD309D4D4, 0x5D108A8A, 0x0FE25151, 0x00000000, + 0x6F9A1919, 0x9DE01A1A, 0x368F9494, 0x42E6C7C7, 0x4AECC9C9, 0x5EFDD2D2, 0xC1AB7F7F, 0xE0D8A8A8 + ]; + /** * M-Table * * @var array */ - private static $m2 = [0xbc75bc32, 0xecf3ec21, 0x20c62043, 0xb3f4b3c9, 0xdadbda03, 0x27b028b, 0xe2fbe22b, 0x9ec89efa, 0xc94ac9ec, 0xd4d3d409, 0x18e6186b, 0x1e6b1e9f, 0x9845980e, 0xb27db238, 0xa6e8a6d2, 0x264b26b7, 0x3cd63c57, 0x9332938a, 0x82d882ee, 0x52fd5298, 0x7b377bd4, 0xbb71bb37, 0x5bf15b97, 0x47e14783, 0x2430243c, 0x510f51e2, 0xbaf8bac6, 0x4a1b4af3, 0xbf87bf48, 0xdfa0d70, 0xb006b0b3, 0x753f75de, 0xd25ed2fd, 0x7dba7d20, 0x66ae6631, 0x3a5b3aa3, 0x598a591c, 0x0, 0xcdbccd93, 0x1a9d1ae0, 0xae6dae2c, 0x7fc17fab, 0x2bb12bc7, 0xbe0ebeb9, 0xe080e0a0, 0x8a5d8a10, 0x3bd23b52, 0x64d564ba, 0xd8a0d888, 0xe784e7a5, 0x5f075fe8, 0x1b141b11, 0x2cb52cc2, 0xfc90fcb4, 0x312c3127, 0x80a38065, 0x73b2732a, 0xc730c81, 0x794c795f, 0x6b546b41, 0x4b924b02, 0x53745369, 0x9436948f, 0x8351831f, 0x2a382a36, 0xc4b0c49c, 0x22bd22c8, 0xd55ad5f8, 0xbdfcbdc3, 0x48604878, 0xff62ffce, 0x4c964c07, 0x416c4177, 0xc742c7e6, 0xebf7eb24, 0x1c101c14, 0x5d7c5d63, 0x36283622, 0x672767c0, 0xe98ce9af, 0x441344f9, 0x149514ea, 0xf59cf5bb, 0xcfc7cf18, 0x3f243f2d, 0xc046c0e3, 0x723b72db, 0x5470546c, 0x29ca294c, 0xf0e3f035, 0x88508fe, 0xc6cbc617, 0xf311f34f, 0x8cd08ce4, 0xa493a459, 0xcab8ca96, 0x68a6683b, 0xb883b84d, 0x38203828, 0xe5ffe52e, 0xad9fad56, 0xb770b84, 0xc8c3c81d, 0x99cc99ff, 0x580358ed, 0x196f199a, 0xe080e0a, 0x95bf957e, 0x70407050, 0xf7e7f730, 0x6e2b6ecf, 0x1fe21f6e, 0xb579b53d, 0x90c090f, 0x61aa6134, 0x57825716, 0x9f419f0b, 0x9d3a9d80, 0x11ea1164, 0x25b925cd, 0xafe4afdd, 0x459a4508, 0xdfa4df8d, 0xa397a35c, 0xea7eead5, 0x35da3558, 0xed7aedd0, 0x431743fc, 0xf866f8cb, 0xfb94fbb1, 0x37a137d3, 0xfa1dfa40, 0xc23dc268, 0xb4f0b4cc, 0x32de325d, 0x9cb39c71, 0x560b56e7, 0xe372e3da, 0x87a78760, 0x151c151b, 0xf9eff93a, 0x63d163bf, 0x345334a9, 0x9a3e9a85, 0xb18fb142, 0x7c337cd1, 0x8826889b, 0x3d5f3da6, 0xa1eca1d7, 0xe476e4df, 0x812a8194, 0x91499101, 0xf810ffb, 0xee88eeaa, 0x16ee1661, 0xd721d773, 0x97c497f5, 0xa51aa5a8, 0xfeebfe3f, 0x6dd96db5, 0x78c578ae, 0xc539c56d, 0x1d991de5, 0x76cd76a4, 0x3ead3edc, 0xcb31cb67, 0xb68bb647, 0xef01ef5b, 0x1218121e, 0x602360c5, 0x6add6ab0, 0x4d1f4df6, 0xce4ecee9, 0xde2dde7c, 0x55f9559d, 0x7e487e5a, 0x214f21b2, 0x3f2037a, 0xa065a026, 0x5e8e5e19, 0x5a785a66, 0x655c654b, 0x6258624e, 0xfd19fd45, 0x68d06f4, 0x40e54086, 0xf298f2be, 0x335733ac, 0x17671790, 0x57f058e, 0xe805e85e, 0x4f644f7d, 0x89af896a, 0x10631095, 0x74b6742f, 0xafe0a75, 0x5cf55c92, 0x9bb79b74, 0x2d3c2d33, 0x30a530d6, 0x2ece2e49, 0x49e94989, 0x46684672, 0x77447755, 0xa8e0a8d8, 0x964d9604, 0x284328bd, 0xa969a929, 0xd929d979, 0x862e8691, 0xd1acd187, 0xf415f44a, 0x8d598d15, 0xd6a8d682, 0xb90ab9bc, 0x429e420d, 0xf66ef6c1, 0x2f472fb8, 0xdddfdd06, 0x23342339, 0xcc35cc62, 0xf16af1c4, 0xc1cfc112, 0x85dc85eb, 0x8f228f9e, 0x71c971a1, 0x90c090f0, 0xaa9baa53, 0x18901f1, 0x8bd48be1, 0x4eed4e8c, 0x8eab8e6f, 0xab12aba2, 0x6fa26f3e, 0xe60de654, 0xdb52dbf2, 0x92bb927b, 0xb702b7b6, 0x692f69ca, 0x39a939d9, 0xd3d7d30c, 0xa761a723, 0xa21ea2ad, 0xc3b4c399, 0x6c506c44, 0x7040705, 0x4f6047f, 0x27c22746, 0xac16aca7, 0xd025d076, 0x50865013, 0xdc56dcf7, 0x8455841a, 0xe109e151, 0x7abe7a25, 0x139113ef]; + private static $m2 = [ + 0xBC75BC32, 0xECF3EC21, 0x20C62043, 0xB3F4B3C9, 0xDADBDA03, 0x027B028B, 0xE2FBE22B, 0x9EC89EFA, + 0xC94AC9EC, 0xD4D3D409, 0x18E6186B, 0x1E6B1E9F, 0x9845980E, 0xB27DB238, 0xA6E8A6D2, 0x264B26B7, + 0x3CD63C57, 0x9332938A, 0x82D882EE, 0x52FD5298, 0x7B377BD4, 0xBB71BB37, 0x5BF15B97, 0x47E14783, + 0x2430243C, 0x510F51E2, 0xBAF8BAC6, 0x4A1B4AF3, 0xBF87BF48, 0x0DFA0D70, 0xB006B0B3, 0x753F75DE, + 0xD25ED2FD, 0x7DBA7D20, 0x66AE6631, 0x3A5B3AA3, 0x598A591C, 0x00000000, 0xCDBCCD93, 0x1A9D1AE0, + 0xAE6DAE2C, 0x7FC17FAB, 0x2BB12BC7, 0xBE0EBEB9, 0xE080E0A0, 0x8A5D8A10, 0x3BD23B52, 0x64D564BA, + 0xD8A0D888, 0xE784E7A5, 0x5F075FE8, 0x1B141B11, 0x2CB52CC2, 0xFC90FCB4, 0x312C3127, 0x80A38065, + 0x73B2732A, 0x0C730C81, 0x794C795F, 0x6B546B41, 0x4B924B02, 0x53745369, 0x9436948F, 0x8351831F, + 0x2A382A36, 0xC4B0C49C, 0x22BD22C8, 0xD55AD5F8, 0xBDFCBDC3, 0x48604878, 0xFF62FFCE, 0x4C964C07, + 0x416C4177, 0xC742C7E6, 0xEBF7EB24, 0x1C101C14, 0x5D7C5D63, 0x36283622, 0x672767C0, 0xE98CE9AF, + 0x441344F9, 0x149514EA, 0xF59CF5BB, 0xCFC7CF18, 0x3F243F2D, 0xC046C0E3, 0x723B72DB, 0x5470546C, + 0x29CA294C, 0xF0E3F035, 0x088508FE, 0xC6CBC617, 0xF311F34F, 0x8CD08CE4, 0xA493A459, 0xCAB8CA96, + 0x68A6683B, 0xB883B84D, 0x38203828, 0xE5FFE52E, 0xAD9FAD56, 0x0B770B84, 0xC8C3C81D, 0x99CC99FF, + 0x580358ED, 0x196F199A, 0x0E080E0A, 0x95BF957E, 0x70407050, 0xF7E7F730, 0x6E2B6ECF, 0x1FE21F6E, + 0xB579B53D, 0x090C090F, 0x61AA6134, 0x57825716, 0x9F419F0B, 0x9D3A9D80, 0x11EA1164, 0x25B925CD, + 0xAFE4AFDD, 0x459A4508, 0xDFA4DF8D, 0xA397A35C, 0xEA7EEAD5, 0x35DA3558, 0xED7AEDD0, 0x431743FC, + 0xF866F8CB, 0xFB94FBB1, 0x37A137D3, 0xFA1DFA40, 0xC23DC268, 0xB4F0B4CC, 0x32DE325D, 0x9CB39C71, + 0x560B56E7, 0xE372E3DA, 0x87A78760, 0x151C151B, 0xF9EFF93A, 0x63D163BF, 0x345334A9, 0x9A3E9A85, + 0xB18FB142, 0x7C337CD1, 0x8826889B, 0x3D5F3DA6, 0xA1ECA1D7, 0xE476E4DF, 0x812A8194, 0x91499101, + 0x0F810FFB, 0xEE88EEAA, 0x16EE1661, 0xD721D773, 0x97C497F5, 0xA51AA5A8, 0xFEEBFE3F, 0x6DD96DB5, + 0x78C578AE, 0xC539C56D, 0x1D991DE5, 0x76CD76A4, 0x3EAD3EDC, 0xCB31CB67, 0xB68BB647, 0xEF01EF5B, + 0x1218121E, 0x602360C5, 0x6ADD6AB0, 0x4D1F4DF6, 0xCE4ECEE9, 0xDE2DDE7C, 0x55F9559D, 0x7E487E5A, + 0x214F21B2, 0x03F2037A, 0xA065A026, 0x5E8E5E19, 0x5A785A66, 0x655C654B, 0x6258624E, 0xFD19FD45, + 0x068D06F4, 0x40E54086, 0xF298F2BE, 0x335733AC, 0x17671790, 0x057F058E, 0xE805E85E, 0x4F644F7D, + 0x89AF896A, 0x10631095, 0x74B6742F, 0x0AFE0A75, 0x5CF55C92, 0x9BB79B74, 0x2D3C2D33, 0x30A530D6, + 0x2ECE2E49, 0x49E94989, 0x46684672, 0x77447755, 0xA8E0A8D8, 0x964D9604, 0x284328BD, 0xA969A929, + 0xD929D979, 0x862E8691, 0xD1ACD187, 0xF415F44A, 0x8D598D15, 0xD6A8D682, 0xB90AB9BC, 0x429E420D, + 0xF66EF6C1, 0x2F472FB8, 0xDDDFDD06, 0x23342339, 0xCC35CC62, 0xF16AF1C4, 0xC1CFC112, 0x85DC85EB, + 0x8F228F9E, 0x71C971A1, 0x90C090F0, 0xAA9BAA53, 0x018901F1, 0x8BD48BE1, 0x4EED4E8C, 0x8EAB8E6F, + 0xAB12ABA2, 0x6FA26F3E, 0xE60DE654, 0xDB52DBF2, 0x92BB927B, 0xB702B7B6, 0x692F69CA, 0x39A939D9, + 0xD3D7D30C, 0xA761A723, 0xA21EA2AD, 0xC3B4C399, 0x6C506C44, 0x07040705, 0x04F6047F, 0x27C22746, + 0xAC16ACA7, 0xD025D076, 0x50865013, 0xDC56DCF7, 0x8455841A, 0xE109E151, 0x7ABE7A25, 0x139113EF + ]; + /** * M-Table * * @var array */ - private static $m3 = [0xd939a9d9, 0x90176790, 0x719cb371, 0xd2a6e8d2, 0x5070405, 0x9852fd98, 0x6580a365, 0xdfe476df, 0x8459a08, 0x24b9202, 0xa0e080a0, 0x665a7866, 0xddafe4dd, 0xb06addb0, 0xbf63d1bf, 0x362a3836, 0x54e60d54, 0x4320c643, 0x62cc3562, 0xbef298be, 0x1e12181e, 0x24ebf724, 0xd7a1ecd7, 0x77416c77, 0xbd2843bd, 0x32bc7532, 0xd47b37d4, 0x9b88269b, 0x700dfa70, 0xf94413f9, 0xb1fb94b1, 0x5a7e485a, 0x7a03f27a, 0xe48cd0e4, 0x47b68b47, 0x3c24303c, 0xa5e784a5, 0x416b5441, 0x6dddf06, 0xc56023c5, 0x45fd1945, 0xa33a5ba3, 0x68c23d68, 0x158d5915, 0x21ecf321, 0x3166ae31, 0x3e6fa23e, 0x16578216, 0x95106395, 0x5bef015b, 0x4db8834d, 0x91862e91, 0xb56dd9b5, 0x1f83511f, 0x53aa9b53, 0x635d7c63, 0x3b68a63b, 0x3ffeeb3f, 0xd630a5d6, 0x257abe25, 0xa7ac16a7, 0xf090c0f, 0x35f0e335, 0x23a76123, 0xf090c0f0, 0xafe98caf, 0x809d3a80, 0x925cf592, 0x810c7381, 0x27312c27, 0x76d02576, 0xe7560be7, 0x7b92bb7b, 0xe9ce4ee9, 0xf10189f1, 0x9f1e6b9f, 0xa93453a9, 0xc4f16ac4, 0x99c3b499, 0x975bf197, 0x8347e183, 0x6b18e66b, 0xc822bdc8, 0xe98450e, 0x6e1fe26e, 0xc9b3f4c9, 0x2f74b62f, 0xcbf866cb, 0xff99ccff, 0xea1495ea, 0xed5803ed, 0xf7dc56f7, 0xe18bd4e1, 0x1b151c1b, 0xada21ead, 0xcd3d70c, 0x2be2fb2b, 0x1dc8c31d, 0x195e8e19, 0xc22cb5c2, 0x8949e989, 0x12c1cf12, 0x7e95bf7e, 0x207dba20, 0x6411ea64, 0x840b7784, 0x6dc5396d, 0x6a89af6a, 0xd17c33d1, 0xa171c9a1, 0xceff62ce, 0x37bb7137, 0xfb0f81fb, 0x3db5793d, 0x51e10951, 0xdc3eaddc, 0x2d3f242d, 0xa476cda4, 0x9d55f99d, 0xee82d8ee, 0x8640e586, 0xae78c5ae, 0xcd25b9cd, 0x4964d04, 0x55774455, 0xa0e080a, 0x13508613, 0x30f7e730, 0xd337a1d3, 0x40fa1d40, 0x3461aa34, 0x8c4eed8c, 0xb3b006b3, 0x6c54706c, 0x2a73b22a, 0x523bd252, 0xb9f410b, 0x8b027b8b, 0x88d8a088, 0x4ff3114f, 0x67cb3167, 0x4627c246, 0xc06727c0, 0xb4fc90b4, 0x28382028, 0x7f04f67f, 0x78486078, 0x2ee5ff2e, 0x74c9607, 0x4b655c4b, 0xc72bb1c7, 0x6f8eab6f, 0xd429e0d, 0xbbf59cbb, 0xf2db52f2, 0xf34a1bf3, 0xa63d5fa6, 0x59a49359, 0xbcb90abc, 0x3af9ef3a, 0xef1391ef, 0xfe0885fe, 0x1914901, 0x6116ee61, 0x7cde2d7c, 0xb2214fb2, 0x42b18f42, 0xdb723bdb, 0xb82f47b8, 0x48bf8748, 0x2cae6d2c, 0xe3c046e3, 0x573cd657, 0x859a3e85, 0x29a96929, 0x7d4f647d, 0x94812a94, 0x492ece49, 0x17c6cb17, 0xca692fca, 0xc3bdfcc3, 0x5ca3975c, 0x5ee8055e, 0xd0ed7ad0, 0x87d1ac87, 0x8e057f8e, 0xba64d5ba, 0xa8a51aa8, 0xb7264bb7, 0xb9be0eb9, 0x6087a760, 0xf8d55af8, 0x22362822, 0x111b1411, 0xde753fde, 0x79d92979, 0xaaee88aa, 0x332d3c33, 0x5f794c5f, 0xb6b702b6, 0x96cab896, 0x5835da58, 0x9cc4b09c, 0xfc4317fc, 0x1a84551a, 0xf64d1ff6, 0x1c598a1c, 0x38b27d38, 0xac3357ac, 0x18cfc718, 0xf4068df4, 0x69537469, 0x749bb774, 0xf597c4f5, 0x56ad9f56, 0xdae372da, 0xd5ea7ed5, 0x4af4154a, 0x9e8f229e, 0xa2ab12a2, 0x4e62584e, 0xe85f07e8, 0xe51d99e5, 0x39233439, 0xc1f66ec1, 0x446c5044, 0x5d32de5d, 0x72466872, 0x26a06526, 0x93cdbc93, 0x3dadb03, 0xc6baf8c6, 0xfa9ec8fa, 0x82d6a882, 0xcf6e2bcf, 0x50704050, 0xeb85dceb, 0x750afe75, 0x8a93328a, 0x8ddfa48d, 0x4c29ca4c, 0x141c1014, 0x73d72173, 0xccb4f0cc, 0x9d4d309, 0x108a5d10, 0xe2510fe2, 0x0, 0x9a196f9a, 0xe01a9de0, 0x8f94368f, 0xe6c742e6, 0xecc94aec, 0xfdd25efd, 0xab7fc1ab, 0xd8a8e0d8]; + private static $m3 = [ + 0xD939A9D9, 0x90176790, 0x719CB371, 0xD2A6E8D2, 0x05070405, 0x9852FD98, 0x6580A365, 0xDFE476DF, + 0x08459A08, 0x024B9202, 0xA0E080A0, 0x665A7866, 0xDDAFE4DD, 0xB06ADDB0, 0xBF63D1BF, 0x362A3836, + 0x54E60D54, 0x4320C643, 0x62CC3562, 0xBEF298BE, 0x1E12181E, 0x24EBF724, 0xD7A1ECD7, 0x77416C77, + 0xBD2843BD, 0x32BC7532, 0xD47B37D4, 0x9B88269B, 0x700DFA70, 0xF94413F9, 0xB1FB94B1, 0x5A7E485A, + 0x7A03F27A, 0xE48CD0E4, 0x47B68B47, 0x3C24303C, 0xA5E784A5, 0x416B5441, 0x06DDDF06, 0xC56023C5, + 0x45FD1945, 0xA33A5BA3, 0x68C23D68, 0x158D5915, 0x21ECF321, 0x3166AE31, 0x3E6FA23E, 0x16578216, + 0x95106395, 0x5BEF015B, 0x4DB8834D, 0x91862E91, 0xB56DD9B5, 0x1F83511F, 0x53AA9B53, 0x635D7C63, + 0x3B68A63B, 0x3FFEEB3F, 0xD630A5D6, 0x257ABE25, 0xA7AC16A7, 0x0F090C0F, 0x35F0E335, 0x23A76123, + 0xF090C0F0, 0xAFE98CAF, 0x809D3A80, 0x925CF592, 0x810C7381, 0x27312C27, 0x76D02576, 0xE7560BE7, + 0x7B92BB7B, 0xE9CE4EE9, 0xF10189F1, 0x9F1E6B9F, 0xA93453A9, 0xC4F16AC4, 0x99C3B499, 0x975BF197, + 0x8347E183, 0x6B18E66B, 0xC822BDC8, 0x0E98450E, 0x6E1FE26E, 0xC9B3F4C9, 0x2F74B62F, 0xCBF866CB, + 0xFF99CCFF, 0xEA1495EA, 0xED5803ED, 0xF7DC56F7, 0xE18BD4E1, 0x1B151C1B, 0xADA21EAD, 0x0CD3D70C, + 0x2BE2FB2B, 0x1DC8C31D, 0x195E8E19, 0xC22CB5C2, 0x8949E989, 0x12C1CF12, 0x7E95BF7E, 0x207DBA20, + 0x6411EA64, 0x840B7784, 0x6DC5396D, 0x6A89AF6A, 0xD17C33D1, 0xA171C9A1, 0xCEFF62CE, 0x37BB7137, + 0xFB0F81FB, 0x3DB5793D, 0x51E10951, 0xDC3EADDC, 0x2D3F242D, 0xA476CDA4, 0x9D55F99D, 0xEE82D8EE, + 0x8640E586, 0xAE78C5AE, 0xCD25B9CD, 0x04964D04, 0x55774455, 0x0A0E080A, 0x13508613, 0x30F7E730, + 0xD337A1D3, 0x40FA1D40, 0x3461AA34, 0x8C4EED8C, 0xB3B006B3, 0x6C54706C, 0x2A73B22A, 0x523BD252, + 0x0B9F410B, 0x8B027B8B, 0x88D8A088, 0x4FF3114F, 0x67CB3167, 0x4627C246, 0xC06727C0, 0xB4FC90B4, + 0x28382028, 0x7F04F67F, 0x78486078, 0x2EE5FF2E, 0x074C9607, 0x4B655C4B, 0xC72BB1C7, 0x6F8EAB6F, + 0x0D429E0D, 0xBBF59CBB, 0xF2DB52F2, 0xF34A1BF3, 0xA63D5FA6, 0x59A49359, 0xBCB90ABC, 0x3AF9EF3A, + 0xEF1391EF, 0xFE0885FE, 0x01914901, 0x6116EE61, 0x7CDE2D7C, 0xB2214FB2, 0x42B18F42, 0xDB723BDB, + 0xB82F47B8, 0x48BF8748, 0x2CAE6D2C, 0xE3C046E3, 0x573CD657, 0x859A3E85, 0x29A96929, 0x7D4F647D, + 0x94812A94, 0x492ECE49, 0x17C6CB17, 0xCA692FCA, 0xC3BDFCC3, 0x5CA3975C, 0x5EE8055E, 0xD0ED7AD0, + 0x87D1AC87, 0x8E057F8E, 0xBA64D5BA, 0xA8A51AA8, 0xB7264BB7, 0xB9BE0EB9, 0x6087A760, 0xF8D55AF8, + 0x22362822, 0x111B1411, 0xDE753FDE, 0x79D92979, 0xAAEE88AA, 0x332D3C33, 0x5F794C5F, 0xB6B702B6, + 0x96CAB896, 0x5835DA58, 0x9CC4B09C, 0xFC4317FC, 0x1A84551A, 0xF64D1FF6, 0x1C598A1C, 0x38B27D38, + 0xAC3357AC, 0x18CFC718, 0xF4068DF4, 0x69537469, 0x749BB774, 0xF597C4F5, 0x56AD9F56, 0xDAE372DA, + 0xD5EA7ED5, 0x4AF4154A, 0x9E8F229E, 0xA2AB12A2, 0x4E62584E, 0xE85F07E8, 0xE51D99E5, 0x39233439, + 0xC1F66EC1, 0x446C5044, 0x5D32DE5D, 0x72466872, 0x26A06526, 0x93CDBC93, 0x03DADB03, 0xC6BAF8C6, + 0xFA9EC8FA, 0x82D6A882, 0xCF6E2BCF, 0x50704050, 0xEB85DCEB, 0x750AFE75, 0x8A93328A, 0x8DDFA48D, + 0x4C29CA4C, 0x141C1014, 0x73D72173, 0xCCB4F0CC, 0x09D4D309, 0x108A5D10, 0xE2510FE2, 0x00000000, + 0x9A196F9A, 0xE01A9DE0, 0x8F94368F, 0xE6C742E6, 0xECC94AEC, 0xFDD25EFD, 0xAB7FC1AB, 0xD8A8E0D8 + ]; + /** * The Key Schedule Array * * @var array */ private $K = []; + /** * The Key depended S-Table 0 * * @var array */ private $S0 = []; + /** * The Key depended S-Table 1 * * @var array */ private $S1 = []; + /** * The Key depended S-Table 2 * * @var array */ private $S2 = []; + /** * The Key depended S-Table 3 * * @var array */ private $S3 = []; + /** * Holds the last used key * * @var array */ private $kl; + /** * The Key Length (in bytes) * @@ -138,6 +351,7 @@ class Twofish extends BlockCipher * @var int */ protected $key_length = 16; + /** * Default Constructor. * @@ -147,25 +361,29 @@ class Twofish extends BlockCipher public function __construct($mode) { parent::__construct($mode); + if ($this->mode == self::MODE_STREAM) { throw new BadModeException('Block ciphers cannot be ran in stream mode'); } } + /** * Initialize Static Variables */ protected static function initialize_static_variables() { - if (\is_float(self::$m3[0])) { - self::$m0 = \array_map('intval', self::$m0); - self::$m1 = \array_map('intval', self::$m1); - self::$m2 = \array_map('intval', self::$m2); - self::$m3 = \array_map('intval', self::$m3); - self::$q0 = \array_map('intval', self::$q0); - self::$q1 = \array_map('intval', self::$q1); + if (is_float(self::$m3[0])) { + self::$m0 = array_map('intval', self::$m0); + self::$m1 = array_map('intval', self::$m1); + self::$m2 = array_map('intval', self::$m2); + self::$m3 = array_map('intval', self::$m3); + self::$q0 = array_map('intval', self::$q0); + self::$q1 = array_map('intval', self::$q1); } + parent::initialize_static_variables(); } + /** * Sets the key length. * @@ -183,8 +401,10 @@ public function setKeyLength($length) default: throw new \LengthException('Key of size ' . $length . ' not supported by this algorithm. Only keys of sizes 16, 24 or 32 supported'); } + parent::setKeyLength($length); } + /** * Sets the key. * @@ -196,16 +416,18 @@ public function setKeyLength($length) */ public function setKey($key) { - switch (\strlen($key)) { + switch (strlen($key)) { case 16: case 24: case 32: break; default: - throw new \LengthException('Key of size ' . \strlen($key) . ' not supported by this algorithm. Only keys of sizes 16, 24 or 32 supported'); + throw new \LengthException('Key of size ' . strlen($key) . ' not supported by this algorithm. Only keys of sizes 16, 24 or 32 supported'); } + parent::setKey($key); } + /** * Setup the key (expansion) * @@ -218,28 +440,37 @@ protected function setupKey() return; } $this->kl = ['key' => $this->key]; + /* Key expanding and generating the key-depended s-boxes */ - $le_longs = \unpack('V*', $this->key); - $key = \unpack('C*', $this->key); + $le_longs = unpack('V*', $this->key); + $key = unpack('C*', $this->key); $m0 = self::$m0; $m1 = self::$m1; $m2 = self::$m2; $m3 = self::$m3; $q0 = self::$q0; $q1 = self::$q1; + $K = $S0 = $S1 = $S2 = $S3 = []; - switch (\strlen($this->key)) { + + switch (strlen($this->key)) { case 16: list($s7, $s6, $s5, $s4) = $this->mdsrem($le_longs[1], $le_longs[2]); list($s3, $s2, $s1, $s0) = $this->mdsrem($le_longs[3], $le_longs[4]); for ($i = 0, $j = 1; $i < 40; $i += 2, $j += 2) { - $A = $m0[$q0[$q0[$i] ^ $key[9]] ^ $key[1]] ^ $m1[$q0[$q1[$i] ^ $key[10]] ^ $key[2]] ^ $m2[$q1[$q0[$i] ^ $key[11]] ^ $key[3]] ^ $m3[$q1[$q1[$i] ^ $key[12]] ^ $key[4]]; - $B = $m0[$q0[$q0[$j] ^ $key[13]] ^ $key[5]] ^ $m1[$q0[$q1[$j] ^ $key[14]] ^ $key[6]] ^ $m2[$q1[$q0[$j] ^ $key[15]] ^ $key[7]] ^ $m3[$q1[$q1[$j] ^ $key[16]] ^ $key[8]]; - $B = $B << 8 | $B >> 24 & 0xff; + $A = $m0[$q0[$q0[$i] ^ $key[ 9]] ^ $key[1]] ^ + $m1[$q0[$q1[$i] ^ $key[10]] ^ $key[2]] ^ + $m2[$q1[$q0[$i] ^ $key[11]] ^ $key[3]] ^ + $m3[$q1[$q1[$i] ^ $key[12]] ^ $key[4]]; + $B = $m0[$q0[$q0[$j] ^ $key[13]] ^ $key[5]] ^ + $m1[$q0[$q1[$j] ^ $key[14]] ^ $key[6]] ^ + $m2[$q1[$q0[$j] ^ $key[15]] ^ $key[7]] ^ + $m3[$q1[$q1[$j] ^ $key[16]] ^ $key[8]]; + $B = ($B << 8) | ($B >> 24 & 0xff); $A = self::safe_intval($A + $B); $K[] = $A; $A = self::safe_intval($A + $B); - $K[] = $A << 9 | $A >> 23 & 0x1ff; + $K[] = ($A << 9 | $A >> 23 & 0x1ff); } for ($i = 0; $i < 256; ++$i) { $S0[$i] = $m0[$q0[$q0[$i] ^ $s4] ^ $s0]; @@ -253,13 +484,19 @@ protected function setupKey() list($s7, $s6, $s5, $s4) = $this->mdsrem($le_longs[3], $le_longs[4]); list($s3, $s2, $s1, $s0) = $this->mdsrem($le_longs[5], $le_longs[6]); for ($i = 0, $j = 1; $i < 40; $i += 2, $j += 2) { - $A = $m0[$q0[$q0[$q1[$i] ^ $key[17]] ^ $key[9]] ^ $key[1]] ^ $m1[$q0[$q1[$q1[$i] ^ $key[18]] ^ $key[10]] ^ $key[2]] ^ $m2[$q1[$q0[$q0[$i] ^ $key[19]] ^ $key[11]] ^ $key[3]] ^ $m3[$q1[$q1[$q0[$i] ^ $key[20]] ^ $key[12]] ^ $key[4]]; - $B = $m0[$q0[$q0[$q1[$j] ^ $key[21]] ^ $key[13]] ^ $key[5]] ^ $m1[$q0[$q1[$q1[$j] ^ $key[22]] ^ $key[14]] ^ $key[6]] ^ $m2[$q1[$q0[$q0[$j] ^ $key[23]] ^ $key[15]] ^ $key[7]] ^ $m3[$q1[$q1[$q0[$j] ^ $key[24]] ^ $key[16]] ^ $key[8]]; - $B = $B << 8 | $B >> 24 & 0xff; + $A = $m0[$q0[$q0[$q1[$i] ^ $key[17]] ^ $key[ 9]] ^ $key[1]] ^ + $m1[$q0[$q1[$q1[$i] ^ $key[18]] ^ $key[10]] ^ $key[2]] ^ + $m2[$q1[$q0[$q0[$i] ^ $key[19]] ^ $key[11]] ^ $key[3]] ^ + $m3[$q1[$q1[$q0[$i] ^ $key[20]] ^ $key[12]] ^ $key[4]]; + $B = $m0[$q0[$q0[$q1[$j] ^ $key[21]] ^ $key[13]] ^ $key[5]] ^ + $m1[$q0[$q1[$q1[$j] ^ $key[22]] ^ $key[14]] ^ $key[6]] ^ + $m2[$q1[$q0[$q0[$j] ^ $key[23]] ^ $key[15]] ^ $key[7]] ^ + $m3[$q1[$q1[$q0[$j] ^ $key[24]] ^ $key[16]] ^ $key[8]]; + $B = ($B << 8) | ($B >> 24 & 0xff); $A = self::safe_intval($A + $B); $K[] = $A; $A = self::safe_intval($A + $B); - $K[] = $A << 9 | $A >> 23 & 0x1ff; + $K[] = ($A << 9 | $A >> 23 & 0x1ff); } for ($i = 0; $i < 256; ++$i) { $S0[$i] = $m0[$q0[$q0[$q1[$i] ^ $s8] ^ $s4] ^ $s0]; @@ -268,20 +505,25 @@ protected function setupKey() $S3[$i] = $m3[$q1[$q1[$q0[$i] ^ $sb] ^ $s7] ^ $s3]; } break; - default: - // 32 + default: // 32 list($sf, $se, $sd, $sc) = $this->mdsrem($le_longs[1], $le_longs[2]); list($sb, $sa, $s9, $s8) = $this->mdsrem($le_longs[3], $le_longs[4]); list($s7, $s6, $s5, $s4) = $this->mdsrem($le_longs[5], $le_longs[6]); list($s3, $s2, $s1, $s0) = $this->mdsrem($le_longs[7], $le_longs[8]); for ($i = 0, $j = 1; $i < 40; $i += 2, $j += 2) { - $A = $m0[$q0[$q0[$q1[$q1[$i] ^ $key[25]] ^ $key[17]] ^ $key[9]] ^ $key[1]] ^ $m1[$q0[$q1[$q1[$q0[$i] ^ $key[26]] ^ $key[18]] ^ $key[10]] ^ $key[2]] ^ $m2[$q1[$q0[$q0[$q0[$i] ^ $key[27]] ^ $key[19]] ^ $key[11]] ^ $key[3]] ^ $m3[$q1[$q1[$q0[$q1[$i] ^ $key[28]] ^ $key[20]] ^ $key[12]] ^ $key[4]]; - $B = $m0[$q0[$q0[$q1[$q1[$j] ^ $key[29]] ^ $key[21]] ^ $key[13]] ^ $key[5]] ^ $m1[$q0[$q1[$q1[$q0[$j] ^ $key[30]] ^ $key[22]] ^ $key[14]] ^ $key[6]] ^ $m2[$q1[$q0[$q0[$q0[$j] ^ $key[31]] ^ $key[23]] ^ $key[15]] ^ $key[7]] ^ $m3[$q1[$q1[$q0[$q1[$j] ^ $key[32]] ^ $key[24]] ^ $key[16]] ^ $key[8]]; - $B = $B << 8 | $B >> 24 & 0xff; + $A = $m0[$q0[$q0[$q1[$q1[$i] ^ $key[25]] ^ $key[17]] ^ $key[ 9]] ^ $key[1]] ^ + $m1[$q0[$q1[$q1[$q0[$i] ^ $key[26]] ^ $key[18]] ^ $key[10]] ^ $key[2]] ^ + $m2[$q1[$q0[$q0[$q0[$i] ^ $key[27]] ^ $key[19]] ^ $key[11]] ^ $key[3]] ^ + $m3[$q1[$q1[$q0[$q1[$i] ^ $key[28]] ^ $key[20]] ^ $key[12]] ^ $key[4]]; + $B = $m0[$q0[$q0[$q1[$q1[$j] ^ $key[29]] ^ $key[21]] ^ $key[13]] ^ $key[5]] ^ + $m1[$q0[$q1[$q1[$q0[$j] ^ $key[30]] ^ $key[22]] ^ $key[14]] ^ $key[6]] ^ + $m2[$q1[$q0[$q0[$q0[$j] ^ $key[31]] ^ $key[23]] ^ $key[15]] ^ $key[7]] ^ + $m3[$q1[$q1[$q0[$q1[$j] ^ $key[32]] ^ $key[24]] ^ $key[16]] ^ $key[8]]; + $B = ($B << 8) | ($B >> 24 & 0xff); $A = self::safe_intval($A + $B); $K[] = $A; $A = self::safe_intval($A + $B); - $K[] = $A << 9 | $A >> 23 & 0x1ff; + $K[] = ($A << 9 | $A >> 23 & 0x1ff); } for ($i = 0; $i < 256; ++$i) { $S0[$i] = $m0[$q0[$q0[$q1[$q1[$i] ^ $sc] ^ $s8] ^ $s4] ^ $s0]; @@ -290,12 +532,14 @@ protected function setupKey() $S3[$i] = $m3[$q1[$q1[$q0[$q1[$i] ^ $sf] ^ $sb] ^ $s7] ^ $s3]; } } - $this->K = $K; + + $this->K = $K; $this->S0 = $S0; $this->S1 = $S1; $this->S2 = $S2; $this->S3 = $S3; } + /** * _mdsrem function using by the twofish cipher algorithm * @@ -308,28 +552,41 @@ private function mdsrem($A, $B) // No gain by unrolling this loop. for ($i = 0; $i < 8; ++$i) { // Get most significant coefficient. - $t = 0xff & $B >> 24; + $t = 0xff & ($B >> 24); + // Shift the others up. - $B = $B << 8 | 0xff & $A >> 24; + $B = ($B << 8) | (0xff & ($A >> 24)); $A <<= 8; + $u = $t << 1; + // Subtract the modular polynomial on overflow. if ($t & 0x80) { $u ^= 0x14d; } + // Remove t * (a * x^2 + 1). - $B ^= $t ^ $u << 16; + $B ^= $t ^ ($u << 16); + // Form u = a*t + t/a = t*(a + 1/a). - $u ^= 0x7fffffff & $t >> 1; + $u ^= 0x7fffffff & ($t >> 1); + // Add the modular polynomial on underflow. - if ($t & 0x1) { - $u ^= 0xa6; + if ($t & 0x01) { + $u ^= 0xa6 ; } + // Remove t * (a + 1/a) * (x^3 + x). - $B ^= $u << 24 | $u << 8; + $B ^= ($u << 24) | ($u << 8); } - return [0xff & $B >> 24, 0xff & $B >> 16, 0xff & $B >> 8, 0xff & $B]; + + return [ + 0xff & $B >> 24, + 0xff & $B >> 16, + 0xff & $B >> 8, + 0xff & $B]; } + /** * Encrypts a block * @@ -342,29 +599,49 @@ protected function encryptBlock($in) $S1 = $this->S1; $S2 = $this->S2; $S3 = $this->S3; - $K = $this->K; - $in = \unpack("V4", $in); + $K = $this->K; + + $in = unpack("V4", $in); $R0 = $K[0] ^ $in[1]; $R1 = $K[1] ^ $in[2]; $R2 = $K[2] ^ $in[3]; $R3 = $K[3] ^ $in[4]; + $ki = 7; while ($ki < 39) { - $t0 = $S0[$R0 & 0xff] ^ $S1[$R0 >> 8 & 0xff] ^ $S2[$R0 >> 16 & 0xff] ^ $S3[$R0 >> 24 & 0xff]; - $t1 = $S0[$R1 >> 24 & 0xff] ^ $S1[$R1 & 0xff] ^ $S2[$R1 >> 8 & 0xff] ^ $S3[$R1 >> 16 & 0xff]; + $t0 = $S0[ $R0 & 0xff] ^ + $S1[($R0 >> 8) & 0xff] ^ + $S2[($R0 >> 16) & 0xff] ^ + $S3[($R0 >> 24) & 0xff]; + $t1 = $S0[($R1 >> 24) & 0xff] ^ + $S1[ $R1 & 0xff] ^ + $S2[($R1 >> 8) & 0xff] ^ + $S3[($R1 >> 16) & 0xff]; $R2 ^= self::safe_intval($t0 + $t1 + $K[++$ki]); - $R2 = $R2 >> 1 & 0x7fffffff | $R2 << 31; - $R3 = ($R3 >> 31 & 1 | $R3 << 1) ^ self::safe_intval($t0 + ($t1 << 1) + $K[++$ki]); - $t0 = $S0[$R2 & 0xff] ^ $S1[$R2 >> 8 & 0xff] ^ $S2[$R2 >> 16 & 0xff] ^ $S3[$R2 >> 24 & 0xff]; - $t1 = $S0[$R3 >> 24 & 0xff] ^ $S1[$R3 & 0xff] ^ $S2[$R3 >> 8 & 0xff] ^ $S3[$R3 >> 16 & 0xff]; + $R2 = ($R2 >> 1 & 0x7fffffff) | ($R2 << 31); + $R3 = ((($R3 >> 31) & 1) | ($R3 << 1)) ^ self::safe_intval($t0 + ($t1 << 1) + $K[++$ki]); + + $t0 = $S0[ $R2 & 0xff] ^ + $S1[($R2 >> 8) & 0xff] ^ + $S2[($R2 >> 16) & 0xff] ^ + $S3[($R2 >> 24) & 0xff]; + $t1 = $S0[($R3 >> 24) & 0xff] ^ + $S1[ $R3 & 0xff] ^ + $S2[($R3 >> 8) & 0xff] ^ + $S3[($R3 >> 16) & 0xff]; $R0 ^= self::safe_intval($t0 + $t1 + $K[++$ki]); - $R0 = $R0 >> 1 & 0x7fffffff | $R0 << 31; - $R1 = ($R1 >> 31 & 1 | $R1 << 1) ^ self::safe_intval($t0 + ($t1 << 1) + $K[++$ki]); + $R0 = ($R0 >> 1 & 0x7fffffff) | ($R0 << 31); + $R1 = ((($R1 >> 31) & 1) | ($R1 << 1)) ^ self::safe_intval($t0 + ($t1 << 1) + $K[++$ki]); } + // @codingStandardsIgnoreStart - return \pack("V4", $K[4] ^ $R2, $K[5] ^ $R3, $K[6] ^ $R0, $K[7] ^ $R1); + return pack("V4", $K[4] ^ $R2, + $K[5] ^ $R3, + $K[6] ^ $R0, + $K[7] ^ $R1); // @codingStandardsIgnoreEnd } + /** * Decrypts a block * @@ -377,29 +654,49 @@ protected function decryptBlock($in) $S1 = $this->S1; $S2 = $this->S2; $S3 = $this->S3; - $K = $this->K; - $in = \unpack("V4", $in); + $K = $this->K; + + $in = unpack("V4", $in); $R0 = $K[4] ^ $in[1]; $R1 = $K[5] ^ $in[2]; $R2 = $K[6] ^ $in[3]; $R3 = $K[7] ^ $in[4]; + $ki = 40; while ($ki > 8) { - $t0 = $S0[$R0 & 0xff] ^ $S1[$R0 >> 8 & 0xff] ^ $S2[$R0 >> 16 & 0xff] ^ $S3[$R0 >> 24 & 0xff]; - $t1 = $S0[$R1 >> 24 & 0xff] ^ $S1[$R1 & 0xff] ^ $S2[$R1 >> 8 & 0xff] ^ $S3[$R1 >> 16 & 0xff]; + $t0 = $S0[$R0 & 0xff] ^ + $S1[$R0 >> 8 & 0xff] ^ + $S2[$R0 >> 16 & 0xff] ^ + $S3[$R0 >> 24 & 0xff]; + $t1 = $S0[$R1 >> 24 & 0xff] ^ + $S1[$R1 & 0xff] ^ + $S2[$R1 >> 8 & 0xff] ^ + $S3[$R1 >> 16 & 0xff]; $R3 ^= self::safe_intval($t0 + ($t1 << 1) + $K[--$ki]); $R3 = $R3 >> 1 & 0x7fffffff | $R3 << 31; $R2 = ($R2 >> 31 & 0x1 | $R2 << 1) ^ self::safe_intval($t0 + $t1 + $K[--$ki]); - $t0 = $S0[$R2 & 0xff] ^ $S1[$R2 >> 8 & 0xff] ^ $S2[$R2 >> 16 & 0xff] ^ $S3[$R2 >> 24 & 0xff]; - $t1 = $S0[$R3 >> 24 & 0xff] ^ $S1[$R3 & 0xff] ^ $S2[$R3 >> 8 & 0xff] ^ $S3[$R3 >> 16 & 0xff]; + + $t0 = $S0[$R2 & 0xff] ^ + $S1[$R2 >> 8 & 0xff] ^ + $S2[$R2 >> 16 & 0xff] ^ + $S3[$R2 >> 24 & 0xff]; + $t1 = $S0[$R3 >> 24 & 0xff] ^ + $S1[$R3 & 0xff] ^ + $S2[$R3 >> 8 & 0xff] ^ + $S3[$R3 >> 16 & 0xff]; $R1 ^= self::safe_intval($t0 + ($t1 << 1) + $K[--$ki]); $R1 = $R1 >> 1 & 0x7fffffff | $R1 << 31; $R0 = ($R0 >> 31 & 0x1 | $R0 << 1) ^ self::safe_intval($t0 + $t1 + $K[--$ki]); } + // @codingStandardsIgnoreStart - return \pack("V4", $K[0] ^ $R2, $K[1] ^ $R3, $K[2] ^ $R0, $K[3] ^ $R1); + return pack("V4", $K[0] ^ $R2, + $K[1] ^ $R3, + $K[2] ^ $R0, + $K[3] ^ $R1); // @codingStandardsIgnoreEnd } + /** * Setup the performance-optimized function for de/encrypt() * @@ -419,7 +716,9 @@ protected function setupInlineCrypt() } } '; + $safeint = self::safe_intval_inline(); + // Generating encrypt code: $encrypt_block = ' $in = unpack("V4", $in); @@ -438,9 +737,9 @@ protected function setupInlineCrypt() $S1[ $R1 & 0xff] ^ $S2[($R1 >> 8) & 0xff] ^ $S3[($R1 >> 16) & 0xff]; - $R2^= ' . \sprintf($safeint, '$t0 + $t1 + ' . $K[++$ki]) . '; + $R2^= ' . sprintf($safeint, '$t0 + $t1 + ' . $K[++$ki]) . '; $R2 = ($R2 >> 1 & 0x7fffffff) | ($R2 << 31); - $R3 = ((($R3 >> 31) & 1) | ($R3 << 1)) ^ ' . \sprintf($safeint, '($t0 + ($t1 << 1) + ' . $K[++$ki] . ')') . '; + $R3 = ((($R3 >> 31) & 1) | ($R3 << 1)) ^ ' . sprintf($safeint, '($t0 + ($t1 << 1) + ' . $K[++$ki] . ')') . '; $t0 = $S0[ $R2 & 0xff] ^ $S1[($R2 >> 8) & 0xff] ^ @@ -450,9 +749,9 @@ protected function setupInlineCrypt() $S1[ $R3 & 0xff] ^ $S2[($R3 >> 8) & 0xff] ^ $S3[($R3 >> 16) & 0xff]; - $R0^= ' . \sprintf($safeint, '($t0 + $t1 + ' . $K[++$ki] . ')') . '; + $R0^= ' . sprintf($safeint, '($t0 + $t1 + ' . $K[++$ki] . ')') . '; $R0 = ($R0 >> 1 & 0x7fffffff) | ($R0 << 31); - $R1 = ((($R1 >> 31) & 1) | ($R1 << 1)) ^ ' . \sprintf($safeint, '($t0 + ($t1 << 1) + ' . $K[++$ki] . ')') . '; + $R1 = ((($R1 >> 31) & 1) | ($R1 << 1)) ^ ' . sprintf($safeint, '($t0 + ($t1 << 1) + ' . $K[++$ki] . ')') . '; '; } $encrypt_block .= ' @@ -461,6 +760,7 @@ protected function setupInlineCrypt() ' . $K[6] . ' ^ $R0, ' . $K[7] . ' ^ $R1); '; + // Generating decrypt code: $decrypt_block = ' $in = unpack("V4", $in); @@ -479,9 +779,9 @@ protected function setupInlineCrypt() $S1[$R1 & 0xff] ^ $S2[$R1 >> 8 & 0xff] ^ $S3[$R1 >> 16 & 0xff]; - $R3^= ' . \sprintf($safeint, '$t0 + ($t1 << 1) + ' . $K[--$ki]) . '; + $R3^= ' . sprintf($safeint, '$t0 + ($t1 << 1) + ' . $K[--$ki]) . '; $R3 = $R3 >> 1 & 0x7fffffff | $R3 << 31; - $R2 = ($R2 >> 31 & 0x1 | $R2 << 1) ^ ' . \sprintf($safeint, '($t0 + $t1 + ' . $K[--$ki] . ')') . '; + $R2 = ($R2 >> 31 & 0x1 | $R2 << 1) ^ ' . sprintf($safeint, '($t0 + $t1 + ' . $K[--$ki] . ')') . '; $t0 = $S0[$R2 & 0xff] ^ $S1[$R2 >> 8 & 0xff] ^ @@ -491,9 +791,9 @@ protected function setupInlineCrypt() $S1[$R3 & 0xff] ^ $S2[$R3 >> 8 & 0xff] ^ $S3[$R3 >> 16 & 0xff]; - $R1^= ' . \sprintf($safeint, '$t0 + ($t1 << 1) + ' . $K[--$ki]) . '; + $R1^= ' . sprintf($safeint, '$t0 + ($t1 << 1) + ' . $K[--$ki]) . '; $R1 = $R1 >> 1 & 0x7fffffff | $R1 << 31; - $R0 = ($R0 >> 31 & 0x1 | $R0 << 1) ^ ' . \sprintf($safeint, '($t0 + $t1 + ' . $K[--$ki] . ')') . '; + $R0 = ($R0 >> 31 & 0x1 | $R0 << 1) ^ ' . sprintf($safeint, '($t0 + $t1 + ' . $K[--$ki] . ')') . '; '; } $decrypt_block .= ' @@ -502,6 +802,15 @@ protected function setupInlineCrypt() ' . $K[2] . ' ^ $R0, ' . $K[3] . ' ^ $R1); '; - $this->inline_crypt = $this->createInlineCryptFunction(['init_crypt' => $init_crypt, 'init_encrypt' => '', 'init_decrypt' => '', 'encrypt_block' => $encrypt_block, 'decrypt_block' => $decrypt_block]); + + $this->inline_crypt = $this->createInlineCryptFunction( + [ + 'init_crypt' => $init_crypt, + 'init_encrypt' => '', + 'init_decrypt' => '', + 'encrypt_block' => $encrypt_block, + 'decrypt_block' => $decrypt_block + ] + ); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Exception/BadConfigurationException.php b/composer/phpseclib/phpseclib/phpseclib/Exception/BadConfigurationException.php index 83e8371..f529787 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Exception/BadConfigurationException.php +++ b/composer/phpseclib/phpseclib/phpseclib/Exception/BadConfigurationException.php @@ -10,13 +10,13 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Exception; /** * BadConfigurationException * * @author Jim Wigginton - * @internal */ class BadConfigurationException extends \RuntimeException { diff --git a/composer/phpseclib/phpseclib/phpseclib/Exception/BadDecryptionException.php b/composer/phpseclib/phpseclib/phpseclib/Exception/BadDecryptionException.php index 3009b45..b8d759b 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Exception/BadDecryptionException.php +++ b/composer/phpseclib/phpseclib/phpseclib/Exception/BadDecryptionException.php @@ -10,13 +10,13 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Exception; /** * BadDecryptionException * * @author Jim Wigginton - * @internal */ class BadDecryptionException extends \RuntimeException { diff --git a/composer/phpseclib/phpseclib/phpseclib/Exception/BadModeException.php b/composer/phpseclib/phpseclib/phpseclib/Exception/BadModeException.php index 1a3c49d..889dd83 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Exception/BadModeException.php +++ b/composer/phpseclib/phpseclib/phpseclib/Exception/BadModeException.php @@ -10,13 +10,13 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Exception; /** * BadModeException * * @author Jim Wigginton - * @internal */ class BadModeException extends \RuntimeException { diff --git a/composer/phpseclib/phpseclib/phpseclib/Exception/ConnectionClosedException.php b/composer/phpseclib/phpseclib/phpseclib/Exception/ConnectionClosedException.php index 8d9190b..1003d17 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Exception/ConnectionClosedException.php +++ b/composer/phpseclib/phpseclib/phpseclib/Exception/ConnectionClosedException.php @@ -10,13 +10,13 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Exception; /** * ConnectionClosedException * * @author Jim Wigginton - * @internal */ class ConnectionClosedException extends \RuntimeException { diff --git a/composer/phpseclib/phpseclib/phpseclib/Exception/FileNotFoundException.php b/composer/phpseclib/phpseclib/phpseclib/Exception/FileNotFoundException.php index cc6fe20..8fb6f75 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Exception/FileNotFoundException.php +++ b/composer/phpseclib/phpseclib/phpseclib/Exception/FileNotFoundException.php @@ -10,13 +10,13 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Exception; /** * FileNotFoundException * * @author Jim Wigginton - * @internal */ class FileNotFoundException extends \RuntimeException { diff --git a/composer/phpseclib/phpseclib/phpseclib/Exception/InconsistentSetupException.php b/composer/phpseclib/phpseclib/phpseclib/Exception/InconsistentSetupException.php index 6c0ddfa..8007118 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Exception/InconsistentSetupException.php +++ b/composer/phpseclib/phpseclib/phpseclib/Exception/InconsistentSetupException.php @@ -10,13 +10,13 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Exception; /** * InconsistentSetupException * * @author Jim Wigginton - * @internal */ class InconsistentSetupException extends \RuntimeException { diff --git a/composer/phpseclib/phpseclib/phpseclib/Exception/InsufficientSetupException.php b/composer/phpseclib/phpseclib/phpseclib/Exception/InsufficientSetupException.php index b0ad72f..9c7f7c6 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Exception/InsufficientSetupException.php +++ b/composer/phpseclib/phpseclib/phpseclib/Exception/InsufficientSetupException.php @@ -10,13 +10,13 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Exception; /** * InsufficientSetupException * * @author Jim Wigginton - * @internal */ class InsufficientSetupException extends \RuntimeException { diff --git a/composer/phpseclib/phpseclib/phpseclib/Exception/InvalidPacketLengthException.php b/composer/phpseclib/phpseclib/phpseclib/Exception/InvalidPacketLengthException.php index 02ae264..9e4a40e 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Exception/InvalidPacketLengthException.php +++ b/composer/phpseclib/phpseclib/phpseclib/Exception/InvalidPacketLengthException.php @@ -4,7 +4,6 @@ /** * Indicates an absent or malformed packet length header - * @internal */ class InvalidPacketLengthException extends ConnectionClosedException { diff --git a/composer/phpseclib/phpseclib/phpseclib/Exception/NoKeyLoadedException.php b/composer/phpseclib/phpseclib/phpseclib/Exception/NoKeyLoadedException.php index cd08284..effead6 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Exception/NoKeyLoadedException.php +++ b/composer/phpseclib/phpseclib/phpseclib/Exception/NoKeyLoadedException.php @@ -10,13 +10,13 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Exception; /** * NoKeyLoadedException * * @author Jim Wigginton - * @internal */ class NoKeyLoadedException extends \RuntimeException { diff --git a/composer/phpseclib/phpseclib/phpseclib/Exception/NoSupportedAlgorithmsException.php b/composer/phpseclib/phpseclib/phpseclib/Exception/NoSupportedAlgorithmsException.php index 945371f..4f7bd70 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Exception/NoSupportedAlgorithmsException.php +++ b/composer/phpseclib/phpseclib/phpseclib/Exception/NoSupportedAlgorithmsException.php @@ -10,13 +10,13 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Exception; /** * NoSupportedAlgorithmsException * * @author Jim Wigginton - * @internal */ class NoSupportedAlgorithmsException extends \RuntimeException { diff --git a/composer/phpseclib/phpseclib/phpseclib/Exception/TimeoutException.php b/composer/phpseclib/phpseclib/phpseclib/Exception/TimeoutException.php index 901380e..b611203 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Exception/TimeoutException.php +++ b/composer/phpseclib/phpseclib/phpseclib/Exception/TimeoutException.php @@ -4,7 +4,6 @@ /** * Indicates a timeout awaiting server response - * @internal */ class TimeoutException extends \RuntimeException { diff --git a/composer/phpseclib/phpseclib/phpseclib/Exception/UnableToConnectException.php b/composer/phpseclib/phpseclib/phpseclib/Exception/UnableToConnectException.php index 050f236..d6dc666 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Exception/UnableToConnectException.php +++ b/composer/phpseclib/phpseclib/phpseclib/Exception/UnableToConnectException.php @@ -10,13 +10,13 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Exception; /** * UnableToConnectException * * @author Jim Wigginton - * @internal */ class UnableToConnectException extends \RuntimeException { diff --git a/composer/phpseclib/phpseclib/phpseclib/Exception/UnsupportedAlgorithmException.php b/composer/phpseclib/phpseclib/phpseclib/Exception/UnsupportedAlgorithmException.php index d02f1fc..02f1179 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Exception/UnsupportedAlgorithmException.php +++ b/composer/phpseclib/phpseclib/phpseclib/Exception/UnsupportedAlgorithmException.php @@ -10,13 +10,13 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Exception; /** * UnsupportedAlgorithmException * * @author Jim Wigginton - * @internal */ class UnsupportedAlgorithmException extends \RuntimeException { diff --git a/composer/phpseclib/phpseclib/phpseclib/Exception/UnsupportedCurveException.php b/composer/phpseclib/phpseclib/phpseclib/Exception/UnsupportedCurveException.php index 1842ac9..e2db084 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Exception/UnsupportedCurveException.php +++ b/composer/phpseclib/phpseclib/phpseclib/Exception/UnsupportedCurveException.php @@ -10,13 +10,13 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Exception; /** * UnsupportedCurveException * * @author Jim Wigginton - * @internal */ class UnsupportedCurveException extends \RuntimeException { diff --git a/composer/phpseclib/phpseclib/phpseclib/Exception/UnsupportedFormatException.php b/composer/phpseclib/phpseclib/phpseclib/Exception/UnsupportedFormatException.php index 742243b..0bb8295 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Exception/UnsupportedFormatException.php +++ b/composer/phpseclib/phpseclib/phpseclib/Exception/UnsupportedFormatException.php @@ -10,13 +10,13 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Exception; /** * UnsupportedFormatException * * @author Jim Wigginton - * @internal */ class UnsupportedFormatException extends \RuntimeException { diff --git a/composer/phpseclib/phpseclib/phpseclib/Exception/UnsupportedOperationException.php b/composer/phpseclib/phpseclib/phpseclib/Exception/UnsupportedOperationException.php index a7d9d58..ea45645 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Exception/UnsupportedOperationException.php +++ b/composer/phpseclib/phpseclib/phpseclib/Exception/UnsupportedOperationException.php @@ -10,13 +10,13 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Exception; /** * UnsupportedOperationException * * @author Jim Wigginton - * @internal */ class UnsupportedOperationException extends \RuntimeException { diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ANSI.php b/composer/phpseclib/phpseclib/phpseclib/File/ANSI.php index 11a45d8..d47fec0 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ANSI.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ANSI.php @@ -15,13 +15,13 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File; /** * Pure-PHP ANSI Decoder * * @author Jim Wigginton - * @internal */ class ANSI { @@ -31,96 +31,112 @@ class ANSI * @var int */ private $max_x; + /** * Max Height * * @var int */ private $max_y; + /** * Max History * * @var int */ private $max_history; + /** * History * * @var array */ private $history; + /** * History Attributes * * @var array */ private $history_attrs; + /** * Current Column * * @var int */ private $x; + /** * Current Row * * @var int */ private $y; + /** * Old Column * * @var int */ private $old_x; + /** * Old Row * * @var int */ private $old_y; + /** * An empty attribute cell * * @var object */ private $base_attr_cell; + /** * The current attribute cell * * @var object */ private $attr_cell; + /** * An empty attribute row * * @var array */ private $attr_row; + /** * The current screen text * * @var list */ private $screen; + /** * The current screen attributes * * @var array */ private $attrs; + /** * Current ANSI code * * @var string */ private $ansi; + /** * Tokenization * * @var array */ private $tokenization; + /** * Default Constructor. * @@ -129,17 +145,19 @@ class ANSI public function __construct() { $attr_cell = new \stdClass(); - $attr_cell->bold = \false; - $attr_cell->underline = \false; - $attr_cell->blink = \false; + $attr_cell->bold = false; + $attr_cell->underline = false; + $attr_cell->blink = false; $attr_cell->background = 'black'; $attr_cell->foreground = 'white'; - $attr_cell->reverse = \false; + $attr_cell->reverse = false; $this->base_attr_cell = clone $attr_cell; $this->attr_cell = clone $attr_cell; + $this->setHistory(200); $this->setDimensions(80, 24); } + /** * Set terminal width and height * @@ -154,11 +172,12 @@ public function setDimensions($x, $y) $this->max_y = $y - 1; $this->x = $this->y = 0; $this->history = $this->history_attrs = []; - $this->attr_row = \array_fill(0, $this->max_x + 2, $this->base_attr_cell); - $this->screen = \array_fill(0, $this->max_y + 1, ''); - $this->attrs = \array_fill(0, $this->max_y + 1, $this->attr_row); + $this->attr_row = array_fill(0, $this->max_x + 2, $this->base_attr_cell); + $this->screen = array_fill(0, $this->max_y + 1, ''); + $this->attrs = array_fill(0, $this->max_y + 1, $this->attr_row); $this->ansi = ''; } + /** * Set the number of lines that should be logged past the terminal height * @@ -168,6 +187,7 @@ public function setHistory($history) { $this->max_history = $history; } + /** * Load a string * @@ -178,6 +198,7 @@ public function loadString($source) $this->setDimensions($this->max_x + 1, $this->max_y + 1); $this->appendString($source); } + /** * Appdend a string * @@ -186,18 +207,18 @@ public function loadString($source) public function appendString($source) { $this->tokenization = ['']; - for ($i = 0; $i < \strlen($source); $i++) { - if (\strlen($this->ansi)) { + for ($i = 0; $i < strlen($source); $i++) { + if (strlen($this->ansi)) { $this->ansi .= $source[$i]; - $chr = \ord($source[$i]); + $chr = ord($source[$i]); // http://en.wikipedia.org/wiki/ANSI_escape_code#Sequence_elements // single character CSI's not currently supported - switch (\true) { - case $this->ansi == "\x1b=": + switch (true) { + case $this->ansi == "\x1B=": $this->ansi = ''; continue 2; - case \strlen($this->ansi) == 2 && $chr >= 64 && $chr <= 95 && $chr != \ord('['): - case \strlen($this->ansi) > 2 && $chr >= 64 && $chr <= 126: + case strlen($this->ansi) == 2 && $chr >= 64 && $chr <= 95 && $chr != ord('['): + case strlen($this->ansi) > 2 && $chr >= 64 && $chr <= 126: break; default: continue 2; @@ -206,162 +227,115 @@ public function appendString($source) $this->tokenization[] = ''; // http://ascii-table.com/ansi-escape-sequences-vt-100.php switch ($this->ansi) { - case "\x1b[H": - // Move cursor to upper left corner + case "\x1B[H": // Move cursor to upper left corner $this->old_x = $this->x; $this->old_y = $this->y; $this->x = $this->y = 0; break; - case "\x1b[J": - // Clear screen from cursor down - $this->history = \array_merge($this->history, \array_slice(\array_splice($this->screen, $this->y + 1), 0, $this->old_y)); - $this->screen = \array_merge($this->screen, \array_fill($this->y, $this->max_y, '')); - $this->history_attrs = \array_merge($this->history_attrs, \array_slice(\array_splice($this->attrs, $this->y + 1), 0, $this->old_y)); - $this->attrs = \array_merge($this->attrs, \array_fill($this->y, $this->max_y, $this->attr_row)); - if (\count($this->history) == $this->max_history) { - \array_shift($this->history); - \array_shift($this->history_attrs); + case "\x1B[J": // Clear screen from cursor down + $this->history = array_merge($this->history, array_slice(array_splice($this->screen, $this->y + 1), 0, $this->old_y)); + $this->screen = array_merge($this->screen, array_fill($this->y, $this->max_y, '')); + + $this->history_attrs = array_merge($this->history_attrs, array_slice(array_splice($this->attrs, $this->y + 1), 0, $this->old_y)); + $this->attrs = array_merge($this->attrs, array_fill($this->y, $this->max_y, $this->attr_row)); + + if (count($this->history) == $this->max_history) { + array_shift($this->history); + array_shift($this->history_attrs); } - // fall-through - case "\x1b[K": - // Clear screen from cursor right - $this->screen[$this->y] = \substr($this->screen[$this->y], 0, $this->x); - \array_splice($this->attrs[$this->y], $this->x + 1, $this->max_x - $this->x, \array_fill($this->x, $this->max_x - ($this->x - 1), $this->base_attr_cell)); + // fall-through + case "\x1B[K": // Clear screen from cursor right + $this->screen[$this->y] = substr($this->screen[$this->y], 0, $this->x); + + array_splice($this->attrs[$this->y], $this->x + 1, $this->max_x - $this->x, array_fill($this->x, $this->max_x - ($this->x - 1), $this->base_attr_cell)); break; - case "\x1b[2K": - // Clear entire line - $this->screen[$this->y] = \str_repeat(' ', $this->x); + case "\x1B[2K": // Clear entire line + $this->screen[$this->y] = str_repeat(' ', $this->x); $this->attrs[$this->y] = $this->attr_row; break; - case "\x1b[?1h": - // set cursor key to application - case "\x1b[?25h": - // show the cursor - case "\x1b(B": - // set united states g0 character set + case "\x1B[?1h": // set cursor key to application + case "\x1B[?25h": // show the cursor + case "\x1B(B": // set united states g0 character set break; - case "\x1bE": - // Move to next line + case "\x1BE": // Move to next line $this->newLine(); $this->x = 0; break; default: - switch (\true) { - case \preg_match('#\\x1B\\[(\\d+)B#', $this->ansi, $match): - // Move cursor down n lines + switch (true) { + case preg_match('#\x1B\[(\d+)B#', $this->ansi, $match): // Move cursor down n lines $this->old_y = $this->y; $this->y += (int) $match[1]; break; - case \preg_match('#\\x1B\\[(\\d+);(\\d+)H#', $this->ansi, $match): - // Move cursor to screen location v,h + case preg_match('#\x1B\[(\d+);(\d+)H#', $this->ansi, $match): // Move cursor to screen location v,h $this->old_x = $this->x; $this->old_y = $this->y; $this->x = $match[2] - 1; $this->y = (int) $match[1] - 1; break; - case \preg_match('#\\x1B\\[(\\d+)C#', $this->ansi, $match): - // Move cursor right n lines + case preg_match('#\x1B\[(\d+)C#', $this->ansi, $match): // Move cursor right n lines $this->old_x = $this->x; $this->x += $match[1]; break; - case \preg_match('#\\x1B\\[(\\d+)D#', $this->ansi, $match): - // Move cursor left n lines + case preg_match('#\x1B\[(\d+)D#', $this->ansi, $match): // Move cursor left n lines $this->old_x = $this->x; $this->x -= $match[1]; if ($this->x < 0) { $this->x = 0; } break; - case \preg_match('#\\x1B\\[(\\d+);(\\d+)r#', $this->ansi, $match): - // Set top and bottom lines of a window + case preg_match('#\x1B\[(\d+);(\d+)r#', $this->ansi, $match): // Set top and bottom lines of a window break; - case \preg_match('#\\x1B\\[(\\d*(?:;\\d*)*)m#', $this->ansi, $match): - // character attributes - $attr_cell =& $this->attr_cell; - $mods = \explode(';', $match[1]); + case preg_match('#\x1B\[(\d*(?:;\d*)*)m#', $this->ansi, $match): // character attributes + $attr_cell = &$this->attr_cell; + $mods = explode(';', $match[1]); foreach ($mods as $mod) { switch ($mod) { case '': - case '0': - // Turn off character attributes + case '0': // Turn off character attributes $attr_cell = clone $this->base_attr_cell; break; - case '1': - // Turn bold mode on - $attr_cell->bold = \true; + case '1': // Turn bold mode on + $attr_cell->bold = true; break; - case '4': - // Turn underline mode on - $attr_cell->underline = \true; + case '4': // Turn underline mode on + $attr_cell->underline = true; break; - case '5': - // Turn blinking mode on - $attr_cell->blink = \true; + case '5': // Turn blinking mode on + $attr_cell->blink = true; break; - case '7': - // Turn reverse video on + case '7': // Turn reverse video on $attr_cell->reverse = !$attr_cell->reverse; $temp = $attr_cell->background; $attr_cell->background = $attr_cell->foreground; $attr_cell->foreground = $temp; break; - default: - // set colors + default: // set colors //$front = $attr_cell->reverse ? &$attr_cell->background : &$attr_cell->foreground; - $front =& $attr_cell->{$attr_cell->reverse ? 'background' : 'foreground'}; + $front = &$attr_cell->{ $attr_cell->reverse ? 'background' : 'foreground' }; //$back = $attr_cell->reverse ? &$attr_cell->foreground : &$attr_cell->background; - $back =& $attr_cell->{$attr_cell->reverse ? 'foreground' : 'background'}; + $back = &$attr_cell->{ $attr_cell->reverse ? 'foreground' : 'background' }; switch ($mod) { // @codingStandardsIgnoreStart - case '30': - $front = 'black'; - break; - case '31': - $front = 'red'; - break; - case '32': - $front = 'green'; - break; - case '33': - $front = 'yellow'; - break; - case '34': - $front = 'blue'; - break; - case '35': - $front = 'magenta'; - break; - case '36': - $front = 'cyan'; - break; - case '37': - $front = 'white'; - break; - case '40': - $back = 'black'; - break; - case '41': - $back = 'red'; - break; - case '42': - $back = 'green'; - break; - case '43': - $back = 'yellow'; - break; - case '44': - $back = 'blue'; - break; - case '45': - $back = 'magenta'; - break; - case '46': - $back = 'cyan'; - break; - case '47': - $back = 'white'; - break; + case '30': $front = 'black'; break; + case '31': $front = 'red'; break; + case '32': $front = 'green'; break; + case '33': $front = 'yellow'; break; + case '34': $front = 'blue'; break; + case '35': $front = 'magenta'; break; + case '36': $front = 'cyan'; break; + case '37': $front = 'white'; break; + + case '40': $back = 'black'; break; + case '41': $back = 'red'; break; + case '42': $back = 'green'; break; + case '43': $back = 'yellow'; break; + case '44': $back = 'blue'; break; + case '45': $back = 'magenta'; break; + case '46': $back = 'cyan'; break; + case '47': $back = 'white'; break; // @codingStandardsIgnoreEnd + default: //user_error('Unsupported attribute: ' . $mod); $this->ansi = ''; @@ -371,12 +345,14 @@ public function appendString($source) } break; default: + //user_error("{$this->ansi} is unsupported\r\n"); } } $this->ansi = ''; continue; } - $this->tokenization[\count($this->tokenization) - 1] .= $source[$i]; + + $this->tokenization[count($this->tokenization) - 1] .= $source[$i]; switch ($source[$i]) { case "\r": $this->x = 0; @@ -384,31 +360,39 @@ public function appendString($source) case "\n": $this->newLine(); break; - case "\x08": - // backspace + case "\x08": // backspace if ($this->x) { $this->x--; $this->attrs[$this->y][$this->x] = clone $this->base_attr_cell; - $this->screen[$this->y] = \substr_replace($this->screen[$this->y], $source[$i], $this->x, 1); + $this->screen[$this->y] = substr_replace( + $this->screen[$this->y], + $source[$i], + $this->x, + 1 + ); } break; - case "\x0f": - // shift + case "\x0F": // shift break; - case "\x1b": - // start ANSI escape code - $this->tokenization[\count($this->tokenization) - 1] = \substr($this->tokenization[\count($this->tokenization) - 1], 0, -1); + case "\x1B": // start ANSI escape code + $this->tokenization[count($this->tokenization) - 1] = substr($this->tokenization[count($this->tokenization) - 1], 0, -1); //if (!strlen($this->tokenization[count($this->tokenization) - 1])) { // array_pop($this->tokenization); //} - $this->ansi .= "\x1b"; + $this->ansi .= "\x1B"; break; default: $this->attrs[$this->y][$this->x] = clone $this->attr_cell; - if ($this->x > \strlen($this->screen[$this->y])) { - $this->screen[$this->y] = \str_repeat(' ', $this->x); + if ($this->x > strlen($this->screen[$this->y])) { + $this->screen[$this->y] = str_repeat(' ', $this->x); } - $this->screen[$this->y] = \substr_replace($this->screen[$this->y], $source[$i], $this->x, 1); + $this->screen[$this->y] = substr_replace( + $this->screen[$this->y], + $source[$i], + $this->x, + 1 + ); + if ($this->x > $this->max_x) { $this->x = 0; $this->newLine(); @@ -418,6 +402,7 @@ public function appendString($source) } } } + /** * Add a new line * @@ -429,19 +414,24 @@ private function newLine() //if ($this->y < $this->max_y) { // $this->y++; //} + while ($this->y >= $this->max_y) { - $this->history = \array_merge($this->history, [\array_shift($this->screen)]); + $this->history = array_merge($this->history, [array_shift($this->screen)]); $this->screen[] = ''; - $this->history_attrs = \array_merge($this->history_attrs, [\array_shift($this->attrs)]); + + $this->history_attrs = array_merge($this->history_attrs, [array_shift($this->attrs)]); $this->attrs[] = $this->attr_row; - if (\count($this->history) >= $this->max_history) { - \array_shift($this->history); - \array_shift($this->history_attrs); + + if (count($this->history) >= $this->max_history) { + array_shift($this->history); + array_shift($this->history_attrs); } + $this->y--; } $this->y++; } + /** * Returns the current coordinate without preformating * @@ -453,6 +443,7 @@ private function newLine() private function processCoordinate(\stdClass $last_attr, \stdClass $cur_attr, $char) { $output = ''; + if ($last_attr != $cur_attr) { $close = $open = ''; if ($last_attr->foreground != $cur_attr->foreground) { @@ -494,9 +485,12 @@ private function processCoordinate(\stdClass $last_attr, \stdClass $cur_attr, $c } $output .= $close . $open; } - $output .= \htmlspecialchars($char); + + $output .= htmlspecialchars($char); + return $output; } + /** * Returns the current screen without preformating * @@ -514,11 +508,12 @@ private function getScreenHelper() } $output .= "\r\n"; } - $output = \substr($output, 0, -2); + $output = substr($output, 0, -2); // close any remaining open tags $output .= $this->processCoordinate($last_attr, $this->base_attr_cell, ''); - return \rtrim($output); + return rtrim($output); } + /** * Returns the current screen * @@ -528,6 +523,7 @@ public function getScreen() { return '
' . $this->getScreenHelper() . '
'; } + /** * Returns the current screen and the x previous lines * @@ -537,7 +533,7 @@ public function getHistory() { $scrollback = ''; $last_attr = $this->base_attr_cell; - for ($i = 0; $i < \count($this->history); $i++) { + for ($i = 0; $i < count($this->history); $i++) { for ($j = 0; $j <= $this->max_x + 1; $j++) { $cur_attr = $this->history_attrs[$i][$j]; $scrollback .= $this->processCoordinate($last_attr, $cur_attr, isset($this->history[$i][$j]) ? $this->history[$i][$j] : ''); @@ -549,6 +545,7 @@ public function getHistory() $this->base_attr_cell = $last_attr; $scrollback .= $this->getScreen(); $this->base_attr_cell = $base_attr_cell; + return '
' . $scrollback . '
'; } } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1.php index ddfc815..ad9770b 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1.php @@ -18,65 +18,66 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File; use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; use OCA\Libresign\Vendor\phpseclib3\File\ASN1\Element; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * Pure-PHP ASN.1 Parser * * @author Jim Wigginton - * @internal */ abstract class ASN1 { // Tag Classes // http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#page=12 - const CLASS_UNIVERSAL = 0; - const CLASS_APPLICATION = 1; + const CLASS_UNIVERSAL = 0; + const CLASS_APPLICATION = 1; const CLASS_CONTEXT_SPECIFIC = 2; - const CLASS_PRIVATE = 3; + const CLASS_PRIVATE = 3; + // Tag Classes // http://www.obj-sys.com/asn1tutorial/node124.html - const TYPE_BOOLEAN = 1; - const TYPE_INTEGER = 2; - const TYPE_BIT_STRING = 3; - const TYPE_OCTET_STRING = 4; - const TYPE_NULL = 5; + const TYPE_BOOLEAN = 1; + const TYPE_INTEGER = 2; + const TYPE_BIT_STRING = 3; + const TYPE_OCTET_STRING = 4; + const TYPE_NULL = 5; const TYPE_OBJECT_IDENTIFIER = 6; //const TYPE_OBJECT_DESCRIPTOR = 7; //const TYPE_INSTANCE_OF = 8; // EXTERNAL - const TYPE_REAL = 9; - const TYPE_ENUMERATED = 10; + const TYPE_REAL = 9; + const TYPE_ENUMERATED = 10; //const TYPE_EMBEDDED = 11; - const TYPE_UTF8_STRING = 12; + const TYPE_UTF8_STRING = 12; //const TYPE_RELATIVE_OID = 13; - const TYPE_SEQUENCE = 16; - // SEQUENCE OF - const TYPE_SET = 17; - // SET OF + const TYPE_SEQUENCE = 16; // SEQUENCE OF + const TYPE_SET = 17; // SET OF + // More Tag Classes // http://www.obj-sys.com/asn1tutorial/node10.html - const TYPE_NUMERIC_STRING = 18; + const TYPE_NUMERIC_STRING = 18; const TYPE_PRINTABLE_STRING = 19; - const TYPE_TELETEX_STRING = 20; - // T61String - const TYPE_VIDEOTEX_STRING = 21; - const TYPE_IA5_STRING = 22; - const TYPE_UTC_TIME = 23; + const TYPE_TELETEX_STRING = 20; // T61String + const TYPE_VIDEOTEX_STRING = 21; + const TYPE_IA5_STRING = 22; + const TYPE_UTC_TIME = 23; const TYPE_GENERALIZED_TIME = 24; - const TYPE_GRAPHIC_STRING = 25; - const TYPE_VISIBLE_STRING = 26; - // ISO646String - const TYPE_GENERAL_STRING = 27; + const TYPE_GRAPHIC_STRING = 25; + const TYPE_VISIBLE_STRING = 26; // ISO646String + const TYPE_GENERAL_STRING = 27; const TYPE_UNIVERSAL_STRING = 28; //const TYPE_CHARACTER_STRING = 29; - const TYPE_BMP_STRING = 30; + const TYPE_BMP_STRING = 30; + // Tag Aliases // These tags are kinda place holders for other tags. const TYPE_CHOICE = -1; - const TYPE_ANY = -2; + const TYPE_ANY = -2; + /** * ASN.1 object identifiers * @@ -84,12 +85,14 @@ abstract class ASN1 * @link http://en.wikipedia.org/wiki/Object_identifier */ private static $oids = []; + /** * ASN.1 object identifier reverse mapping * * @var array */ private static $reverseOIDs = []; + /** * Default date format * @@ -97,6 +100,7 @@ abstract class ASN1 * @link http://php.net/class.datetime */ private static $format = 'D, d M Y H:i:s O'; + /** * Filters * @@ -106,6 +110,7 @@ abstract class ASN1 * @see self::encode_der() */ private static $filters; + /** * Current Location of most recent ASN.1 encode process * @@ -115,6 +120,7 @@ abstract class ASN1 * @see self::encode_der() */ private static $location; + /** * DER Encoded String * @@ -124,6 +130,7 @@ abstract class ASN1 * @see self::decodeDER() */ private static $encoded; + /** * Type mapping table for the ANY type. * @@ -134,29 +141,30 @@ abstract class ASN1 * @var array */ const ANY_MAP = [ - self::TYPE_BOOLEAN => \true, - self::TYPE_INTEGER => \true, - self::TYPE_BIT_STRING => 'bitString', - self::TYPE_OCTET_STRING => 'octetString', - self::TYPE_NULL => 'null', - self::TYPE_OBJECT_IDENTIFIER => 'objectIdentifier', - self::TYPE_REAL => \true, - self::TYPE_ENUMERATED => 'enumerated', - self::TYPE_UTF8_STRING => 'utf8String', - self::TYPE_NUMERIC_STRING => 'numericString', - self::TYPE_PRINTABLE_STRING => 'printableString', - self::TYPE_TELETEX_STRING => 'teletexString', - self::TYPE_VIDEOTEX_STRING => 'videotexString', - self::TYPE_IA5_STRING => 'ia5String', - self::TYPE_UTC_TIME => 'utcTime', - self::TYPE_GENERALIZED_TIME => 'generalTime', - self::TYPE_GRAPHIC_STRING => 'graphicString', - self::TYPE_VISIBLE_STRING => 'visibleString', - self::TYPE_GENERAL_STRING => 'generalString', - self::TYPE_UNIVERSAL_STRING => 'universalString', + self::TYPE_BOOLEAN => true, + self::TYPE_INTEGER => true, + self::TYPE_BIT_STRING => 'bitString', + self::TYPE_OCTET_STRING => 'octetString', + self::TYPE_NULL => 'null', + self::TYPE_OBJECT_IDENTIFIER => 'objectIdentifier', + self::TYPE_REAL => true, + self::TYPE_ENUMERATED => 'enumerated', + self::TYPE_UTF8_STRING => 'utf8String', + self::TYPE_NUMERIC_STRING => 'numericString', + self::TYPE_PRINTABLE_STRING => 'printableString', + self::TYPE_TELETEX_STRING => 'teletexString', + self::TYPE_VIDEOTEX_STRING => 'videotexString', + self::TYPE_IA5_STRING => 'ia5String', + self::TYPE_UTC_TIME => 'utcTime', + self::TYPE_GENERALIZED_TIME => 'generalTime', + self::TYPE_GRAPHIC_STRING => 'graphicString', + self::TYPE_VISIBLE_STRING => 'visibleString', + self::TYPE_GENERAL_STRING => 'generalString', + self::TYPE_UNIVERSAL_STRING => 'universalString', //self::TYPE_CHARACTER_STRING => 'characterString', - self::TYPE_BMP_STRING => 'bmpString', + self::TYPE_BMP_STRING => 'bmpString' ]; + /** * String type to character size mapping table. * @@ -165,7 +173,16 @@ abstract class ASN1 * * @var array */ - const STRING_TYPE_SIZE = [self::TYPE_UTF8_STRING => 0, self::TYPE_BMP_STRING => 2, self::TYPE_UNIVERSAL_STRING => 4, self::TYPE_PRINTABLE_STRING => 1, self::TYPE_TELETEX_STRING => 1, self::TYPE_IA5_STRING => 1, self::TYPE_VISIBLE_STRING => 1]; + const STRING_TYPE_SIZE = [ + self::TYPE_UTF8_STRING => 0, + self::TYPE_BMP_STRING => 2, + self::TYPE_UNIVERSAL_STRING => 4, + self::TYPE_PRINTABLE_STRING => 1, + self::TYPE_TELETEX_STRING => 1, + self::TYPE_IA5_STRING => 1, + self::TYPE_VISIBLE_STRING => 1, + ]; + /** * Parse BER-encoding * @@ -179,13 +196,17 @@ public static function decodeBER($encoded) if ($encoded instanceof Element) { $encoded = $encoded->element; } + self::$encoded = $encoded; + $decoded = self::decode_ber($encoded); - if ($decoded === \false) { + if ($decoded === false) { return null; } + return [$decoded]; } + /** * Parse BER-encoding (Helper function) * @@ -201,91 +222,104 @@ public static function decodeBER($encoded) private static function decode_ber($encoded, $start = 0, $encoded_pos = 0) { $current = ['start' => $start]; + if (!isset($encoded[$encoded_pos])) { - return \false; + return false; } - $type = \ord($encoded[$encoded_pos++]); + $type = ord($encoded[$encoded_pos++]); $startOffset = 1; - $constructed = $type >> 5 & 1; - $tag = $type & 0x1f; - if ($tag == 0x1f) { + + $constructed = ($type >> 5) & 1; + + $tag = $type & 0x1F; + if ($tag == 0x1F) { $tag = 0; // process septets (since the eighth bit is ignored, it's not an octet) do { if (!isset($encoded[$encoded_pos])) { - return \false; + return false; } - $temp = \ord($encoded[$encoded_pos++]); + $temp = ord($encoded[$encoded_pos++]); $startOffset++; $loop = $temp >> 7; $tag <<= 7; - $temp &= 0x7f; + $temp &= 0x7F; // "bits 7 to 1 of the first subsequent octet shall not all be zero" if ($startOffset == 2 && $temp == 0) { - return \false; + return false; } $tag |= $temp; } while ($loop); } + $start += $startOffset; + // Length, as discussed in paragraph 8.1.3 of X.690-0207.pdf#page=13 if (!isset($encoded[$encoded_pos])) { - return \false; + return false; } - $length = \ord($encoded[$encoded_pos++]); + $length = ord($encoded[$encoded_pos++]); $start++; - if ($length == 0x80) { - // indefinite length + if ($length == 0x80) { // indefinite length // "[A sender shall] use the indefinite form (see 8.1.3.6) if the encoding is constructed and is not all // immediately available." -- paragraph 8.1.3.2.c - $length = \strlen($encoded) - $encoded_pos; - } elseif ($length & 0x80) { - // definite length, long form + $length = strlen($encoded) - $encoded_pos; + } elseif ($length & 0x80) { // definite length, long form // technically, the long form of the length can be represented by up to 126 octets (bytes), but we'll only // support it up to four. - $length &= 0x7f; - $temp = \substr($encoded, $encoded_pos, $length); + $length &= 0x7F; + $temp = substr($encoded, $encoded_pos, $length); $encoded_pos += $length; // tags of indefinte length don't really have a header length; this length includes the tag $current += ['headerlength' => $length + 2]; $start += $length; - $length = \unpack('Nlength', \substr(\str_pad($temp, 4, \chr(0), \STR_PAD_LEFT), -4))['length']; + $length = unpack('Nlength', substr(str_pad($temp, 4, chr(0), STR_PAD_LEFT), -4))['length']; } else { $current += ['headerlength' => 2]; } - if ($length > \strlen($encoded) - $encoded_pos) { - return \false; + + if ($length > (strlen($encoded) - $encoded_pos)) { + return false; } - $content = \substr($encoded, $encoded_pos, $length); + + $content = substr($encoded, $encoded_pos, $length); $content_pos = 0; + // at this point $length can be overwritten. it's only accurate for definite length things as is + /* Class is UNIVERSAL, APPLICATION, PRIVATE, or CONTEXT-SPECIFIC. The UNIVERSAL class is restricted to the ASN.1 - built-in types. It defines an application-independent data type that must be distinguishable from all other - data types. The other three classes are user defined. The APPLICATION class distinguishes data types that - have a wide, scattered use within a particular presentation context. PRIVATE distinguishes data types within - a particular organization or country. CONTEXT-SPECIFIC distinguishes members of a sequence or set, the - alternatives of a CHOICE, or universally tagged set members. Only the class number appears in braces for this - data type; the term CONTEXT-SPECIFIC does not appear. - - -- http://www.obj-sys.com/asn1tutorial/node12.html */ - $class = $type >> 6 & 3; + built-in types. It defines an application-independent data type that must be distinguishable from all other + data types. The other three classes are user defined. The APPLICATION class distinguishes data types that + have a wide, scattered use within a particular presentation context. PRIVATE distinguishes data types within + a particular organization or country. CONTEXT-SPECIFIC distinguishes members of a sequence or set, the + alternatives of a CHOICE, or universally tagged set members. Only the class number appears in braces for this + data type; the term CONTEXT-SPECIFIC does not appear. + + -- http://www.obj-sys.com/asn1tutorial/node12.html */ + $class = ($type >> 6) & 3; switch ($class) { case self::CLASS_APPLICATION: case self::CLASS_PRIVATE: case self::CLASS_CONTEXT_SPECIFIC: if (!$constructed) { - return ['type' => $class, 'constant' => $tag, 'content' => $content, 'length' => $length + $start - $current['start']] + $current; + return [ + 'type' => $class, + 'constant' => $tag, + 'content' => $content, + 'length' => $length + $start - $current['start'] + ] + $current; } + $newcontent = []; $remainingLength = $length; while ($remainingLength > 0) { $temp = self::decode_ber($content, $start, $content_pos); - if ($temp === \false) { + if ($temp === false) { break; } $length = $temp['length']; // end-of-content octets - see paragraph 8.1.5 - if (\substr($content, $content_pos + $length, 2) == "\x00\x00") { + if (substr($content, $content_pos + $length, 2) == "\0\0") { $length += 2; $start += $length; $newcontent[] = $temp; @@ -296,114 +330,114 @@ private static function decode_ber($encoded, $start = 0, $encoded_pos = 0) $newcontent[] = $temp; $content_pos += $length; } + return [ - 'type' => $class, + 'type' => $class, 'constant' => $tag, // the array encapsulation is for BC with the old format - 'content' => $newcontent, + 'content' => $newcontent, // the only time when $content['headerlength'] isn't defined is when the length is indefinite. // the absence of $content['headerlength'] is how we know if something is indefinite or not. // technically, it could be defined to be 2 and then another indicator could be used but whatever. - 'length' => $start - $current['start'], + 'length' => $start - $current['start'] ] + $current; } + $current += ['type' => $tag]; + // decode UNIVERSAL tags switch ($tag) { case self::TYPE_BOOLEAN: // "The contents octets shall consist of a single octet." -- paragraph 8.2.1 - if ($constructed || \strlen($content) != 1) { - return \false; + if ($constructed || strlen($content) != 1) { + return false; } - $current['content'] = (bool) \ord($content[$content_pos]); + $current['content'] = (bool) ord($content[$content_pos]); break; case self::TYPE_INTEGER: case self::TYPE_ENUMERATED: if ($constructed) { - return \false; + return false; } - $current['content'] = new BigInteger(\substr($content, $content_pos), -256); + $current['content'] = new BigInteger(substr($content, $content_pos), -256); break; - case self::TYPE_REAL: - // not currently supported - return \false; + case self::TYPE_REAL: // not currently supported + return false; case self::TYPE_BIT_STRING: // The initial octet shall encode, as an unsigned binary integer with bit 1 as the least significant bit, // the number of unused bits in the final subsequent octet. The number shall be in the range zero to // seven. if (!$constructed) { - $current['content'] = \substr($content, $content_pos); + $current['content'] = substr($content, $content_pos); } else { $temp = self::decode_ber($content, $start, $content_pos); - if ($temp === \false) { - return \false; + if ($temp === false) { + return false; } - $length -= \strlen($content) - $content_pos; - $last = \count($temp) - 1; + $length -= (strlen($content) - $content_pos); + $last = count($temp) - 1; for ($i = 0; $i < $last; $i++) { // all subtags should be bit strings if ($temp[$i]['type'] != self::TYPE_BIT_STRING) { - return \false; + return false; } - $current['content'] .= \substr($temp[$i]['content'], 1); + $current['content'] .= substr($temp[$i]['content'], 1); } // all subtags should be bit strings if ($temp[$last]['type'] != self::TYPE_BIT_STRING) { - return \false; + return false; } - $current['content'] = $temp[$last]['content'][0] . $current['content'] . \substr($temp[$i]['content'], 1); + $current['content'] = $temp[$last]['content'][0] . $current['content'] . substr($temp[$i]['content'], 1); } break; case self::TYPE_OCTET_STRING: if (!$constructed) { - $current['content'] = \substr($content, $content_pos); + $current['content'] = substr($content, $content_pos); } else { $current['content'] = ''; $length = 0; - while (\substr($content, $content_pos, 2) != "\x00\x00") { + while (substr($content, $content_pos, 2) != "\0\0") { $temp = self::decode_ber($content, $length + $start, $content_pos); - if ($temp === \false) { - return \false; + if ($temp === false) { + return false; } $content_pos += $temp['length']; // all subtags should be octet strings if ($temp['type'] != self::TYPE_OCTET_STRING) { - return \false; + return false; } $current['content'] .= $temp['content']; $length += $temp['length']; } - if (\substr($content, $content_pos, 2) == "\x00\x00") { - $length += 2; - // +2 for the EOC + if (substr($content, $content_pos, 2) == "\0\0") { + $length += 2; // +2 for the EOC } } break; case self::TYPE_NULL: // "The contents octets shall not contain any octets." -- paragraph 8.8.2 - if ($constructed || \strlen($content)) { - return \false; + if ($constructed || strlen($content)) { + return false; } break; case self::TYPE_SEQUENCE: case self::TYPE_SET: if (!$constructed) { - return \false; + return false; } $offset = 0; $current['content'] = []; - $content_len = \strlen($content); + $content_len = strlen($content); while ($content_pos < $content_len) { // if indefinite length construction was used and we have an end-of-content string next // see paragraphs 8.1.1.3, 8.1.3.2, 8.1.3.6, 8.1.5, and (for an example) 8.6.4.2 - if (!isset($current['headerlength']) && \substr($content, $content_pos, 2) == "\x00\x00") { - $length = $offset + 2; - // +2 for the EOC + if (!isset($current['headerlength']) && substr($content, $content_pos, 2) == "\0\0") { + $length = $offset + 2; // +2 for the EOC break 2; } $temp = self::decode_ber($content, $start + $offset, $content_pos); - if ($temp === \false) { - return \false; + if ($temp === false) { + return false; } $content_pos += $temp['length']; $current['content'][] = $temp; @@ -412,60 +446,63 @@ private static function decode_ber($encoded, $start = 0, $encoded_pos = 0) break; case self::TYPE_OBJECT_IDENTIFIER: if ($constructed) { - return \false; + return false; } - $current['content'] = self::decodeOID(\substr($content, $content_pos)); - if ($current['content'] === \false) { - return \false; + $current['content'] = self::decodeOID(substr($content, $content_pos)); + if ($current['content'] === false) { + return false; } break; /* Each character string type shall be encoded as if it had been declared: - [UNIVERSAL x] IMPLICIT OCTET STRING - - -- X.690-0207.pdf#page=23 (paragraph 8.21.3) - - Per that, we're not going to do any validation. If there are any illegal characters in the string, - we don't really care */ + [UNIVERSAL x] IMPLICIT OCTET STRING + + -- X.690-0207.pdf#page=23 (paragraph 8.21.3) + + Per that, we're not going to do any validation. If there are any illegal characters in the string, + we don't really care */ case self::TYPE_NUMERIC_STRING: - // 0,1,2,3,4,5,6,7,8,9, and space + // 0,1,2,3,4,5,6,7,8,9, and space case self::TYPE_PRINTABLE_STRING: - // Upper and lower case letters, digits, space, apostrophe, left/right parenthesis, plus sign, comma, - // hyphen, full stop, solidus, colon, equal sign, question mark + // Upper and lower case letters, digits, space, apostrophe, left/right parenthesis, plus sign, comma, + // hyphen, full stop, solidus, colon, equal sign, question mark case self::TYPE_TELETEX_STRING: - // The Teletex character set in CCITT's T61, space, and delete - // see http://en.wikipedia.org/wiki/Teletex#Character_sets + // The Teletex character set in CCITT's T61, space, and delete + // see http://en.wikipedia.org/wiki/Teletex#Character_sets case self::TYPE_VIDEOTEX_STRING: - // The Videotex character set in CCITT's T.100 and T.101, space, and delete + // The Videotex character set in CCITT's T.100 and T.101, space, and delete case self::TYPE_VISIBLE_STRING: - // Printing character sets of international ASCII, and space + // Printing character sets of international ASCII, and space case self::TYPE_IA5_STRING: - // International Alphabet 5 (International ASCII) + // International Alphabet 5 (International ASCII) case self::TYPE_GRAPHIC_STRING: - // All registered G sets, and space + // All registered G sets, and space case self::TYPE_GENERAL_STRING: - // All registered C and G sets, space and delete + // All registered C and G sets, space and delete case self::TYPE_UTF8_STRING: - // ???? + // ???? case self::TYPE_BMP_STRING: if ($constructed) { - return \false; + return false; } - $current['content'] = \substr($content, $content_pos); + $current['content'] = substr($content, $content_pos); break; case self::TYPE_UTC_TIME: case self::TYPE_GENERALIZED_TIME: if ($constructed) { - return \false; + return false; } - $current['content'] = self::decodeTime(\substr($content, $content_pos), $tag); + $current['content'] = self::decodeTime(substr($content, $content_pos), $tag); break; default: - return \false; + return false; } + $start += $length; + // ie. length is the length of the full TLV encoding - it's not just the length of the value return $current + ['length' => $start - $current['start']]; } + /** * ASN.1 Map * @@ -480,24 +517,25 @@ private static function decode_ber($encoded, $start = 0, $encoded_pos = 0) */ public static function asn1map(array $decoded, $mapping, $special = []) { - if (isset($mapping['explicit']) && \is_array($decoded['content'])) { + if (isset($mapping['explicit']) && is_array($decoded['content'])) { $decoded = $decoded['content'][0]; } - switch (\true) { + + switch (true) { case $mapping['type'] == self::TYPE_ANY: $intype = $decoded['type']; // !isset(self::ANY_MAP[$intype]) produces a fatal error on PHP 5.6 - if (isset($decoded['constant']) || !\array_key_exists($intype, self::ANY_MAP) || \ord(self::$encoded[$decoded['start']]) & 0x20) { - return new Element(\substr(self::$encoded, $decoded['start'], $decoded['length'])); + if (isset($decoded['constant']) || !array_key_exists($intype, self::ANY_MAP) || (ord(self::$encoded[$decoded['start']]) & 0x20)) { + return new Element(substr(self::$encoded, $decoded['start'], $decoded['length'])); } $inmap = self::ANY_MAP[$intype]; - if (\is_string($inmap)) { + if (is_string($inmap)) { return [$inmap => self::asn1map($decoded, ['type' => $intype] + $mapping, $special)]; } break; case $mapping['type'] == self::TYPE_CHOICE: foreach ($mapping['children'] as $key => $option) { - switch (\true) { + switch (true) { case isset($option['constant']) && $option['constant'] == $decoded['constant']: case !isset($option['constant']) && $option['type'] == $decoded['type']: $value = self::asn1map($decoded, $option, $special); @@ -523,22 +561,23 @@ public static function asn1map(array $decoded, $mapping, $special = []) default: // if $decoded['type'] and $mapping['type'] are both strings, but different types of strings, // let it through - switch (\true) { - case $decoded['type'] < 18: - // self::TYPE_NUMERIC_STRING == 18 - case $decoded['type'] > 30: - // self::TYPE_BMP_STRING == 30 + switch (true) { + case $decoded['type'] < 18: // self::TYPE_NUMERIC_STRING == 18 + case $decoded['type'] > 30: // self::TYPE_BMP_STRING == 30 case $mapping['type'] < 18: case $mapping['type'] > 30: return null; } } + if (isset($mapping['implicit'])) { $decoded['type'] = $mapping['type']; } + switch ($decoded['type']) { case self::TYPE_SEQUENCE: $map = []; + // ignore the min and max if (isset($mapping['min']) && isset($mapping['max'])) { $child = $mapping['children']; @@ -547,15 +586,18 @@ public static function asn1map(array $decoded, $mapping, $special = []) return null; } } + return $map; } - $n = \count($decoded['content']); + + $n = count($decoded['content']); $i = 0; + foreach ($mapping['children'] as $key => $child) { - $maymatch = $i < $n; - // Match only existing input. + $maymatch = $i < $n; // Match only existing input. if ($maymatch) { $temp = $decoded['content'][$i]; + if ($child['type'] != self::TYPE_CHOICE) { // Get the mapping and input class & constant. $childClass = $tempClass = self::CLASS_UNIVERSAL; @@ -570,20 +612,23 @@ public static function asn1map(array $decoded, $mapping, $special = []) $childClass = self::CLASS_CONTEXT_SPECIFIC; $constant = $child['constant']; } + if (isset($constant) && isset($temp['constant'])) { // Can only match if constants and class match. $maymatch = $constant == $temp['constant'] && $childClass == $tempClass; } else { // Can only match if no constant expected and type matches or is generic. - $maymatch = !isset($child['constant']) && \array_search($child['type'], [$temp['type'], self::TYPE_ANY, self::TYPE_CHOICE]) !== \false; + $maymatch = !isset($child['constant']) && array_search($child['type'], [$temp['type'], self::TYPE_ANY, self::TYPE_CHOICE]) !== false; } } } + if ($maymatch) { // Attempt submapping. $candidate = self::asn1map($temp, $child, $special); $maymatch = $candidate !== null; } + if ($maymatch) { // Got the match: use it. if (isset($special[$key])) { @@ -594,15 +639,17 @@ public static function asn1map(array $decoded, $mapping, $special = []) } elseif (isset($child['default'])) { $map[$key] = $child['default']; } elseif (!isset($child['optional'])) { - return null; - // Syntax error. + return null; // Syntax error. } } + // Fail mapping if all input items have not been consumed. return $i < $n ? null : $map; + // the main diff between sets and sequences is the encapsulation of the foreach in another for loop case self::TYPE_SET: $map = []; + // ignore the min and max if (isset($mapping['min']) && isset($mapping['max'])) { $child = $mapping['children']; @@ -611,19 +658,22 @@ public static function asn1map(array $decoded, $mapping, $special = []) return null; } } + return $map; } - for ($i = 0; $i < \count($decoded['content']); $i++) { + + for ($i = 0; $i < count($decoded['content']); $i++) { $temp = $decoded['content'][$i]; $tempClass = self::CLASS_UNIVERSAL; if (isset($temp['constant'])) { $tempClass = $temp['type']; } + foreach ($mapping['children'] as $key => $child) { if (isset($map[$key])) { continue; } - $maymatch = \true; + $maymatch = true; if ($child['type'] != self::TYPE_CHOICE) { $childClass = self::CLASS_UNIVERSAL; $constant = null; @@ -634,22 +684,26 @@ public static function asn1map(array $decoded, $mapping, $special = []) $childClass = self::CLASS_CONTEXT_SPECIFIC; $constant = $child['constant']; } + if (isset($constant) && isset($temp['constant'])) { // Can only match if constants and class match. $maymatch = $constant == $temp['constant'] && $childClass == $tempClass; } else { // Can only match if no constant expected and type matches or is generic. - $maymatch = !isset($child['constant']) && \array_search($child['type'], [$temp['type'], self::TYPE_ANY, self::TYPE_CHOICE]) !== \false; + $maymatch = !isset($child['constant']) && array_search($child['type'], [$temp['type'], self::TYPE_ANY, self::TYPE_CHOICE]) !== false; } } + if ($maymatch) { // Attempt submapping. $candidate = self::asn1map($temp, $child, $special); $maymatch = $candidate !== null; } + if (!$maymatch) { break; } + // Got the match: use it. if (isset($special[$key])) { $candidate = $special[$key]($candidate); @@ -658,6 +712,7 @@ public static function asn1map(array $decoded, $mapping, $special = []) break; } } + foreach ($mapping['children'] as $key => $child) { if (!isset($map[$key])) { if (isset($child['default'])) { @@ -673,38 +728,38 @@ public static function asn1map(array $decoded, $mapping, $special = []) case self::TYPE_UTC_TIME: case self::TYPE_GENERALIZED_TIME: // for explicitly tagged optional stuff - if (\is_array($decoded['content'])) { + if (is_array($decoded['content'])) { $decoded['content'] = $decoded['content'][0]['content']; } // for implicitly tagged optional stuff // in theory, doing isset($mapping['implicit']) would work but malformed certs do exist // in the wild that OpenSSL decodes without issue so we'll support them as well - if (!\is_object($decoded['content'])) { + if (!is_object($decoded['content'])) { $decoded['content'] = self::decodeTime($decoded['content'], $decoded['type']); } - return $decoded['content'] ? $decoded['content']->format(self::$format) : \false; + return $decoded['content'] ? $decoded['content']->format(self::$format) : false; case self::TYPE_BIT_STRING: if (isset($mapping['mapping'])) { - $offset = \ord($decoded['content'][0]); - $size = (\strlen($decoded['content']) - 1) * 8 - $offset; + $offset = ord($decoded['content'][0]); + $size = (strlen($decoded['content']) - 1) * 8 - $offset; /* From X.680-0207.pdf#page=46 (21.7): - + "When a "NamedBitList" is used in defining a bitstring type ASN.1 encoding rules are free to add (or remove) arbitrarily any trailing 0 bits to (or from) values that are being encoded or decoded. Application designers should therefore ensure that different semantics are not associated with such values which differ only in the number of trailing 0 bits." */ - $bits = \count($mapping['mapping']) == $size ? [] : \array_fill(0, \count($mapping['mapping']) - $size, \false); - for ($i = \strlen($decoded['content']) - 1; $i > 0; $i--) { - $current = \ord($decoded['content'][$i]); + $bits = count($mapping['mapping']) == $size ? [] : array_fill(0, count($mapping['mapping']) - $size, false); + for ($i = strlen($decoded['content']) - 1; $i > 0; $i--) { + $current = ord($decoded['content'][$i]); for ($j = $offset; $j < 8; $j++) { - $bits[] = (bool) ($current & 1 << $j); + $bits[] = (bool) ($current & (1 << $j)); } $offset = 0; } $values = []; - $map = \array_reverse($mapping['mapping']); + $map = array_reverse($mapping['mapping']); foreach ($map as $i => $value) { if ($bits[$i]) { $values[] = $value; @@ -712,7 +767,7 @@ public static function asn1map(array $decoded, $mapping, $special = []) } return $values; } - // fall-through + // fall-through case self::TYPE_OCTET_STRING: return $decoded['content']; case self::TYPE_NULL: @@ -738,15 +793,18 @@ public static function asn1map(array $decoded, $mapping, $special = []) } if (isset($mapping['mapping'])) { $temp = $temp->toString(); - if (\strlen($temp) > 1) { - return \false; + if (strlen($temp) > 1) { + return false; } $temp = (int) $temp; - return isset($mapping['mapping'][$temp]) ? $mapping['mapping'][$temp] : \false; + return isset($mapping['mapping'][$temp]) ? + $mapping['mapping'][$temp] : + false; } return $temp; } } + /** * DER-decode the length * @@ -758,15 +816,15 @@ public static function asn1map(array $decoded, $mapping, $special = []) */ public static function decodeLength(&$string) { - $length = \ord(Strings::shift($string)); - if ($length & 0x80) { - // definite length, long form - $length &= 0x7f; + $length = ord(Strings::shift($string)); + if ($length & 0x80) { // definite length, long form + $length &= 0x7F; $temp = Strings::shift($string, $length); - list(, $length) = \unpack('N', \substr(\str_pad($temp, 4, \chr(0), \STR_PAD_LEFT), -4)); + list(, $length) = unpack('N', substr(str_pad($temp, 4, chr(0), STR_PAD_LEFT), -4)); } return $length; } + /** * ASN.1 Encode * @@ -785,6 +843,7 @@ public static function encodeDER($source, $mapping, $special = []) self::$location = []; return self::encode_der($source, $mapping, null, $special); } + /** * ASN.1 Encode (Helper function) * @@ -799,147 +858,163 @@ private static function encode_der($source, array $mapping, $idx = null, array $ if ($source instanceof Element) { return $source->element; } + // do not encode (implicitly optional) fields with value set to default if (isset($mapping['default']) && $source === $mapping['default']) { return ''; } + if (isset($idx)) { if (isset($special[$idx])) { $source = $special[$idx]($source); } self::$location[] = $idx; } + $tag = $mapping['type']; + switch ($tag) { - case self::TYPE_SET: - // Children order is not important, thus process in sequence. + case self::TYPE_SET: // Children order is not important, thus process in sequence. case self::TYPE_SEQUENCE: - $tag |= 0x20; - // set the constructed bit + $tag |= 0x20; // set the constructed bit + // ignore the min and max if (isset($mapping['min']) && isset($mapping['max'])) { $value = []; $child = $mapping['children']; + foreach ($source as $content) { $temp = self::encode_der($content, $child, null, $special); - if ($temp === \false) { - return \false; + if ($temp === false) { + return false; } $value[] = $temp; } /* "The encodings of the component values of a set-of value shall appear in ascending order, the encodings being compared - as octet strings with the shorter components being padded at their trailing end with 0-octets. - NOTE - The padding octets are for comparison purposes only and do not appear in the encodings." - - -- sec 11.6 of http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf */ + as octet strings with the shorter components being padded at their trailing end with 0-octets. + NOTE - The padding octets are for comparison purposes only and do not appear in the encodings." + + -- sec 11.6 of http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf */ if ($mapping['type'] == self::TYPE_SET) { - \sort($value); + sort($value); } - $value = \implode('', $value); + $value = implode('', $value); break; } + $value = ''; foreach ($mapping['children'] as $key => $child) { - if (!\array_key_exists($key, $source)) { + if (!array_key_exists($key, $source)) { if (!isset($child['optional'])) { - return \false; + return false; } continue; } + $temp = self::encode_der($source[$key], $child, $key, $special); - if ($temp === \false) { - return \false; + if ($temp === false) { + return false; } + // An empty child encoding means it has been optimized out. // Else we should have at least one tag byte. if ($temp === '') { continue; } + // if isset($child['constant']) is true then isset($child['optional']) should be true as well if (isset($child['constant'])) { /* - From X.680-0207.pdf#page=58 (30.6): - - "The tagging construction specifies explicit tagging if any of the following holds: - ... - c) the "Tag Type" alternative is used and the value of "TagDefault" for the module is IMPLICIT TAGS or - AUTOMATIC TAGS, but the type defined by "Type" is an untagged choice type, an untagged open type, or - an untagged "DummyReference" (see ITU-T Rec. X.683 | ISO/IEC 8824-4, 8.3)." - */ + From X.680-0207.pdf#page=58 (30.6): + + "The tagging construction specifies explicit tagging if any of the following holds: + ... + c) the "Tag Type" alternative is used and the value of "TagDefault" for the module is IMPLICIT TAGS or + AUTOMATIC TAGS, but the type defined by "Type" is an untagged choice type, an untagged open type, or + an untagged "DummyReference" (see ITU-T Rec. X.683 | ISO/IEC 8824-4, 8.3)." + */ if (isset($child['explicit']) || $child['type'] == self::TYPE_CHOICE) { if ($child['constant'] <= 30) { - $subtag = \chr(self::CLASS_CONTEXT_SPECIFIC << 6 | 0x20 | $child['constant']); + $subtag = chr((self::CLASS_CONTEXT_SPECIFIC << 6) | 0x20 | $child['constant']); } else { $constant = $child['constant']; $subtag = ''; while ($constant > 0) { - $subtagvalue = $constant & 0x7f; - $subtag = \chr(0x80 | $subtagvalue) . $subtag; + $subtagvalue = $constant & 0x7F; + $subtag = (chr(0x80 | $subtagvalue)) . $subtag; $constant = $constant >> 7; } - $subtag[\strlen($subtag) - 1] = $subtag[\strlen($subtag) - 1] & \chr(0x7f); - $subtag = \chr(self::CLASS_CONTEXT_SPECIFIC << 6 | 0x20 | 0x1f) . $subtag; + $subtag[strlen($subtag) - 1] = $subtag[strlen($subtag) - 1] & chr(0x7F); + $subtag = chr((self::CLASS_CONTEXT_SPECIFIC << 6) | 0x20 | 0x1f) . $subtag; } - $temp = $subtag . self::encodeLength(\strlen($temp)) . $temp; + $temp = $subtag . self::encodeLength(strlen($temp)) . $temp; } else { - $subtag = \chr(self::CLASS_CONTEXT_SPECIFIC << 6 | \ord($temp[0]) & 0x20 | $child['constant']); - $temp = $subtag . \substr($temp, 1); + $subtag = chr((self::CLASS_CONTEXT_SPECIFIC << 6) | (ord($temp[0]) & 0x20) | $child['constant']); + $temp = $subtag . substr($temp, 1); } } $value .= $temp; } break; case self::TYPE_CHOICE: - $temp = \false; + $temp = false; + foreach ($mapping['children'] as $key => $child) { if (!isset($source[$key])) { continue; } + $temp = self::encode_der($source[$key], $child, $key, $special); - if ($temp === \false) { - return \false; + if ($temp === false) { + return false; } + // An empty child encoding means it has been optimized out. // Else we should have at least one tag byte. if ($temp === '') { continue; } - $tag = \ord($temp[0]); + + $tag = ord($temp[0]); + // if isset($child['constant']) is true then isset($child['optional']) should be true as well if (isset($child['constant'])) { if (isset($child['explicit']) || $child['type'] == self::TYPE_CHOICE) { - $subtag = \chr(self::CLASS_CONTEXT_SPECIFIC << 6 | 0x20 | $child['constant']); - $temp = $subtag . self::encodeLength(\strlen($temp)) . $temp; + $subtag = chr((self::CLASS_CONTEXT_SPECIFIC << 6) | 0x20 | $child['constant']); + $temp = $subtag . self::encodeLength(strlen($temp)) . $temp; } else { - $subtag = \chr(self::CLASS_CONTEXT_SPECIFIC << 6 | \ord($temp[0]) & 0x20 | $child['constant']); - $temp = $subtag . \substr($temp, 1); + $subtag = chr((self::CLASS_CONTEXT_SPECIFIC << 6) | (ord($temp[0]) & 0x20) | $child['constant']); + $temp = $subtag . substr($temp, 1); } } } + if (isset($idx)) { - \array_pop(self::$location); + array_pop(self::$location); } + if ($temp && isset($mapping['cast'])) { - $temp[0] = \chr($mapping['class'] << 6 | $tag & 0x20 | $mapping['cast']); + $temp[0] = chr(($mapping['class'] << 6) | ($tag & 0x20) | $mapping['cast']); } + return $temp; case self::TYPE_INTEGER: case self::TYPE_ENUMERATED: if (!isset($mapping['mapping'])) { - if (\is_numeric($source)) { + if (is_numeric($source)) { $source = new BigInteger($source); } - $value = $source->toBytes(\true); + $value = $source->toBytes(true); } else { - $value = \array_search($source, $mapping['mapping']); - if ($value === \false) { - return \false; + $value = array_search($source, $mapping['mapping']); + if ($value === false) { + return false; } $value = new BigInteger($value); - $value = $value->toBytes(\true); + $value = $value->toBytes(true); } - if (!\strlen($value)) { - $value = \chr(0); + if (!strlen($value)) { + $value = chr(0); } break; case self::TYPE_UTC_TIME: @@ -954,36 +1029,42 @@ private static function encode_der($source, array $mapping, $idx = null, array $ break; case self::TYPE_BIT_STRING: if (isset($mapping['mapping'])) { - $bits = \array_fill(0, \count($mapping['mapping']), 0); + $bits = array_fill(0, count($mapping['mapping']), 0); $size = 0; - for ($i = 0; $i < \count($mapping['mapping']); $i++) { - if (\in_array($mapping['mapping'][$i], $source)) { + for ($i = 0; $i < count($mapping['mapping']); $i++) { + if (in_array($mapping['mapping'][$i], $source)) { $bits[$i] = 1; $size = $i; } } + if (isset($mapping['min']) && $mapping['min'] >= 1 && $size < $mapping['min']) { $size = $mapping['min'] - 1; } - $offset = 8 - ($size + 1 & 7); + + $offset = 8 - (($size + 1) & 7); $offset = $offset !== 8 ? $offset : 0; - $value = \chr($offset); - for ($i = $size + 1; $i < \count($mapping['mapping']); $i++) { + + $value = chr($offset); + + for ($i = $size + 1; $i < count($mapping['mapping']); $i++) { unset($bits[$i]); } - $bits = \implode('', \array_pad($bits, $size + $offset + 1, 0)); - $bytes = \explode(' ', \rtrim(\chunk_split($bits, 8, ' '))); + + $bits = implode('', array_pad($bits, $size + $offset + 1, 0)); + $bytes = explode(' ', rtrim(chunk_split($bits, 8, ' '))); foreach ($bytes as $byte) { - $value .= \chr(\bindec($byte)); + $value .= chr(bindec($byte)); } + break; } - // fall-through + // fall-through case self::TYPE_OCTET_STRING: /* The initial octet shall encode, as an unsigned binary integer with bit 1 as the least significant bit, - the number of unused bits in the final subsequent octet. The number shall be in the range zero to seven. - - -- http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#page=16 */ + the number of unused bits in the final subsequent octet. The number shall be in the range zero to seven. + + -- http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#page=16 */ $value = $source; break; case self::TYPE_OBJECT_IDENTIFIER: @@ -992,35 +1073,37 @@ private static function encode_der($source, array $mapping, $idx = null, array $ case self::TYPE_ANY: $loc = self::$location; if (isset($idx)) { - \array_pop(self::$location); + array_pop(self::$location); } - switch (\true) { + + switch (true) { case !isset($source): return self::encode_der(null, ['type' => self::TYPE_NULL] + $mapping, null, $special); - case \is_int($source): + case is_int($source): case $source instanceof BigInteger: return self::encode_der($source, ['type' => self::TYPE_INTEGER] + $mapping, null, $special); - case \is_float($source): + case is_float($source): return self::encode_der($source, ['type' => self::TYPE_REAL] + $mapping, null, $special); - case \is_bool($source): + case is_bool($source): return self::encode_der($source, ['type' => self::TYPE_BOOLEAN] + $mapping, null, $special); - case \is_array($source) && \count($source) == 1: - $typename = \implode('', \array_keys($source)); - $outtype = \array_search($typename, self::ANY_MAP, \true); - if ($outtype !== \false) { + case is_array($source) && count($source) == 1: + $typename = implode('', array_keys($source)); + $outtype = array_search($typename, self::ANY_MAP, true); + if ($outtype !== false) { return self::encode_der($source[$typename], ['type' => $outtype] + $mapping, null, $special); } } + $filters = self::$filters; foreach ($loc as $part) { if (!isset($filters[$part])) { - $filters = \false; + $filters = false; break; } $filters = $filters[$part]; } - if ($filters === \false) { - throw new \RuntimeException('No filters defined for ' . \implode('/', $loc)); + if ($filters === false) { + throw new \RuntimeException('No filters defined for ' . implode('/', $loc)); } return self::encode_der($source, $filters + $mapping, null, $special); case self::TYPE_NULL: @@ -1040,24 +1123,28 @@ private static function encode_der($source, array $mapping, $idx = null, array $ $value = $source; break; case self::TYPE_BOOLEAN: - $value = $source ? "\xff" : "\x00"; + $value = $source ? "\xFF" : "\x00"; break; default: - throw new \RuntimeException('Mapping provides no type definition for ' . \implode('/', self::$location)); + throw new \RuntimeException('Mapping provides no type definition for ' . implode('/', self::$location)); } + if (isset($idx)) { - \array_pop(self::$location); + array_pop(self::$location); } + if (isset($mapping['cast'])) { if (isset($mapping['explicit']) || $mapping['type'] == self::TYPE_CHOICE) { - $value = \chr($tag) . self::encodeLength(\strlen($value)) . $value; - $tag = $mapping['class'] << 6 | 0x20 | $mapping['cast']; + $value = chr($tag) . self::encodeLength(strlen($value)) . $value; + $tag = ($mapping['class'] << 6) | 0x20 | $mapping['cast']; } else { - $tag = $mapping['class'] << 6 | \ord($temp[0]) & 0x20 | $mapping['cast']; + $tag = ($mapping['class'] << 6) | (ord($temp[0]) & 0x20) | $mapping['cast']; } } - return \chr($tag) . self::encodeLength(\strlen($value)) . $value; + + return chr($tag) . self::encodeLength(strlen($value)) . $value; } + /** * BER-decode the OID * @@ -1074,45 +1161,49 @@ public static function decodeOID($content) if (!$eighty) { $eighty = new BigInteger(80); } + $oid = []; $pos = 0; - $len = \strlen($content); + $len = strlen($content); // see https://github.com/openjdk/jdk/blob/2deb318c9f047ec5a4b160d66a4b52f93688ec42/src/java.base/share/classes/sun/security/util/ObjectIdentifier.java#L55 if ($len > 4096) { //throw new \RuntimeException("Object identifier size is limited to 4096 bytes ($len bytes present)"); - return \false; + return false; } - if (\ord($content[$len - 1]) & 0x80) { - return \false; + + if (ord($content[$len - 1]) & 0x80) { + return false; } + $n = new BigInteger(); while ($pos < $len) { - $temp = \ord($content[$pos++]); + $temp = ord($content[$pos++]); $n = $n->bitwise_leftShift(7); - $n = $n->bitwise_or(new BigInteger($temp & 0x7f)); + $n = $n->bitwise_or(new BigInteger($temp & 0x7F)); if (~$temp & 0x80) { $oid[] = $n; $n = new BigInteger(); } } - $part1 = \array_shift($oid); - $first = \floor(\ord($content[0]) / 40); + $part1 = array_shift($oid); + $first = floor(ord($content[0]) / 40); /* "This packing of the first two object identifier components recognizes that only three values are allocated from the root node, and at most 39 subsequent values from nodes reached by X = 0 and X = 1." - + -- https://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#page=22 */ - if ($first <= 2) { - // ie. 0 <= ord($content[0]) < 120 (0x78) - \array_unshift($oid, \ord($content[0]) % 40); - \array_unshift($oid, $first); + if ($first <= 2) { // ie. 0 <= ord($content[0]) < 120 (0x78) + array_unshift($oid, ord($content[0]) % 40); + array_unshift($oid, $first); } else { - \array_unshift($oid, $part1->subtract($eighty)); - \array_unshift($oid, 2); + array_unshift($oid, $part1->subtract($eighty)); + array_unshift($oid, 2); } - return \implode('.', $oid); + + return implode('.', $oid); } + /** * DER-encode the OID * @@ -1125,44 +1216,51 @@ public static function encodeOID($source) { static $mask, $zero, $forty; if (!$mask) { - $mask = new BigInteger(0x7f); + $mask = new BigInteger(0x7F); $zero = new BigInteger(); $forty = new BigInteger(40); } - if (!\preg_match('#(?:\\d+\\.)+#', $source)) { - $oid = isset(self::$reverseOIDs[$source]) ? self::$reverseOIDs[$source] : \false; + + if (!preg_match('#(?:\d+\.)+#', $source)) { + $oid = isset(self::$reverseOIDs[$source]) ? self::$reverseOIDs[$source] : false; } else { $oid = $source; } - if ($oid === \false) { + if ($oid === false) { throw new \RuntimeException('Invalid OID'); } - $parts = \explode('.', $oid); - $part1 = \array_shift($parts); - $part2 = \array_shift($parts); + + $parts = explode('.', $oid); + $part1 = array_shift($parts); + $part2 = array_shift($parts); + $first = new BigInteger($part1); $first = $first->multiply($forty); $first = $first->add(new BigInteger($part2)); - \array_unshift($parts, $first->toString()); + + array_unshift($parts, $first->toString()); + $value = ''; foreach ($parts as $part) { if (!$part) { - $temp = "\x00"; + $temp = "\0"; } else { $temp = ''; $part = new BigInteger($part); while (!$part->equals($zero)) { $submask = $part->bitwise_and($mask); $submask->setPrecision(8); - $temp = (\chr(0x80) | $submask->toBytes()) . $temp; + $temp = (chr(0x80) | $submask->toBytes()) . $temp; $part = $part->bitwise_rightShift(7); } - $temp[\strlen($temp) - 1] = $temp[\strlen($temp) - 1] & \chr(0x7f); + $temp[strlen($temp) - 1] = $temp[strlen($temp) - 1] & chr(0x7F); } $value .= $temp; } + return $value; } + /** * BER-decode the time * @@ -1175,35 +1273,41 @@ public static function encodeOID($source) private static function decodeTime($content, $tag) { /* UTCTime: - http://tools.ietf.org/html/rfc5280#section-4.1.2.5.1 - http://www.obj-sys.com/asn1tutorial/node15.html - - GeneralizedTime: - http://tools.ietf.org/html/rfc5280#section-4.1.2.5.2 - http://www.obj-sys.com/asn1tutorial/node14.html */ + http://tools.ietf.org/html/rfc5280#section-4.1.2.5.1 + http://www.obj-sys.com/asn1tutorial/node15.html + + GeneralizedTime: + http://tools.ietf.org/html/rfc5280#section-4.1.2.5.2 + http://www.obj-sys.com/asn1tutorial/node14.html */ + $format = 'YmdHis'; + if ($tag == self::TYPE_UTC_TIME) { // https://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#page=28 says "the seconds // element shall always be present" but none-the-less I've seen X509 certs where it isn't and if the // browsers parse it phpseclib ought to too - if (\preg_match('#^(\\d{10})(Z|[+-]\\d{4})$#', $content, $matches)) { + if (preg_match('#^(\d{10})(Z|[+-]\d{4})$#', $content, $matches)) { $content = $matches[1] . '00' . $matches[2]; } - $prefix = \substr($content, 0, 2) >= 50 ? '19' : '20'; + $prefix = substr($content, 0, 2) >= 50 ? '19' : '20'; $content = $prefix . $content; - } elseif (\strpos($content, '.') !== \false) { + } elseif (strpos($content, '.') !== false) { $format .= '.u'; } - if ($content[\strlen($content) - 1] == 'Z') { - $content = \substr($content, 0, -1) . '+0000'; + + if ($content[strlen($content) - 1] == 'Z') { + $content = substr($content, 0, -1) . '+0000'; } - if (\strpos($content, '-') !== \false || \strpos($content, '+') !== \false) { + + if (strpos($content, '-') !== false || strpos($content, '+') !== false) { $format .= 'O'; } + // error supression isn't necessary as of PHP 7.0: // http://php.net/manual/en/migration70.other-changes.php return @\DateTime::createFromFormat($format, $content); } + /** * Set the time format * @@ -1215,6 +1319,7 @@ public static function setTimeFormat($format) { self::$format = $format; } + /** * Load OIDs * @@ -1226,8 +1331,9 @@ public static function setTimeFormat($format) public static function loadOIDs(array $oids) { self::$reverseOIDs += $oids; - self::$oids = \array_flip(self::$reverseOIDs); + self::$oids = array_flip(self::$reverseOIDs); } + /** * Set filters * @@ -1240,6 +1346,7 @@ public static function setFilters(array $filters) { self::$filters = $filters; } + /** * String type conversion * @@ -1254,96 +1361,100 @@ public static function setFilters(array $filters) public static function convert($in, $from = self::TYPE_UTF8_STRING, $to = self::TYPE_UTF8_STRING) { // isset(self::STRING_TYPE_SIZE[$from] returns a fatal error on PHP 5.6 - if (!\array_key_exists($from, self::STRING_TYPE_SIZE) || !\array_key_exists($to, self::STRING_TYPE_SIZE)) { - return \false; + if (!array_key_exists($from, self::STRING_TYPE_SIZE) || !array_key_exists($to, self::STRING_TYPE_SIZE)) { + return false; } $insize = self::STRING_TYPE_SIZE[$from]; $outsize = self::STRING_TYPE_SIZE[$to]; - $inlength = \strlen($in); + $inlength = strlen($in); $out = ''; + for ($i = 0; $i < $inlength;) { if ($inlength - $i < $insize) { - return \false; + return false; } + // Get an input character as a 32-bit value. - $c = \ord($in[$i++]); - switch (\true) { + $c = ord($in[$i++]); + switch (true) { case $insize == 4: - $c = $c << 8 | \ord($in[$i++]); - $c = $c << 8 | \ord($in[$i++]); - // fall-through + $c = ($c << 8) | ord($in[$i++]); + $c = ($c << 8) | ord($in[$i++]); + // fall-through case $insize == 2: - $c = $c << 8 | \ord($in[$i++]); - // fall-through + $c = ($c << 8) | ord($in[$i++]); + // fall-through case $insize == 1: break; - case ($c & 0x80) == 0x0: + case ($c & 0x80) == 0x00: break; - case ($c & 0x40) == 0x0: - return \false; + case ($c & 0x40) == 0x00: + return false; default: $bit = 6; do { - if ($bit > 25 || $i >= $inlength || (\ord($in[$i]) & 0xc0) != 0x80) { - return \false; + if ($bit > 25 || $i >= $inlength || (ord($in[$i]) & 0xC0) != 0x80) { + return false; } - $c = $c << 6 | \ord($in[$i++]) & 0x3f; + $c = ($c << 6) | (ord($in[$i++]) & 0x3F); $bit += 5; $mask = 1 << $bit; } while ($c & $bit); $c &= $mask - 1; break; } + // Convert and append the character to output string. $v = ''; - switch (\true) { + switch (true) { case $outsize == 4: - $v .= \chr($c & 0xff); + $v .= chr($c & 0xFF); $c >>= 8; - $v .= \chr($c & 0xff); + $v .= chr($c & 0xFF); $c >>= 8; - // fall-through + // fall-through case $outsize == 2: - $v .= \chr($c & 0xff); + $v .= chr($c & 0xFF); $c >>= 8; - // fall-through + // fall-through case $outsize == 1: - $v .= \chr($c & 0xff); + $v .= chr($c & 0xFF); $c >>= 8; if ($c) { - return \false; + return false; } break; - case ($c & (\PHP_INT_SIZE == 8 ? 0x80000000 : 1 << 31)) != 0: - return \false; - case $c >= 0x4000000: - $v .= \chr(0x80 | $c & 0x3f); - $c = $c >> 6 | 0x4000000; - // fall-through - case $c >= 0x200000: - $v .= \chr(0x80 | $c & 0x3f); - $c = $c >> 6 | 0x200000; - // fall-through - case $c >= 0x10000: - $v .= \chr(0x80 | $c & 0x3f); - $c = $c >> 6 | 0x10000; - // fall-through - case $c >= 0x800: - $v .= \chr(0x80 | $c & 0x3f); - $c = $c >> 6 | 0x800; - // fall-through - case $c >= 0x80: - $v .= \chr(0x80 | $c & 0x3f); - $c = $c >> 6 | 0xc0; - // fall-through + case ($c & (PHP_INT_SIZE == 8 ? 0x80000000 : (1 << 31))) != 0: + return false; + case $c >= 0x04000000: + $v .= chr(0x80 | ($c & 0x3F)); + $c = ($c >> 6) | 0x04000000; + // fall-through + case $c >= 0x00200000: + $v .= chr(0x80 | ($c & 0x3F)); + $c = ($c >> 6) | 0x00200000; + // fall-through + case $c >= 0x00010000: + $v .= chr(0x80 | ($c & 0x3F)); + $c = ($c >> 6) | 0x00010000; + // fall-through + case $c >= 0x00000800: + $v .= chr(0x80 | ($c & 0x3F)); + $c = ($c >> 6) | 0x00000800; + // fall-through + case $c >= 0x00000080: + $v .= chr(0x80 | ($c & 0x3F)); + $c = ($c >> 6) | 0x000000C0; + // fall-through default: - $v .= \chr($c); + $v .= chr($c); break; } - $out .= \strrev($v); + $out .= strrev($v); } return $out; } + /** * Extract raw BER from Base64 encoding * @@ -1361,19 +1472,20 @@ public static function extractBER($str) * subject=/O=organization/OU=org unit/CN=common name * issuer=/O=organization/CN=common name */ - if (\strlen($str) > \ini_get('pcre.backtrack_limit')) { + if (strlen($str) > ini_get('pcre.backtrack_limit')) { $temp = $str; } else { - $temp = \preg_replace('#.*?^-+[^-]+-+[\\r\\n ]*$#ms', '', $str, 1); - $temp = \preg_replace('#-+END.*[\\r\\n ]*.*#ms', '', $temp, 1); + $temp = preg_replace('#.*?^-+[^-]+-+[\r\n ]*$#ms', '', $str, 1); + $temp = preg_replace('#-+END.*[\r\n ]*.*#ms', '', $temp, 1); } // remove new lines - $temp = \str_replace(["\r", "\n", ' '], '', $temp); + $temp = str_replace(["\r", "\n", ' '], '', $temp); // remove the -----BEGIN CERTIFICATE----- and -----END CERTIFICATE----- stuff - $temp = \preg_replace('#^-+[^-]+-+|-+[^-]+-+$#', '', $temp); - $temp = \preg_match('#^[a-zA-Z\\d/+]*={0,2}$#', $temp) ? Strings::base64_decode($temp) : \false; - return $temp != \false ? $temp : $str; + $temp = preg_replace('#^-+[^-]+-+|-+[^-]+-+$#', '', $temp); + $temp = preg_match('#^[a-zA-Z\d/+]*={0,2}$#', $temp) ? Strings::base64_decode($temp) : false; + return $temp != false ? $temp : $str; } + /** * DER-encode the length * @@ -1385,12 +1497,14 @@ public static function extractBER($str) */ public static function encodeLength($length) { - if ($length <= 0x7f) { - return \chr($length); + if ($length <= 0x7F) { + return chr($length); } - $temp = \ltrim(\pack('N', $length), \chr(0)); - return \pack('Ca*', 0x80 | \strlen($temp), $temp); + + $temp = ltrim(pack('N', $length), chr(0)); + return pack('Ca*', 0x80 | strlen($temp), $temp); } + /** * Returns the OID corresponding to a name * diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Element.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Element.php index 965d8ee..60c4ca4 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Element.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Element.php @@ -10,6 +10,7 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1; /** @@ -19,7 +20,6 @@ * will also bypass the normal encoding rules in ASN1::encodeDER() * * @author Jim Wigginton - * @internal */ class Element { @@ -29,6 +29,7 @@ class Element * @var string */ public $element; + /** * Constructor * diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AccessDescription.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AccessDescription.php index 16f27b6..9ddf93d 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AccessDescription.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AccessDescription.php @@ -10,16 +10,23 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * AccessDescription * * @author Jim Wigginton - * @internal */ abstract class AccessDescription { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['accessMethod' => ['type' => ASN1::TYPE_OBJECT_IDENTIFIER], 'accessLocation' => GeneralName::MAP]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'accessMethod' => ['type' => ASN1::TYPE_OBJECT_IDENTIFIER], + 'accessLocation' => GeneralName::MAP + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AdministrationDomainName.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AdministrationDomainName.php index 492fda9..aa231a7 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AdministrationDomainName.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AdministrationDomainName.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * AdministrationDomainName * * @author Jim Wigginton - * @internal */ abstract class AdministrationDomainName { @@ -27,6 +28,9 @@ abstract class AdministrationDomainName // (if constant is present) \phpseclib3\File\ASN1::CLASS_CONTEXT_SPECIFIC 'class' => ASN1::CLASS_APPLICATION, 'cast' => 2, - 'children' => ['numeric' => ['type' => ASN1::TYPE_NUMERIC_STRING], 'printable' => ['type' => ASN1::TYPE_PRINTABLE_STRING]], + 'children' => [ + 'numeric' => ['type' => ASN1::TYPE_NUMERIC_STRING], + 'printable' => ['type' => ASN1::TYPE_PRINTABLE_STRING] + ] ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AlgorithmIdentifier.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AlgorithmIdentifier.php index c73e39b..570b4eb 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AlgorithmIdentifier.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AlgorithmIdentifier.php @@ -10,16 +10,26 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * AlgorithmIdentifier * * @author Jim Wigginton - * @internal */ abstract class AlgorithmIdentifier { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['algorithm' => ['type' => ASN1::TYPE_OBJECT_IDENTIFIER], 'parameters' => ['type' => ASN1::TYPE_ANY, 'optional' => \true]]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'algorithm' => ['type' => ASN1::TYPE_OBJECT_IDENTIFIER], + 'parameters' => [ + 'type' => ASN1::TYPE_ANY, + 'optional' => true + ] + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AnotherName.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AnotherName.php index add0cfd..277263e 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AnotherName.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AnotherName.php @@ -10,16 +10,28 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * AnotherName * * @author Jim Wigginton - * @internal */ abstract class AnotherName { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['type-id' => ['type' => ASN1::TYPE_OBJECT_IDENTIFIER], 'value' => ['type' => ASN1::TYPE_ANY, 'constant' => 0, 'optional' => \true, 'explicit' => \true]]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'type-id' => ['type' => ASN1::TYPE_OBJECT_IDENTIFIER], + 'value' => [ + 'type' => ASN1::TYPE_ANY, + 'constant' => 0, + 'optional' => true, + 'explicit' => true + ] + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Attribute.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Attribute.php index 27694b1..282cb54 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Attribute.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Attribute.php @@ -10,16 +10,28 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * Attribute * * @author Jim Wigginton - * @internal */ abstract class Attribute { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['type' => AttributeType::MAP, 'value' => ['type' => ASN1::TYPE_SET, 'min' => 1, 'max' => -1, 'children' => AttributeValue::MAP]]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'type' => AttributeType::MAP, + 'value' => [ + 'type' => ASN1::TYPE_SET, + 'min' => 1, + 'max' => -1, + 'children' => AttributeValue::MAP + ] + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeType.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeType.php index e69b6b4..31e1510 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeType.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeType.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * AttributeType * * @author Jim Wigginton - * @internal */ abstract class AttributeType { diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeTypeAndValue.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeTypeAndValue.php index 0746b1e..cc830be 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeTypeAndValue.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeTypeAndValue.php @@ -10,16 +10,23 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * AttributeTypeAndValue * * @author Jim Wigginton - * @internal */ abstract class AttributeTypeAndValue { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['type' => AttributeType::MAP, 'value' => AttributeValue::MAP]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'type' => AttributeType::MAP, + 'value' => AttributeValue::MAP + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeValue.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeValue.php index 744be18..2282e4a 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeValue.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeValue.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * AttributeValue * * @author Jim Wigginton - * @internal */ abstract class AttributeValue { diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Attributes.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Attributes.php index 8017ae0..7ce1aa4 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Attributes.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Attributes.php @@ -10,16 +10,22 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * Attributes * * @author Jim Wigginton - * @internal */ abstract class Attributes { - const MAP = ['type' => ASN1::TYPE_SET, 'min' => 1, 'max' => -1, 'children' => Attribute::MAP]; + const MAP = [ + 'type' => ASN1::TYPE_SET, + 'min' => 1, + 'max' => -1, + 'children' => Attribute::MAP + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AuthorityInfoAccessSyntax.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AuthorityInfoAccessSyntax.php index 2de2d5a..4aa4cbb 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AuthorityInfoAccessSyntax.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AuthorityInfoAccessSyntax.php @@ -10,16 +10,22 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * AuthorityInfoAccessSyntax * * @author Jim Wigginton - * @internal */ abstract class AuthorityInfoAccessSyntax { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'min' => 1, 'max' => -1, 'children' => AccessDescription::MAP]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'min' => 1, + 'max' => -1, + 'children' => AccessDescription::MAP + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AuthorityKeyIdentifier.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AuthorityKeyIdentifier.php index b4df54f..1aa4e9e 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AuthorityKeyIdentifier.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AuthorityKeyIdentifier.php @@ -10,16 +10,36 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * AuthorityKeyIdentifier * * @author Jim Wigginton - * @internal */ abstract class AuthorityKeyIdentifier { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['keyIdentifier' => ['constant' => 0, 'optional' => \true, 'implicit' => \true] + KeyIdentifier::MAP, 'authorityCertIssuer' => ['constant' => 1, 'optional' => \true, 'implicit' => \true] + GeneralNames::MAP, 'authorityCertSerialNumber' => ['constant' => 2, 'optional' => \true, 'implicit' => \true] + CertificateSerialNumber::MAP]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'keyIdentifier' => [ + 'constant' => 0, + 'optional' => true, + 'implicit' => true + ] + KeyIdentifier::MAP, + 'authorityCertIssuer' => [ + 'constant' => 1, + 'optional' => true, + 'implicit' => true + ] + GeneralNames::MAP, + 'authorityCertSerialNumber' => [ + 'constant' => 2, + 'optional' => true, + 'implicit' => true + ] + CertificateSerialNumber::MAP + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BaseDistance.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BaseDistance.php index b3e594b..a3e20e9 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BaseDistance.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BaseDistance.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * BaseDistance * * @author Jim Wigginton - * @internal */ abstract class BaseDistance { diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BasicConstraints.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BasicConstraints.php index 474085f..a29ac2d 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BasicConstraints.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BasicConstraints.php @@ -10,16 +10,30 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * BasicConstraints * * @author Jim Wigginton - * @internal */ abstract class BasicConstraints { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['cA' => ['type' => ASN1::TYPE_BOOLEAN, 'optional' => \true, 'default' => \false], 'pathLenConstraint' => ['type' => ASN1::TYPE_INTEGER, 'optional' => \true]]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'cA' => [ + 'type' => ASN1::TYPE_BOOLEAN, + 'optional' => true, + 'default' => false + ], + 'pathLenConstraint' => [ + 'type' => ASN1::TYPE_INTEGER, + 'optional' => true + ] + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInDomainDefinedAttribute.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInDomainDefinedAttribute.php index 0003924..02b1a48 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInDomainDefinedAttribute.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInDomainDefinedAttribute.php @@ -10,16 +10,23 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * BuiltInDomainDefinedAttribute * * @author Jim Wigginton - * @internal */ abstract class BuiltInDomainDefinedAttribute { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['type' => ['type' => ASN1::TYPE_PRINTABLE_STRING], 'value' => ['type' => ASN1::TYPE_PRINTABLE_STRING]]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'type' => ['type' => ASN1::TYPE_PRINTABLE_STRING], + 'value' => ['type' => ASN1::TYPE_PRINTABLE_STRING] + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInDomainDefinedAttributes.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInDomainDefinedAttributes.php index ebb54e6..53e9d56 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInDomainDefinedAttributes.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInDomainDefinedAttributes.php @@ -10,22 +10,22 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * BuiltInDomainDefinedAttributes * * @author Jim Wigginton - * @internal */ abstract class BuiltInDomainDefinedAttributes { const MAP = [ 'type' => ASN1::TYPE_SEQUENCE, 'min' => 1, - 'max' => 4, - // ub-domain-defined-attributes - 'children' => BuiltInDomainDefinedAttribute::MAP, + 'max' => 4, // ub-domain-defined-attributes + 'children' => BuiltInDomainDefinedAttribute::MAP ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInStandardAttributes.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInStandardAttributes.php index 357c208..be5c916 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInStandardAttributes.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInStandardAttributes.php @@ -10,16 +10,58 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * BuiltInStandardAttributes * * @author Jim Wigginton - * @internal */ abstract class BuiltInStandardAttributes { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['country-name' => ['optional' => \true] + CountryName::MAP, 'administration-domain-name' => ['optional' => \true] + AdministrationDomainName::MAP, 'network-address' => ['constant' => 0, 'optional' => \true, 'implicit' => \true] + NetworkAddress::MAP, 'terminal-identifier' => ['constant' => 1, 'optional' => \true, 'implicit' => \true] + TerminalIdentifier::MAP, 'private-domain-name' => ['constant' => 2, 'optional' => \true, 'explicit' => \true] + PrivateDomainName::MAP, 'organization-name' => ['constant' => 3, 'optional' => \true, 'implicit' => \true] + OrganizationName::MAP, 'numeric-user-identifier' => ['constant' => 4, 'optional' => \true, 'implicit' => \true] + NumericUserIdentifier::MAP, 'personal-name' => ['constant' => 5, 'optional' => \true, 'implicit' => \true] + PersonalName::MAP, 'organizational-unit-names' => ['constant' => 6, 'optional' => \true, 'implicit' => \true] + OrganizationalUnitNames::MAP]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'country-name' => ['optional' => true] + CountryName::MAP, + 'administration-domain-name' => ['optional' => true] + AdministrationDomainName::MAP, + 'network-address' => [ + 'constant' => 0, + 'optional' => true, + 'implicit' => true + ] + NetworkAddress::MAP, + 'terminal-identifier' => [ + 'constant' => 1, + 'optional' => true, + 'implicit' => true + ] + TerminalIdentifier::MAP, + 'private-domain-name' => [ + 'constant' => 2, + 'optional' => true, + 'explicit' => true + ] + PrivateDomainName::MAP, + 'organization-name' => [ + 'constant' => 3, + 'optional' => true, + 'implicit' => true + ] + OrganizationName::MAP, + 'numeric-user-identifier' => [ + 'constant' => 4, + 'optional' => true, + 'implicit' => true + ] + NumericUserIdentifier::MAP, + 'personal-name' => [ + 'constant' => 5, + 'optional' => true, + 'implicit' => true + ] + PersonalName::MAP, + 'organizational-unit-names' => [ + 'constant' => 6, + 'optional' => true, + 'implicit' => true + ] + OrganizationalUnitNames::MAP + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CPSuri.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CPSuri.php index 61ca4a9..e262649 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CPSuri.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CPSuri.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * CPSuri * * @author Jim Wigginton - * @internal */ abstract class CPSuri { diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLDistributionPoints.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLDistributionPoints.php index 93dfa52..2ed86d2 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLDistributionPoints.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLDistributionPoints.php @@ -10,16 +10,22 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * CRLDistributionPoints * * @author Jim Wigginton - * @internal */ abstract class CRLDistributionPoints { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'min' => 1, 'max' => -1, 'children' => DistributionPoint::MAP]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'min' => 1, + 'max' => -1, + 'children' => DistributionPoint::MAP + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLNumber.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLNumber.php index eca1e99..8bca7e7 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLNumber.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLNumber.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * CRLNumber * * @author Jim Wigginton - * @internal */ abstract class CRLNumber { diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLReason.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLReason.php index a48a3b3..ee06694 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLReason.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLReason.php @@ -10,28 +10,32 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * CRLReason * * @author Jim Wigginton - * @internal */ abstract class CRLReason { - const MAP = ['type' => ASN1::TYPE_ENUMERATED, 'mapping' => [ - 'unspecified', - 'keyCompromise', - 'cACompromise', - 'affiliationChanged', - 'superseded', - 'cessationOfOperation', - 'certificateHold', - // Value 7 is not used. - 8 => 'removeFromCRL', - 'privilegeWithdrawn', - 'aACompromise', - ]]; + const MAP = [ + 'type' => ASN1::TYPE_ENUMERATED, + 'mapping' => [ + 'unspecified', + 'keyCompromise', + 'cACompromise', + 'affiliationChanged', + 'superseded', + 'cessationOfOperation', + 'certificateHold', + // Value 7 is not used. + 8 => 'removeFromCRL', + 'privilegeWithdrawn', + 'aACompromise' + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertPolicyId.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertPolicyId.php index 30bf566..32ff50c 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertPolicyId.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertPolicyId.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * CertPolicyId * * @author Jim Wigginton - * @internal */ abstract class CertPolicyId { diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Certificate.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Certificate.php index e92a697..4553516 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Certificate.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Certificate.php @@ -10,16 +10,24 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * Certificate * * @author Jim Wigginton - * @internal */ abstract class Certificate { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['tbsCertificate' => TBSCertificate::MAP, 'signatureAlgorithm' => AlgorithmIdentifier::MAP, 'signature' => ['type' => ASN1::TYPE_BIT_STRING]]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'tbsCertificate' => TBSCertificate::MAP, + 'signatureAlgorithm' => AlgorithmIdentifier::MAP, + 'signature' => ['type' => ASN1::TYPE_BIT_STRING] + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateIssuer.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateIssuer.php index f6b9d87..c72fbff 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateIssuer.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateIssuer.php @@ -10,13 +10,13 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; /** * CertificateIssuer * * @author Jim Wigginton - * @internal */ abstract class CertificateIssuer { diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateList.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateList.php index a61059e..d958ee4 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateList.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateList.php @@ -10,16 +10,24 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * CertificateList * * @author Jim Wigginton - * @internal */ abstract class CertificateList { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['tbsCertList' => TBSCertList::MAP, 'signatureAlgorithm' => AlgorithmIdentifier::MAP, 'signature' => ['type' => ASN1::TYPE_BIT_STRING]]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'tbsCertList' => TBSCertList::MAP, + 'signatureAlgorithm' => AlgorithmIdentifier::MAP, + 'signature' => ['type' => ASN1::TYPE_BIT_STRING] + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificatePolicies.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificatePolicies.php index 814d024..976ab36 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificatePolicies.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificatePolicies.php @@ -10,16 +10,22 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * CertificatePolicies * * @author Jim Wigginton - * @internal */ abstract class CertificatePolicies { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'min' => 1, 'max' => -1, 'children' => PolicyInformation::MAP]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'min' => 1, + 'max' => -1, + 'children' => PolicyInformation::MAP + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateSerialNumber.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateSerialNumber.php index 96cb0b7..3afd207 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateSerialNumber.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateSerialNumber.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * CertificateSerialNumber * * @author Jim Wigginton - * @internal */ abstract class CertificateSerialNumber { diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificationRequest.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificationRequest.php index 0c40b95..db7df83 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificationRequest.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificationRequest.php @@ -10,16 +10,24 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * CertificationRequest * * @author Jim Wigginton - * @internal */ abstract class CertificationRequest { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['certificationRequestInfo' => CertificationRequestInfo::MAP, 'signatureAlgorithm' => AlgorithmIdentifier::MAP, 'signature' => ['type' => ASN1::TYPE_BIT_STRING]]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'certificationRequestInfo' => CertificationRequestInfo::MAP, + 'signatureAlgorithm' => AlgorithmIdentifier::MAP, + 'signature' => ['type' => ASN1::TYPE_BIT_STRING] + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificationRequestInfo.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificationRequestInfo.php index 9573544..d90c00d 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificationRequestInfo.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificationRequestInfo.php @@ -10,16 +10,32 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * CertificationRequestInfo * * @author Jim Wigginton - * @internal */ abstract class CertificationRequestInfo { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['version' => ['type' => ASN1::TYPE_INTEGER, 'mapping' => ['v1']], 'subject' => Name::MAP, 'subjectPKInfo' => SubjectPublicKeyInfo::MAP, 'attributes' => ['constant' => 0, 'optional' => \true, 'implicit' => \true] + Attributes::MAP]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'version' => [ + 'type' => ASN1::TYPE_INTEGER, + 'mapping' => ['v1'] + ], + 'subject' => Name::MAP, + 'subjectPKInfo' => SubjectPublicKeyInfo::MAP, + 'attributes' => [ + 'constant' => 0, + 'optional' => true, + 'implicit' => true + ] + Attributes::MAP, + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Characteristic_two.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Characteristic_two.php index 0330491..8c4b16f 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Characteristic_two.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Characteristic_two.php @@ -10,21 +10,27 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * Characteristic_two * * @author Jim Wigginton - * @internal */ abstract class Characteristic_two { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => [ - 'm' => ['type' => ASN1::TYPE_INTEGER], - // field size 2**m - 'basis' => ['type' => ASN1::TYPE_OBJECT_IDENTIFIER], - 'parameters' => ['type' => ASN1::TYPE_ANY, 'optional' => \true], - ]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'm' => ['type' => ASN1::TYPE_INTEGER], // field size 2**m + 'basis' => ['type' => ASN1::TYPE_OBJECT_IDENTIFIER], + 'parameters' => [ + 'type' => ASN1::TYPE_ANY, + 'optional' => true + ] + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CountryName.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CountryName.php index 9b0a27e..b2f187f 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CountryName.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CountryName.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * CountryName * * @author Jim Wigginton - * @internal */ abstract class CountryName { @@ -27,6 +28,9 @@ abstract class CountryName // (if constant is present) \phpseclib3\File\ASN1::CLASS_CONTEXT_SPECIFIC 'class' => ASN1::CLASS_APPLICATION, 'cast' => 1, - 'children' => ['x121-dcc-code' => ['type' => ASN1::TYPE_NUMERIC_STRING], 'iso-3166-alpha2-code' => ['type' => ASN1::TYPE_PRINTABLE_STRING]], + 'children' => [ + 'x121-dcc-code' => ['type' => ASN1::TYPE_NUMERIC_STRING], + 'iso-3166-alpha2-code' => ['type' => ASN1::TYPE_PRINTABLE_STRING] + ] ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Curve.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Curve.php index 48f802b..ddd8465 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Curve.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Curve.php @@ -10,16 +10,27 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * Curve * * @author Jim Wigginton - * @internal */ abstract class Curve { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['a' => FieldElement::MAP, 'b' => FieldElement::MAP, 'seed' => ['type' => ASN1::TYPE_BIT_STRING, 'optional' => \true]]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'a' => FieldElement::MAP, + 'b' => FieldElement::MAP, + 'seed' => [ + 'type' => ASN1::TYPE_BIT_STRING, + 'optional' => true + ] + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DHParameter.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DHParameter.php index f1df686..66eefe8 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DHParameter.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DHParameter.php @@ -12,16 +12,27 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * DHParameter * * @author Jim Wigginton - * @internal */ abstract class DHParameter { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['prime' => ['type' => ASN1::TYPE_INTEGER], 'base' => ['type' => ASN1::TYPE_INTEGER], 'privateValueLength' => ['type' => ASN1::TYPE_INTEGER, 'optional' => \true]]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'prime' => ['type' => ASN1::TYPE_INTEGER], + 'base' => ['type' => ASN1::TYPE_INTEGER], + 'privateValueLength' => [ + 'type' => ASN1::TYPE_INTEGER, + 'optional' => true + ] + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAParams.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAParams.php index 35af77c..da85381 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAParams.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAParams.php @@ -10,16 +10,24 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * DSAParams * * @author Jim Wigginton - * @internal */ abstract class DSAParams { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['p' => ['type' => ASN1::TYPE_INTEGER], 'q' => ['type' => ASN1::TYPE_INTEGER], 'g' => ['type' => ASN1::TYPE_INTEGER]]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'p' => ['type' => ASN1::TYPE_INTEGER], + 'q' => ['type' => ASN1::TYPE_INTEGER], + 'g' => ['type' => ASN1::TYPE_INTEGER] + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAPrivateKey.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAPrivateKey.php index e1d3fbc..73d820a 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAPrivateKey.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAPrivateKey.php @@ -10,16 +10,27 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * DSAPrivateKey * * @author Jim Wigginton - * @internal */ abstract class DSAPrivateKey { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['version' => ['type' => ASN1::TYPE_INTEGER], 'p' => ['type' => ASN1::TYPE_INTEGER], 'q' => ['type' => ASN1::TYPE_INTEGER], 'g' => ['type' => ASN1::TYPE_INTEGER], 'y' => ['type' => ASN1::TYPE_INTEGER], 'x' => ['type' => ASN1::TYPE_INTEGER]]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'version' => ['type' => ASN1::TYPE_INTEGER], + 'p' => ['type' => ASN1::TYPE_INTEGER], + 'q' => ['type' => ASN1::TYPE_INTEGER], + 'g' => ['type' => ASN1::TYPE_INTEGER], + 'y' => ['type' => ASN1::TYPE_INTEGER], + 'x' => ['type' => ASN1::TYPE_INTEGER] + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAPublicKey.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAPublicKey.php index 2e87a77..b832db8 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAPublicKey.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAPublicKey.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * DSAPublicKey * * @author Jim Wigginton - * @internal */ abstract class DSAPublicKey { diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DigestInfo.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DigestInfo.php index 71890ba..f32f7e4 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DigestInfo.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DigestInfo.php @@ -10,18 +10,25 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * DigestInfo * * from https://tools.ietf.org/html/rfc2898#appendix-A.3 * * @author Jim Wigginton - * @internal */ abstract class DigestInfo { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['digestAlgorithm' => AlgorithmIdentifier::MAP, 'digest' => ['type' => ASN1::TYPE_OCTET_STRING]]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'digestAlgorithm' => AlgorithmIdentifier::MAP, + 'digest' => ['type' => ASN1::TYPE_OCTET_STRING] + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DirectoryString.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DirectoryString.php index 47b27fb..66ec65b 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DirectoryString.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DirectoryString.php @@ -10,16 +10,26 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * DirectoryString * * @author Jim Wigginton - * @internal */ abstract class DirectoryString { - const MAP = ['type' => ASN1::TYPE_CHOICE, 'children' => ['teletexString' => ['type' => ASN1::TYPE_TELETEX_STRING], 'printableString' => ['type' => ASN1::TYPE_PRINTABLE_STRING], 'universalString' => ['type' => ASN1::TYPE_UNIVERSAL_STRING], 'utf8String' => ['type' => ASN1::TYPE_UTF8_STRING], 'bmpString' => ['type' => ASN1::TYPE_BMP_STRING]]]; + const MAP = [ + 'type' => ASN1::TYPE_CHOICE, + 'children' => [ + 'teletexString' => ['type' => ASN1::TYPE_TELETEX_STRING], + 'printableString' => ['type' => ASN1::TYPE_PRINTABLE_STRING], + 'universalString' => ['type' => ASN1::TYPE_UNIVERSAL_STRING], + 'utf8String' => ['type' => ASN1::TYPE_UTF8_STRING], + 'bmpString' => ['type' => ASN1::TYPE_BMP_STRING] + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DisplayText.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DisplayText.php index 0d1c07e..b739783 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DisplayText.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DisplayText.php @@ -10,16 +10,25 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * DisplayText * * @author Jim Wigginton - * @internal */ abstract class DisplayText { - const MAP = ['type' => ASN1::TYPE_CHOICE, 'children' => ['ia5String' => ['type' => ASN1::TYPE_IA5_STRING], 'visibleString' => ['type' => ASN1::TYPE_VISIBLE_STRING], 'bmpString' => ['type' => ASN1::TYPE_BMP_STRING], 'utf8String' => ['type' => ASN1::TYPE_UTF8_STRING]]]; + const MAP = [ + 'type' => ASN1::TYPE_CHOICE, + 'children' => [ + 'ia5String' => ['type' => ASN1::TYPE_IA5_STRING], + 'visibleString' => ['type' => ASN1::TYPE_VISIBLE_STRING], + 'bmpString' => ['type' => ASN1::TYPE_BMP_STRING], + 'utf8String' => ['type' => ASN1::TYPE_UTF8_STRING] + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DistributionPoint.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DistributionPoint.php index d46f060..c5c2c95 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DistributionPoint.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DistributionPoint.php @@ -10,16 +10,36 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * DistributionPoint * * @author Jim Wigginton - * @internal */ abstract class DistributionPoint { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['distributionPoint' => ['constant' => 0, 'optional' => \true, 'explicit' => \true] + DistributionPointName::MAP, 'reasons' => ['constant' => 1, 'optional' => \true, 'implicit' => \true] + ReasonFlags::MAP, 'cRLIssuer' => ['constant' => 2, 'optional' => \true, 'implicit' => \true] + GeneralNames::MAP]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'distributionPoint' => [ + 'constant' => 0, + 'optional' => true, + 'explicit' => true + ] + DistributionPointName::MAP, + 'reasons' => [ + 'constant' => 1, + 'optional' => true, + 'implicit' => true + ] + ReasonFlags::MAP, + 'cRLIssuer' => [ + 'constant' => 2, + 'optional' => true, + 'implicit' => true + ] + GeneralNames::MAP + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DistributionPointName.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DistributionPointName.php index 72cb566..55f4767 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DistributionPointName.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DistributionPointName.php @@ -10,16 +10,31 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * DistributionPointName * * @author Jim Wigginton - * @internal */ abstract class DistributionPointName { - const MAP = ['type' => ASN1::TYPE_CHOICE, 'children' => ['fullName' => ['constant' => 0, 'optional' => \true, 'implicit' => \true] + GeneralNames::MAP, 'nameRelativeToCRLIssuer' => ['constant' => 1, 'optional' => \true, 'implicit' => \true] + RelativeDistinguishedName::MAP]]; + const MAP = [ + 'type' => ASN1::TYPE_CHOICE, + 'children' => [ + 'fullName' => [ + 'constant' => 0, + 'optional' => true, + 'implicit' => true + ] + GeneralNames::MAP, + 'nameRelativeToCRLIssuer' => [ + 'constant' => 1, + 'optional' => true, + 'implicit' => true + ] + RelativeDistinguishedName::MAP + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DssSigValue.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DssSigValue.php index de2b3a9..c0db0ed 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DssSigValue.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DssSigValue.php @@ -10,16 +10,23 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * DssSigValue * * @author Jim Wigginton - * @internal */ abstract class DssSigValue { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['r' => ['type' => ASN1::TYPE_INTEGER], 's' => ['type' => ASN1::TYPE_INTEGER]]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'r' => ['type' => ASN1::TYPE_INTEGER], + 's' => ['type' => ASN1::TYPE_INTEGER] + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECParameters.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECParameters.php index fa69aa9..cb5985d 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECParameters.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECParameters.php @@ -12,9 +12,11 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * ECParameters * @@ -29,9 +31,15 @@ * -- with ANSI X9. * * @author Jim Wigginton - * @internal */ abstract class ECParameters { - const MAP = ['type' => ASN1::TYPE_CHOICE, 'children' => ['namedCurve' => ['type' => ASN1::TYPE_OBJECT_IDENTIFIER], 'implicitCurve' => ['type' => ASN1::TYPE_NULL], 'specifiedCurve' => SpecifiedECDomain::MAP]]; + const MAP = [ + 'type' => ASN1::TYPE_CHOICE, + 'children' => [ + 'namedCurve' => ['type' => ASN1::TYPE_OBJECT_IDENTIFIER], + 'implicitCurve' => ['type' => ASN1::TYPE_NULL], + 'specifiedCurve' => SpecifiedECDomain::MAP + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECPoint.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECPoint.php index 4052b14..c794011 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECPoint.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECPoint.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * ECPoint * * @author Jim Wigginton - * @internal */ abstract class ECPoint { diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECPrivateKey.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECPrivateKey.php index d64a948..636c642 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECPrivateKey.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECPrivateKey.php @@ -12,16 +12,37 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * ECPrivateKey * * @author Jim Wigginton - * @internal */ abstract class ECPrivateKey { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['version' => ['type' => ASN1::TYPE_INTEGER, 'mapping' => [1 => 'ecPrivkeyVer1']], 'privateKey' => ['type' => ASN1::TYPE_OCTET_STRING], 'parameters' => ['constant' => 0, 'optional' => \true, 'explicit' => \true] + ECParameters::MAP, 'publicKey' => ['type' => ASN1::TYPE_BIT_STRING, 'constant' => 1, 'optional' => \true, 'explicit' => \true]]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'version' => [ + 'type' => ASN1::TYPE_INTEGER, + 'mapping' => [1 => 'ecPrivkeyVer1'] + ], + 'privateKey' => ['type' => ASN1::TYPE_OCTET_STRING], + 'parameters' => [ + 'constant' => 0, + 'optional' => true, + 'explicit' => true + ] + ECParameters::MAP, + 'publicKey' => [ + 'type' => ASN1::TYPE_BIT_STRING, + 'constant' => 1, + 'optional' => true, + 'explicit' => true + ] + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EDIPartyName.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EDIPartyName.php index 8c8da7f..f9f4b4b 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EDIPartyName.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EDIPartyName.php @@ -10,21 +10,33 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * EDIPartyName * * @author Jim Wigginton - * @internal */ abstract class EDIPartyName { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => [ - 'nameAssigner' => ['constant' => 0, 'optional' => \true, 'implicit' => \true] + DirectoryString::MAP, - // partyName is technically required but \phpseclib3\File\ASN1 doesn't currently support non-optional constants and - // setting it to optional gets the job done in any event. - 'partyName' => ['constant' => 1, 'optional' => \true, 'implicit' => \true] + DirectoryString::MAP, - ]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'nameAssigner' => [ + 'constant' => 0, + 'optional' => true, + 'implicit' => true + ] + DirectoryString::MAP, + // partyName is technically required but \phpseclib3\File\ASN1 doesn't currently support non-optional constants and + // setting it to optional gets the job done in any event. + 'partyName' => [ + 'constant' => 1, + 'optional' => true, + 'implicit' => true + ] + DirectoryString::MAP + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EcdsaSigValue.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EcdsaSigValue.php index 6cfa804..992c8dd 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EcdsaSigValue.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EcdsaSigValue.php @@ -10,16 +10,23 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * EcdsaSigValue * * @author Jim Wigginton - * @internal */ abstract class EcdsaSigValue { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['r' => ['type' => ASN1::TYPE_INTEGER], 's' => ['type' => ASN1::TYPE_INTEGER]]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'r' => ['type' => ASN1::TYPE_INTEGER], + 's' => ['type' => ASN1::TYPE_INTEGER] + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EncryptedData.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EncryptedData.php index fa40b75..e03ad9d 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EncryptedData.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EncryptedData.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * EncryptedData * * @author Jim Wigginton - * @internal */ abstract class EncryptedData { diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EncryptedPrivateKeyInfo.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EncryptedPrivateKeyInfo.php index 2e1f07e..6e64c48 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EncryptedPrivateKeyInfo.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EncryptedPrivateKeyInfo.php @@ -10,16 +10,23 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * EncryptedPrivateKeyInfo * * @author Jim Wigginton - * @internal */ abstract class EncryptedPrivateKeyInfo { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['encryptionAlgorithm' => AlgorithmIdentifier::MAP, 'encryptedData' => EncryptedData::MAP]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'encryptionAlgorithm' => AlgorithmIdentifier::MAP, + 'encryptedData' => EncryptedData::MAP + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtKeyUsageSyntax.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtKeyUsageSyntax.php index 7e80c57..bdfa39b 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtKeyUsageSyntax.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtKeyUsageSyntax.php @@ -10,16 +10,22 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * ExtKeyUsageSyntax * * @author Jim Wigginton - * @internal */ abstract class ExtKeyUsageSyntax { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'min' => 1, 'max' => -1, 'children' => KeyPurposeId::MAP]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'min' => 1, + 'max' => -1, + 'children' => KeyPurposeId::MAP + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Extension.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Extension.php index 2c41acf..290c348 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Extension.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Extension.php @@ -10,9 +10,11 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * Extension * @@ -23,9 +25,19 @@ * http://tools.ietf.org/html/rfc5280#section-4.2 * * @author Jim Wigginton - * @internal */ abstract class Extension { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['extnId' => ['type' => ASN1::TYPE_OBJECT_IDENTIFIER], 'critical' => ['type' => ASN1::TYPE_BOOLEAN, 'optional' => \true, 'default' => \false], 'extnValue' => ['type' => ASN1::TYPE_OCTET_STRING]]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'extnId' => ['type' => ASN1::TYPE_OBJECT_IDENTIFIER], + 'critical' => [ + 'type' => ASN1::TYPE_BOOLEAN, + 'optional' => true, + 'default' => false + ], + 'extnValue' => ['type' => ASN1::TYPE_OCTET_STRING] + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtensionAttribute.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtensionAttribute.php index 52009a0..4f44e18 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtensionAttribute.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtensionAttribute.php @@ -10,16 +10,33 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * ExtensionAttribute * * @author Jim Wigginton - * @internal */ abstract class ExtensionAttribute { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['extension-attribute-type' => ['type' => ASN1::TYPE_PRINTABLE_STRING, 'constant' => 0, 'optional' => \true, 'implicit' => \true], 'extension-attribute-value' => ['type' => ASN1::TYPE_ANY, 'constant' => 1, 'optional' => \true, 'explicit' => \true]]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'extension-attribute-type' => [ + 'type' => ASN1::TYPE_PRINTABLE_STRING, + 'constant' => 0, + 'optional' => true, + 'implicit' => true + ], + 'extension-attribute-value' => [ + 'type' => ASN1::TYPE_ANY, + 'constant' => 1, + 'optional' => true, + 'explicit' => true + ] + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtensionAttributes.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtensionAttributes.php index 8b2e135..59541cd 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtensionAttributes.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtensionAttributes.php @@ -10,22 +10,22 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * ExtensionAttributes * * @author Jim Wigginton - * @internal */ abstract class ExtensionAttributes { const MAP = [ 'type' => ASN1::TYPE_SET, 'min' => 1, - 'max' => 256, - // ub-extension-attributes - 'children' => ExtensionAttribute::MAP, + 'max' => 256, // ub-extension-attributes + 'children' => ExtensionAttribute::MAP ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Extensions.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Extensions.php index d939183..0a02945 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Extensions.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Extensions.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * Extensions * * @author Jim Wigginton - * @internal */ abstract class Extensions { @@ -27,6 +28,6 @@ abstract class Extensions // technically, it's MAX, but we'll assume anything < 0 is MAX 'max' => -1, // if 'children' isn't an array then 'min' and 'max' must be defined - 'children' => Extension::MAP, + 'children' => Extension::MAP ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/FieldElement.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/FieldElement.php index d758204..8648ebe 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/FieldElement.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/FieldElement.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * FieldElement * * @author Jim Wigginton - * @internal */ abstract class FieldElement { diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/FieldID.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/FieldID.php index f3a7f60..83af870 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/FieldID.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/FieldID.php @@ -10,16 +10,26 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * FieldID * * @author Jim Wigginton - * @internal */ abstract class FieldID { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['fieldType' => ['type' => ASN1::TYPE_OBJECT_IDENTIFIER], 'parameters' => ['type' => ASN1::TYPE_ANY, 'optional' => \true]]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'fieldType' => ['type' => ASN1::TYPE_OBJECT_IDENTIFIER], + 'parameters' => [ + 'type' => ASN1::TYPE_ANY, + 'optional' => true + ] + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralName.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralName.php index e5053df..637b98d 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralName.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralName.php @@ -10,16 +10,71 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * GeneralName * * @author Jim Wigginton - * @internal */ abstract class GeneralName { - const MAP = ['type' => ASN1::TYPE_CHOICE, 'children' => ['otherName' => ['constant' => 0, 'optional' => \true, 'implicit' => \true] + AnotherName::MAP, 'rfc822Name' => ['type' => ASN1::TYPE_IA5_STRING, 'constant' => 1, 'optional' => \true, 'implicit' => \true], 'dNSName' => ['type' => ASN1::TYPE_IA5_STRING, 'constant' => 2, 'optional' => \true, 'implicit' => \true], 'x400Address' => ['constant' => 3, 'optional' => \true, 'implicit' => \true] + ORAddress::MAP, 'directoryName' => ['constant' => 4, 'optional' => \true, 'explicit' => \true] + Name::MAP, 'ediPartyName' => ['constant' => 5, 'optional' => \true, 'implicit' => \true] + EDIPartyName::MAP, 'uniformResourceIdentifier' => ['type' => ASN1::TYPE_IA5_STRING, 'constant' => 6, 'optional' => \true, 'implicit' => \true], 'iPAddress' => ['type' => ASN1::TYPE_OCTET_STRING, 'constant' => 7, 'optional' => \true, 'implicit' => \true], 'registeredID' => ['type' => ASN1::TYPE_OBJECT_IDENTIFIER, 'constant' => 8, 'optional' => \true, 'implicit' => \true]]]; + const MAP = [ + 'type' => ASN1::TYPE_CHOICE, + 'children' => [ + 'otherName' => [ + 'constant' => 0, + 'optional' => true, + 'implicit' => true + ] + AnotherName::MAP, + 'rfc822Name' => [ + 'type' => ASN1::TYPE_IA5_STRING, + 'constant' => 1, + 'optional' => true, + 'implicit' => true + ], + 'dNSName' => [ + 'type' => ASN1::TYPE_IA5_STRING, + 'constant' => 2, + 'optional' => true, + 'implicit' => true + ], + 'x400Address' => [ + 'constant' => 3, + 'optional' => true, + 'implicit' => true + ] + ORAddress::MAP, + 'directoryName' => [ + 'constant' => 4, + 'optional' => true, + 'explicit' => true + ] + Name::MAP, + 'ediPartyName' => [ + 'constant' => 5, + 'optional' => true, + 'implicit' => true + ] + EDIPartyName::MAP, + 'uniformResourceIdentifier' => [ + 'type' => ASN1::TYPE_IA5_STRING, + 'constant' => 6, + 'optional' => true, + 'implicit' => true + ], + 'iPAddress' => [ + 'type' => ASN1::TYPE_OCTET_STRING, + 'constant' => 7, + 'optional' => true, + 'implicit' => true + ], + 'registeredID' => [ + 'type' => ASN1::TYPE_OBJECT_IDENTIFIER, + 'constant' => 8, + 'optional' => true, + 'implicit' => true + ] + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralNames.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralNames.php index 6fa4243..73de4f8 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralNames.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralNames.php @@ -10,16 +10,22 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * GeneralNames * * @author Jim Wigginton - * @internal */ abstract class GeneralNames { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'min' => 1, 'max' => -1, 'children' => GeneralName::MAP]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'min' => 1, + 'max' => -1, + 'children' => GeneralName::MAP + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralSubtree.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralSubtree.php index 4c032bd..7a82c1f 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralSubtree.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralSubtree.php @@ -10,16 +10,33 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * GeneralSubtree * * @author Jim Wigginton - * @internal */ abstract class GeneralSubtree { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['base' => GeneralName::MAP, 'minimum' => ['constant' => 0, 'optional' => \true, 'implicit' => \true, 'default' => '0'] + BaseDistance::MAP, 'maximum' => ['constant' => 1, 'optional' => \true, 'implicit' => \true] + BaseDistance::MAP]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'base' => GeneralName::MAP, + 'minimum' => [ + 'constant' => 0, + 'optional' => true, + 'implicit' => true, + 'default' => '0' + ] + BaseDistance::MAP, + 'maximum' => [ + 'constant' => 1, + 'optional' => true, + 'implicit' => true, + ] + BaseDistance::MAP + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralSubtrees.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralSubtrees.php index 4566d08..d8dd081 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralSubtrees.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralSubtrees.php @@ -10,16 +10,22 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * GeneralSubtrees * * @author Jim Wigginton - * @internal */ abstract class GeneralSubtrees { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'min' => 1, 'max' => -1, 'children' => GeneralSubtree::MAP]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'min' => 1, + 'max' => -1, + 'children' => GeneralSubtree::MAP + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/HashAlgorithm.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/HashAlgorithm.php index c80376f..972d1dd 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/HashAlgorithm.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/HashAlgorithm.php @@ -10,13 +10,13 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; /** * HashAglorithm * * @author Jim Wigginton - * @internal */ abstract class HashAlgorithm { diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/HoldInstructionCode.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/HoldInstructionCode.php index c0b2ab6..45496ba 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/HoldInstructionCode.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/HoldInstructionCode.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * HoldInstructionCode * * @author Jim Wigginton - * @internal */ abstract class HoldInstructionCode { diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/InvalidityDate.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/InvalidityDate.php index e29b7d7..e6d1728 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/InvalidityDate.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/InvalidityDate.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * InvalidityDate * * @author Jim Wigginton - * @internal */ abstract class InvalidityDate { diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/IssuerAltName.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/IssuerAltName.php index ac2fe04..0a8289e 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/IssuerAltName.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/IssuerAltName.php @@ -10,13 +10,13 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; /** * IssuerAltName * * @author Jim Wigginton - * @internal */ abstract class IssuerAltName { diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/IssuingDistributionPoint.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/IssuingDistributionPoint.php index 81a9967..cd5c1e0 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/IssuingDistributionPoint.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/IssuingDistributionPoint.php @@ -10,16 +10,59 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * IssuingDistributionPoint * * @author Jim Wigginton - * @internal */ abstract class IssuingDistributionPoint { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['distributionPoint' => ['constant' => 0, 'optional' => \true, 'explicit' => \true] + DistributionPointName::MAP, 'onlyContainsUserCerts' => ['type' => ASN1::TYPE_BOOLEAN, 'constant' => 1, 'optional' => \true, 'default' => \false, 'implicit' => \true], 'onlyContainsCACerts' => ['type' => ASN1::TYPE_BOOLEAN, 'constant' => 2, 'optional' => \true, 'default' => \false, 'implicit' => \true], 'onlySomeReasons' => ['constant' => 3, 'optional' => \true, 'implicit' => \true] + ReasonFlags::MAP, 'indirectCRL' => ['type' => ASN1::TYPE_BOOLEAN, 'constant' => 4, 'optional' => \true, 'default' => \false, 'implicit' => \true], 'onlyContainsAttributeCerts' => ['type' => ASN1::TYPE_BOOLEAN, 'constant' => 5, 'optional' => \true, 'default' => \false, 'implicit' => \true]]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'distributionPoint' => [ + 'constant' => 0, + 'optional' => true, + 'explicit' => true + ] + DistributionPointName::MAP, + 'onlyContainsUserCerts' => [ + 'type' => ASN1::TYPE_BOOLEAN, + 'constant' => 1, + 'optional' => true, + 'default' => false, + 'implicit' => true + ], + 'onlyContainsCACerts' => [ + 'type' => ASN1::TYPE_BOOLEAN, + 'constant' => 2, + 'optional' => true, + 'default' => false, + 'implicit' => true + ], + 'onlySomeReasons' => [ + 'constant' => 3, + 'optional' => true, + 'implicit' => true + ] + ReasonFlags::MAP, + 'indirectCRL' => [ + 'type' => ASN1::TYPE_BOOLEAN, + 'constant' => 4, + 'optional' => true, + 'default' => false, + 'implicit' => true + ], + 'onlyContainsAttributeCerts' => [ + 'type' => ASN1::TYPE_BOOLEAN, + 'constant' => 5, + 'optional' => true, + 'default' => false, + 'implicit' => true + ] + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyIdentifier.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyIdentifier.php index 0213aac..e9e71ff 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyIdentifier.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyIdentifier.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * KeyIdentifier * * @author Jim Wigginton - * @internal */ abstract class KeyIdentifier { diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyPurposeId.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyPurposeId.php index 30dd791..33196be 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyPurposeId.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyPurposeId.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * KeyPurposeId * * @author Jim Wigginton - * @internal */ abstract class KeyPurposeId { diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyUsage.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyUsage.php index bf892e7..99ceb68 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyUsage.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyUsage.php @@ -10,16 +10,30 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * KeyUsage * * @author Jim Wigginton - * @internal */ abstract class KeyUsage { - const MAP = ['type' => ASN1::TYPE_BIT_STRING, 'mapping' => ['digitalSignature', 'nonRepudiation', 'keyEncipherment', 'dataEncipherment', 'keyAgreement', 'keyCertSign', 'cRLSign', 'encipherOnly', 'decipherOnly']]; + const MAP = [ + 'type' => ASN1::TYPE_BIT_STRING, + 'mapping' => [ + 'digitalSignature', + 'nonRepudiation', + 'keyEncipherment', + 'dataEncipherment', + 'keyAgreement', + 'keyCertSign', + 'cRLSign', + 'encipherOnly', + 'decipherOnly' + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/MaskGenAlgorithm.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/MaskGenAlgorithm.php index 9b95e51..0d99d51 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/MaskGenAlgorithm.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/MaskGenAlgorithm.php @@ -10,13 +10,13 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; /** * MaskGenAglorithm * * @author Jim Wigginton - * @internal */ abstract class MaskGenAlgorithm { diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Name.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Name.php index b968a1c..a421d94 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Name.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Name.php @@ -10,16 +10,22 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * Name * * @author Jim Wigginton - * @internal */ abstract class Name { - const MAP = ['type' => ASN1::TYPE_CHOICE, 'children' => ['rdnSequence' => RDNSequence::MAP]]; + const MAP = [ + 'type' => ASN1::TYPE_CHOICE, + 'children' => [ + 'rdnSequence' => RDNSequence::MAP + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NameConstraints.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NameConstraints.php index 38e2ba6..abb17dc 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NameConstraints.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NameConstraints.php @@ -10,16 +10,31 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * NameConstraints * * @author Jim Wigginton - * @internal */ abstract class NameConstraints { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['permittedSubtrees' => ['constant' => 0, 'optional' => \true, 'implicit' => \true] + GeneralSubtrees::MAP, 'excludedSubtrees' => ['constant' => 1, 'optional' => \true, 'implicit' => \true] + GeneralSubtrees::MAP]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'permittedSubtrees' => [ + 'constant' => 0, + 'optional' => true, + 'implicit' => true + ] + GeneralSubtrees::MAP, + 'excludedSubtrees' => [ + 'constant' => 1, + 'optional' => true, + 'implicit' => true + ] + GeneralSubtrees::MAP + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NetworkAddress.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NetworkAddress.php index b7e69f0..52a372d 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NetworkAddress.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NetworkAddress.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * NetworkAddress * * @author Jim Wigginton - * @internal */ abstract class NetworkAddress { diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NoticeReference.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NoticeReference.php index a139f0f..10b659c 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NoticeReference.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NoticeReference.php @@ -10,16 +10,28 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * NoticeReference * * @author Jim Wigginton - * @internal */ abstract class NoticeReference { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['organization' => DisplayText::MAP, 'noticeNumbers' => ['type' => ASN1::TYPE_SEQUENCE, 'min' => 1, 'max' => 200, 'children' => ['type' => ASN1::TYPE_INTEGER]]]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'organization' => DisplayText::MAP, + 'noticeNumbers' => [ + 'type' => ASN1::TYPE_SEQUENCE, + 'min' => 1, + 'max' => 200, + 'children' => ['type' => ASN1::TYPE_INTEGER] + ] + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NumericUserIdentifier.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NumericUserIdentifier.php index bf9ffcd..e8e4496 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NumericUserIdentifier.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NumericUserIdentifier.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * NumericUserIdentifier * * @author Jim Wigginton - * @internal */ abstract class NumericUserIdentifier { diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ORAddress.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ORAddress.php index 88511d6..46962fd 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ORAddress.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ORAddress.php @@ -10,16 +10,24 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * ORAddress * * @author Jim Wigginton - * @internal */ abstract class ORAddress { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['built-in-standard-attributes' => BuiltInStandardAttributes::MAP, 'built-in-domain-defined-attributes' => ['optional' => \true] + BuiltInDomainDefinedAttributes::MAP, 'extension-attributes' => ['optional' => \true] + ExtensionAttributes::MAP]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'built-in-standard-attributes' => BuiltInStandardAttributes::MAP, + 'built-in-domain-defined-attributes' => ['optional' => true] + BuiltInDomainDefinedAttributes::MAP, + 'extension-attributes' => ['optional' => true] + ExtensionAttributes::MAP + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OneAsymmetricKey.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OneAsymmetricKey.php index 449c6d6..d4aca61 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OneAsymmetricKey.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OneAsymmetricKey.php @@ -12,16 +12,37 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * OneAsymmetricKey * * @author Jim Wigginton - * @internal */ abstract class OneAsymmetricKey { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['version' => ['type' => ASN1::TYPE_INTEGER, 'mapping' => ['v1', 'v2']], 'privateKeyAlgorithm' => AlgorithmIdentifier::MAP, 'privateKey' => PrivateKey::MAP, 'attributes' => ['constant' => 0, 'optional' => \true, 'implicit' => \true] + Attributes::MAP, 'publicKey' => ['constant' => 1, 'optional' => \true, 'implicit' => \true] + PublicKey::MAP]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'version' => [ + 'type' => ASN1::TYPE_INTEGER, + 'mapping' => ['v1', 'v2'] + ], + 'privateKeyAlgorithm' => AlgorithmIdentifier::MAP, + 'privateKey' => PrivateKey::MAP, + 'attributes' => [ + 'constant' => 0, + 'optional' => true, + 'implicit' => true + ] + Attributes::MAP, + 'publicKey' => [ + 'constant' => 1, + 'optional' => true, + 'implicit' => true + ] + PublicKey::MAP + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OrganizationName.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OrganizationName.php index e80df7d..432a14a 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OrganizationName.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OrganizationName.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * OrganizationName * * @author Jim Wigginton - * @internal */ abstract class OrganizationName { diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OrganizationalUnitNames.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OrganizationalUnitNames.php index d1a4fde..2efbb55 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OrganizationalUnitNames.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OrganizationalUnitNames.php @@ -10,22 +10,22 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * OrganizationalUnitNames * * @author Jim Wigginton - * @internal */ abstract class OrganizationalUnitNames { const MAP = [ 'type' => ASN1::TYPE_SEQUENCE, 'min' => 1, - 'max' => 4, - // ub-organizational-units - 'children' => ['type' => ASN1::TYPE_PRINTABLE_STRING], + 'max' => 4, // ub-organizational-units + 'children' => ['type' => ASN1::TYPE_PRINTABLE_STRING] ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OtherPrimeInfo.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OtherPrimeInfo.php index eaea836..ff8943c 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OtherPrimeInfo.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OtherPrimeInfo.php @@ -10,23 +10,25 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * OtherPrimeInfo * * @author Jim Wigginton - * @internal */ abstract class OtherPrimeInfo { // version must be multi if otherPrimeInfos present - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => [ - 'prime' => ['type' => ASN1::TYPE_INTEGER], - // ri - 'exponent' => ['type' => ASN1::TYPE_INTEGER], - // di - 'coefficient' => ['type' => ASN1::TYPE_INTEGER], - ]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'prime' => ['type' => ASN1::TYPE_INTEGER], // ri + 'exponent' => ['type' => ASN1::TYPE_INTEGER], // di + 'coefficient' => ['type' => ASN1::TYPE_INTEGER] // ti + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OtherPrimeInfos.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OtherPrimeInfos.php index 8854c06..4a73c1b 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OtherPrimeInfos.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OtherPrimeInfos.php @@ -10,17 +10,23 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * OtherPrimeInfos * * @author Jim Wigginton - * @internal */ abstract class OtherPrimeInfos { // version must be multi if otherPrimeInfos present - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'min' => 1, 'max' => -1, 'children' => OtherPrimeInfo::MAP]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'min' => 1, + 'max' => -1, + 'children' => OtherPrimeInfo::MAP + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBEParameter.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBEParameter.php index 9363ffd..afeccae 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBEParameter.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBEParameter.php @@ -10,18 +10,25 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * PBEParameter * * from https://tools.ietf.org/html/rfc2898#appendix-A.3 * * @author Jim Wigginton - * @internal */ abstract class PBEParameter { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['salt' => ['type' => ASN1::TYPE_OCTET_STRING], 'iterationCount' => ['type' => ASN1::TYPE_INTEGER]]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'salt' => ['type' => ASN1::TYPE_OCTET_STRING], + 'iterationCount' => ['type' => ASN1::TYPE_INTEGER] + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBES2params.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBES2params.php index dc0dddf..8a2e8b5 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBES2params.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBES2params.php @@ -10,18 +10,25 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * PBES2params * * from https://tools.ietf.org/html/rfc2898#appendix-A.3 * * @author Jim Wigginton - * @internal */ abstract class PBES2params { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['keyDerivationFunc' => AlgorithmIdentifier::MAP, 'encryptionScheme' => AlgorithmIdentifier::MAP]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'keyDerivationFunc' => AlgorithmIdentifier::MAP, + 'encryptionScheme' => AlgorithmIdentifier::MAP + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBKDF2params.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBKDF2params.php index 31e3de8..f549d8e 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBKDF2params.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBKDF2params.php @@ -10,25 +10,32 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * PBKDF2params * * from https://tools.ietf.org/html/rfc2898#appendix-A.3 * * @author Jim Wigginton - * @internal */ abstract class PBKDF2params { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => [ - // technically, this is a CHOICE in RFC2898 but the other "choice" is, currently, more of a placeholder - // in the RFC - 'salt' => ['type' => ASN1::TYPE_OCTET_STRING], - 'iterationCount' => ['type' => ASN1::TYPE_INTEGER], - 'keyLength' => ['type' => ASN1::TYPE_INTEGER, 'optional' => \true], - 'prf' => AlgorithmIdentifier::MAP + ['optional' => \true], - ]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + // technically, this is a CHOICE in RFC2898 but the other "choice" is, currently, more of a placeholder + // in the RFC + 'salt' => ['type' => ASN1::TYPE_OCTET_STRING], + 'iterationCount' => ['type' => ASN1::TYPE_INTEGER], + 'keyLength' => [ + 'type' => ASN1::TYPE_INTEGER, + 'optional' => true + ], + 'prf' => AlgorithmIdentifier::MAP + ['optional' => true] + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBMAC1params.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBMAC1params.php index 4d37c9a..7c0097a 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBMAC1params.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBMAC1params.php @@ -10,18 +10,25 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * PBMAC1params * * from https://tools.ietf.org/html/rfc2898#appendix-A.3 * * @author Jim Wigginton - * @internal */ abstract class PBMAC1params { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['keyDerivationFunc' => AlgorithmIdentifier::MAP, 'messageAuthScheme' => AlgorithmIdentifier::MAP]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'keyDerivationFunc' => AlgorithmIdentifier::MAP, + 'messageAuthScheme' => AlgorithmIdentifier::MAP + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PKCS9String.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PKCS9String.php index db26756..de2de84 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PKCS9String.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PKCS9String.php @@ -10,16 +10,23 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * PKCS9String * * @author Jim Wigginton - * @internal */ abstract class PKCS9String { - const MAP = ['type' => ASN1::TYPE_CHOICE, 'children' => ['ia5String' => ['type' => ASN1::TYPE_IA5_STRING], 'directoryString' => DirectoryString::MAP]]; + const MAP = [ + 'type' => ASN1::TYPE_CHOICE, + 'children' => [ + 'ia5String' => ['type' => ASN1::TYPE_IA5_STRING], + 'directoryString' => DirectoryString::MAP + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Pentanomial.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Pentanomial.php index b5c41c3..036f0dc 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Pentanomial.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Pentanomial.php @@ -10,22 +10,24 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * Pentanomial * * @author Jim Wigginton - * @internal */ abstract class Pentanomial { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => [ - 'k1' => ['type' => ASN1::TYPE_INTEGER], - // k1 > 0 - 'k2' => ['type' => ASN1::TYPE_INTEGER], - // k2 > k1 - 'k3' => ['type' => ASN1::TYPE_INTEGER], - ]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'k1' => ['type' => ASN1::TYPE_INTEGER], // k1 > 0 + 'k2' => ['type' => ASN1::TYPE_INTEGER], // k2 > k1 + 'k3' => ['type' => ASN1::TYPE_INTEGER], // k3 > h2 + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PersonalName.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PersonalName.php index 33e6bd8..16d9016 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PersonalName.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PersonalName.php @@ -10,16 +10,45 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * PersonalName * * @author Jim Wigginton - * @internal */ abstract class PersonalName { - const MAP = ['type' => ASN1::TYPE_SET, 'children' => ['surname' => ['type' => ASN1::TYPE_PRINTABLE_STRING, 'constant' => 0, 'optional' => \true, 'implicit' => \true], 'given-name' => ['type' => ASN1::TYPE_PRINTABLE_STRING, 'constant' => 1, 'optional' => \true, 'implicit' => \true], 'initials' => ['type' => ASN1::TYPE_PRINTABLE_STRING, 'constant' => 2, 'optional' => \true, 'implicit' => \true], 'generation-qualifier' => ['type' => ASN1::TYPE_PRINTABLE_STRING, 'constant' => 3, 'optional' => \true, 'implicit' => \true]]]; + const MAP = [ + 'type' => ASN1::TYPE_SET, + 'children' => [ + 'surname' => [ + 'type' => ASN1::TYPE_PRINTABLE_STRING, + 'constant' => 0, + 'optional' => true, + 'implicit' => true + ], + 'given-name' => [ + 'type' => ASN1::TYPE_PRINTABLE_STRING, + 'constant' => 1, + 'optional' => true, + 'implicit' => true + ], + 'initials' => [ + 'type' => ASN1::TYPE_PRINTABLE_STRING, + 'constant' => 2, + 'optional' => true, + 'implicit' => true + ], + 'generation-qualifier' => [ + 'type' => ASN1::TYPE_PRINTABLE_STRING, + 'constant' => 3, + 'optional' => true, + 'implicit' => true + ] + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyInformation.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyInformation.php index 1f7a203..eccbdf9 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyInformation.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyInformation.php @@ -10,16 +10,29 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * PolicyInformation * * @author Jim Wigginton - * @internal */ abstract class PolicyInformation { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['policyIdentifier' => CertPolicyId::MAP, 'policyQualifiers' => ['type' => ASN1::TYPE_SEQUENCE, 'min' => 0, 'max' => -1, 'optional' => \true, 'children' => PolicyQualifierInfo::MAP]]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'policyIdentifier' => CertPolicyId::MAP, + 'policyQualifiers' => [ + 'type' => ASN1::TYPE_SEQUENCE, + 'min' => 0, + 'max' => -1, + 'optional' => true, + 'children' => PolicyQualifierInfo::MAP + ] + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyMappings.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyMappings.php index 78becf4..f0672fc 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyMappings.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyMappings.php @@ -10,16 +10,28 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * PolicyMappings * * @author Jim Wigginton - * @internal */ abstract class PolicyMappings { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'min' => 1, 'max' => -1, 'children' => ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['issuerDomainPolicy' => CertPolicyId::MAP, 'subjectDomainPolicy' => CertPolicyId::MAP]]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'min' => 1, + 'max' => -1, + 'children' => [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'issuerDomainPolicy' => CertPolicyId::MAP, + 'subjectDomainPolicy' => CertPolicyId::MAP + ] + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyQualifierId.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyQualifierId.php index 4860dce..c8c6d82 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyQualifierId.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyQualifierId.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * PolicyQualifierId * * @author Jim Wigginton - * @internal */ abstract class PolicyQualifierId { diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyQualifierInfo.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyQualifierInfo.php index 506342f..27ee7bb 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyQualifierInfo.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyQualifierInfo.php @@ -10,16 +10,23 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * PolicyQualifierInfo * * @author Jim Wigginton - * @internal */ abstract class PolicyQualifierInfo { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['policyQualifierId' => PolicyQualifierId::MAP, 'qualifier' => ['type' => ASN1::TYPE_ANY]]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'policyQualifierId' => PolicyQualifierId::MAP, + 'qualifier' => ['type' => ASN1::TYPE_ANY] + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PostalAddress.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PostalAddress.php index b9fd32b..3e47100 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PostalAddress.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PostalAddress.php @@ -10,16 +10,23 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * PostalAddress * * @author Jim Wigginton - * @internal */ abstract class PostalAddress { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'optional' => \true, 'min' => 1, 'max' => -1, 'children' => DirectoryString::MAP]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'optional' => true, + 'min' => 1, + 'max' => -1, + 'children' => DirectoryString::MAP + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Prime_p.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Prime_p.php index e6b5f64..1f84f19 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Prime_p.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Prime_p.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * Prime_p * * @author Jim Wigginton - * @internal */ abstract class Prime_p { diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateDomainName.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateDomainName.php index cc6bf0b..0847b81 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateDomainName.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateDomainName.php @@ -10,16 +10,23 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * PrivateDomainName * * @author Jim Wigginton - * @internal */ abstract class PrivateDomainName { - const MAP = ['type' => ASN1::TYPE_CHOICE, 'children' => ['numeric' => ['type' => ASN1::TYPE_NUMERIC_STRING], 'printable' => ['type' => ASN1::TYPE_PRINTABLE_STRING]]]; + const MAP = [ + 'type' => ASN1::TYPE_CHOICE, + 'children' => [ + 'numeric' => ['type' => ASN1::TYPE_NUMERIC_STRING], + 'printable' => ['type' => ASN1::TYPE_PRINTABLE_STRING] + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKey.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKey.php index d6a8354..cdb406b 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKey.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKey.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * PrivateKey * * @author Jim Wigginton - * @internal */ abstract class PrivateKey { diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKeyInfo.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKeyInfo.php index ecb8a1f..d1e0087 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKeyInfo.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKeyInfo.php @@ -10,16 +10,32 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * PrivateKeyInfo * * @author Jim Wigginton - * @internal */ abstract class PrivateKeyInfo { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['version' => ['type' => ASN1::TYPE_INTEGER, 'mapping' => ['v1']], 'privateKeyAlgorithm' => AlgorithmIdentifier::MAP, 'privateKey' => PrivateKey::MAP, 'attributes' => ['constant' => 0, 'optional' => \true, 'implicit' => \true] + Attributes::MAP]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'version' => [ + 'type' => ASN1::TYPE_INTEGER, + 'mapping' => ['v1'] + ], + 'privateKeyAlgorithm' => AlgorithmIdentifier::MAP, + 'privateKey' => PrivateKey::MAP, + 'attributes' => [ + 'constant' => 0, + 'optional' => true, + 'implicit' => true + ] + Attributes::MAP + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKeyUsagePeriod.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKeyUsagePeriod.php index 7a112cd..da87eb9 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKeyUsagePeriod.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKeyUsagePeriod.php @@ -10,16 +10,31 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * PrivateKeyUsagePeriod * * @author Jim Wigginton - * @internal */ abstract class PrivateKeyUsagePeriod { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['notBefore' => ['constant' => 0, 'optional' => \true, 'implicit' => \true, 'type' => ASN1::TYPE_GENERALIZED_TIME], 'notAfter' => ['constant' => 1, 'optional' => \true, 'implicit' => \true, 'type' => ASN1::TYPE_GENERALIZED_TIME]]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'notBefore' => [ + 'constant' => 0, + 'optional' => true, + 'implicit' => true, + 'type' => ASN1::TYPE_GENERALIZED_TIME], + 'notAfter' => [ + 'constant' => 1, + 'optional' => true, + 'implicit' => true, + 'type' => ASN1::TYPE_GENERALIZED_TIME] + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKey.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKey.php index 55a6e30..558a8c9 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKey.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKey.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * PublicKey * * @author Jim Wigginton - * @internal */ abstract class PublicKey { diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKeyAndChallenge.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKeyAndChallenge.php index c7219c5..f52bbb4 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKeyAndChallenge.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKeyAndChallenge.php @@ -10,16 +10,23 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * PublicKeyAndChallenge * * @author Jim Wigginton - * @internal */ abstract class PublicKeyAndChallenge { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['spki' => SubjectPublicKeyInfo::MAP, 'challenge' => ['type' => ASN1::TYPE_IA5_STRING]]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'spki' => SubjectPublicKeyInfo::MAP, + 'challenge' => ['type' => ASN1::TYPE_IA5_STRING] + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKeyInfo.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKeyInfo.php index 4949756..94029df 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKeyInfo.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKeyInfo.php @@ -10,9 +10,11 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * PublicKeyInfo * @@ -20,9 +22,14 @@ * get when you do "openssl rsa -in private.pem -outform PEM -pubout" * * @author Jim Wigginton - * @internal */ abstract class PublicKeyInfo { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['publicKeyAlgorithm' => AlgorithmIdentifier::MAP, 'publicKey' => ['type' => ASN1::TYPE_BIT_STRING]]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'publicKeyAlgorithm' => AlgorithmIdentifier::MAP, + 'publicKey' => ['type' => ASN1::TYPE_BIT_STRING] + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RC2CBCParameter.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RC2CBCParameter.php index d6bebb9..53d5ee9 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RC2CBCParameter.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RC2CBCParameter.php @@ -10,18 +10,28 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * RC2CBCParameter * * from https://tools.ietf.org/html/rfc2898#appendix-A.3 * * @author Jim Wigginton - * @internal */ abstract class RC2CBCParameter { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['rc2ParametersVersion' => ['type' => ASN1::TYPE_INTEGER, 'optional' => \true], 'iv' => ['type' => ASN1::TYPE_OCTET_STRING]]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'rc2ParametersVersion' => [ + 'type' => ASN1::TYPE_INTEGER, + 'optional' => true + ], + 'iv' => ['type' => ASN1::TYPE_OCTET_STRING] + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RDNSequence.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RDNSequence.php index a667420..94b516f 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RDNSequence.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RDNSequence.php @@ -10,9 +10,11 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * RDNSequence * @@ -23,7 +25,6 @@ * - https://www.opends.org/wiki/page/DefinitionRelativeDistinguishedName * * @author Jim Wigginton - * @internal */ abstract class RDNSequence { @@ -32,6 +33,6 @@ abstract class RDNSequence // RDNSequence does not define a min or a max, which means it doesn't have one 'min' => 0, 'max' => -1, - 'children' => RelativeDistinguishedName::MAP, + 'children' => RelativeDistinguishedName::MAP ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSAPrivateKey.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSAPrivateKey.php index 63c8124..dfb44ec 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSAPrivateKey.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSAPrivateKey.php @@ -10,36 +10,35 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * RSAPrivateKey * * @author Jim Wigginton - * @internal */ abstract class RSAPrivateKey { // version must be multi if otherPrimeInfos present - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => [ - 'version' => ['type' => ASN1::TYPE_INTEGER, 'mapping' => ['two-prime', 'multi']], - 'modulus' => ['type' => ASN1::TYPE_INTEGER], - // n - 'publicExponent' => ['type' => ASN1::TYPE_INTEGER], - // e - 'privateExponent' => ['type' => ASN1::TYPE_INTEGER], - // d - 'prime1' => ['type' => ASN1::TYPE_INTEGER], - // p - 'prime2' => ['type' => ASN1::TYPE_INTEGER], - // q - 'exponent1' => ['type' => ASN1::TYPE_INTEGER], - // d mod (p-1) - 'exponent2' => ['type' => ASN1::TYPE_INTEGER], - // d mod (q-1) - 'coefficient' => ['type' => ASN1::TYPE_INTEGER], - // (inverse of q) mod p - 'otherPrimeInfos' => OtherPrimeInfos::MAP + ['optional' => \true], - ]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'version' => [ + 'type' => ASN1::TYPE_INTEGER, + 'mapping' => ['two-prime', 'multi'] + ], + 'modulus' => ['type' => ASN1::TYPE_INTEGER], // n + 'publicExponent' => ['type' => ASN1::TYPE_INTEGER], // e + 'privateExponent' => ['type' => ASN1::TYPE_INTEGER], // d + 'prime1' => ['type' => ASN1::TYPE_INTEGER], // p + 'prime2' => ['type' => ASN1::TYPE_INTEGER], // q + 'exponent1' => ['type' => ASN1::TYPE_INTEGER], // d mod (p-1) + 'exponent2' => ['type' => ASN1::TYPE_INTEGER], // d mod (q-1) + 'coefficient' => ['type' => ASN1::TYPE_INTEGER], // (inverse of q) mod p + 'otherPrimeInfos' => OtherPrimeInfos::MAP + ['optional' => true] + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSAPublicKey.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSAPublicKey.php index 6e621ed..92c1ab4 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSAPublicKey.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSAPublicKey.php @@ -10,16 +10,23 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * RSAPublicKey * * @author Jim Wigginton - * @internal */ abstract class RSAPublicKey { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['modulus' => ['type' => ASN1::TYPE_INTEGER], 'publicExponent' => ['type' => ASN1::TYPE_INTEGER]]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'modulus' => ['type' => ASN1::TYPE_INTEGER], + 'publicExponent' => ['type' => ASN1::TYPE_INTEGER] + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSASSA_PSS_params.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSASSA_PSS_params.php index 63c0d60..b9c4fb1 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSASSA_PSS_params.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSASSA_PSS_params.php @@ -12,16 +12,47 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * RSASSA_PSS_params * * @author Jim Wigginton - * @internal */ abstract class RSASSA_PSS_params { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['hashAlgorithm' => ['constant' => 0, 'optional' => \true, 'explicit' => \true] + HashAlgorithm::MAP, 'maskGenAlgorithm' => ['constant' => 1, 'optional' => \true, 'explicit' => \true] + MaskGenAlgorithm::MAP, 'saltLength' => ['type' => ASN1::TYPE_INTEGER, 'constant' => 2, 'optional' => \true, 'explicit' => \true, 'default' => 20], 'trailerField' => ['type' => ASN1::TYPE_INTEGER, 'constant' => 3, 'optional' => \true, 'explicit' => \true, 'default' => 1]]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'hashAlgorithm' => [ + 'constant' => 0, + 'optional' => true, + 'explicit' => true, + //'default' => 'sha1Identifier' + ] + HashAlgorithm::MAP, + 'maskGenAlgorithm' => [ + 'constant' => 1, + 'optional' => true, + 'explicit' => true, + //'default' => 'mgf1SHA1Identifier' + ] + MaskGenAlgorithm::MAP, + 'saltLength' => [ + 'type' => ASN1::TYPE_INTEGER, + 'constant' => 2, + 'optional' => true, + 'explicit' => true, + 'default' => 20 + ], + 'trailerField' => [ + 'type' => ASN1::TYPE_INTEGER, + 'constant' => 3, + 'optional' => true, + 'explicit' => true, + 'default' => 1 + ] + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ReasonFlags.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ReasonFlags.php index 5e3a3e1..9ef460e 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ReasonFlags.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ReasonFlags.php @@ -10,16 +10,30 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * ReasonFlags * * @author Jim Wigginton - * @internal */ abstract class ReasonFlags { - const MAP = ['type' => ASN1::TYPE_BIT_STRING, 'mapping' => ['unused', 'keyCompromise', 'cACompromise', 'affiliationChanged', 'superseded', 'cessationOfOperation', 'certificateHold', 'privilegeWithdrawn', 'aACompromise']]; + const MAP = [ + 'type' => ASN1::TYPE_BIT_STRING, + 'mapping' => [ + 'unused', + 'keyCompromise', + 'cACompromise', + 'affiliationChanged', + 'superseded', + 'cessationOfOperation', + 'certificateHold', + 'privilegeWithdrawn', + 'aACompromise' + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RelativeDistinguishedName.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RelativeDistinguishedName.php index af0cf37..ffa5129 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RelativeDistinguishedName.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RelativeDistinguishedName.php @@ -10,9 +10,11 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * RelativeDistinguishedName * @@ -23,9 +25,13 @@ * - https://www.opends.org/wiki/page/DefinitionRelativeDistinguishedName * * @author Jim Wigginton - * @internal */ abstract class RelativeDistinguishedName { - const MAP = ['type' => ASN1::TYPE_SET, 'min' => 1, 'max' => -1, 'children' => AttributeTypeAndValue::MAP]; + const MAP = [ + 'type' => ASN1::TYPE_SET, + 'min' => 1, + 'max' => -1, + 'children' => AttributeTypeAndValue::MAP + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RevokedCertificate.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RevokedCertificate.php index a13e5b2..00cfaf3 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RevokedCertificate.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RevokedCertificate.php @@ -10,16 +10,26 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * RevokedCertificate * * @author Jim Wigginton - * @internal */ abstract class RevokedCertificate { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['userCertificate' => CertificateSerialNumber::MAP, 'revocationDate' => Time::MAP, 'crlEntryExtensions' => ['optional' => \true] + Extensions::MAP]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'userCertificate' => CertificateSerialNumber::MAP, + 'revocationDate' => Time::MAP, + 'crlEntryExtensions' => [ + 'optional' => true + ] + Extensions::MAP + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SignedPublicKeyAndChallenge.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SignedPublicKeyAndChallenge.php index a3ad4b6..cbcc069 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SignedPublicKeyAndChallenge.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SignedPublicKeyAndChallenge.php @@ -10,16 +10,24 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * SignedPublicKeyAndChallenge * * @author Jim Wigginton - * @internal */ abstract class SignedPublicKeyAndChallenge { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['publicKeyAndChallenge' => PublicKeyAndChallenge::MAP, 'signatureAlgorithm' => AlgorithmIdentifier::MAP, 'signature' => ['type' => ASN1::TYPE_BIT_STRING]]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'publicKeyAndChallenge' => PublicKeyAndChallenge::MAP, + 'signatureAlgorithm' => AlgorithmIdentifier::MAP, + 'signature' => ['type' => ASN1::TYPE_BIT_STRING] + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SpecifiedECDomain.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SpecifiedECDomain.php index f58a05e..5702a8a 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SpecifiedECDomain.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SpecifiedECDomain.php @@ -12,16 +12,34 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * SpecifiedECDomain * * @author Jim Wigginton - * @internal */ abstract class SpecifiedECDomain { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['version' => ['type' => ASN1::TYPE_INTEGER, 'mapping' => [1 => 'ecdpVer1', 'ecdpVer2', 'ecdpVer3']], 'fieldID' => FieldID::MAP, 'curve' => Curve::MAP, 'base' => ECPoint::MAP, 'order' => ['type' => ASN1::TYPE_INTEGER], 'cofactor' => ['type' => ASN1::TYPE_INTEGER, 'optional' => \true], 'hash' => ['optional' => \true] + HashAlgorithm::MAP]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'version' => [ + 'type' => ASN1::TYPE_INTEGER, + 'mapping' => [1 => 'ecdpVer1', 'ecdpVer2', 'ecdpVer3'] + ], + 'fieldID' => FieldID::MAP, + 'curve' => Curve::MAP, + 'base' => ECPoint::MAP, + 'order' => ['type' => ASN1::TYPE_INTEGER], + 'cofactor' => [ + 'type' => ASN1::TYPE_INTEGER, + 'optional' => true + ], + 'hash' => ['optional' => true] + HashAlgorithm::MAP + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectAltName.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectAltName.php index 996f545..4c43ca5 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectAltName.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectAltName.php @@ -10,13 +10,13 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; /** * SubjectAltName * * @author Jim Wigginton - * @internal */ abstract class SubjectAltName { diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectDirectoryAttributes.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectDirectoryAttributes.php index cc4e3db..5a3747b 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectDirectoryAttributes.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectDirectoryAttributes.php @@ -10,16 +10,22 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * SubjectDirectoryAttributes * * @author Jim Wigginton - * @internal */ abstract class SubjectDirectoryAttributes { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'min' => 1, 'max' => -1, 'children' => Attribute::MAP]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'min' => 1, + 'max' => -1, + 'children' => Attribute::MAP + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectInfoAccessSyntax.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectInfoAccessSyntax.php index b8c7600..a1edd40 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectInfoAccessSyntax.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectInfoAccessSyntax.php @@ -10,16 +10,22 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * SubjectInfoAccessSyntax * * @author Jim Wigginton - * @internal */ abstract class SubjectInfoAccessSyntax { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'min' => 1, 'max' => -1, 'children' => AccessDescription::MAP]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'min' => 1, + 'max' => -1, + 'children' => AccessDescription::MAP + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectPublicKeyInfo.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectPublicKeyInfo.php index d4e11c8..2f3f4ac 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectPublicKeyInfo.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectPublicKeyInfo.php @@ -10,16 +10,23 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * SubjectPublicKeyInfo * * @author Jim Wigginton - * @internal */ abstract class SubjectPublicKeyInfo { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['algorithm' => AlgorithmIdentifier::MAP, 'subjectPublicKey' => ['type' => ASN1::TYPE_BIT_STRING]]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'algorithm' => AlgorithmIdentifier::MAP, + 'subjectPublicKey' => ['type' => ASN1::TYPE_BIT_STRING] + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TBSCertList.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TBSCertList.php index 9a4e56d..f681f1a 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TBSCertList.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TBSCertList.php @@ -10,16 +10,45 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * TBSCertList * * @author Jim Wigginton - * @internal */ abstract class TBSCertList { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['version' => ['type' => ASN1::TYPE_INTEGER, 'mapping' => ['v1', 'v2'], 'optional' => \true, 'default' => 'v1'], 'signature' => AlgorithmIdentifier::MAP, 'issuer' => Name::MAP, 'thisUpdate' => Time::MAP, 'nextUpdate' => ['optional' => \true] + Time::MAP, 'revokedCertificates' => ['type' => ASN1::TYPE_SEQUENCE, 'optional' => \true, 'min' => 0, 'max' => -1, 'children' => RevokedCertificate::MAP], 'crlExtensions' => ['constant' => 0, 'optional' => \true, 'explicit' => \true] + Extensions::MAP]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'version' => [ + 'type' => ASN1::TYPE_INTEGER, + 'mapping' => ['v1', 'v2'], + 'optional' => true, + 'default' => 'v1' + ], + 'signature' => AlgorithmIdentifier::MAP, + 'issuer' => Name::MAP, + 'thisUpdate' => Time::MAP, + 'nextUpdate' => [ + 'optional' => true + ] + Time::MAP, + 'revokedCertificates' => [ + 'type' => ASN1::TYPE_SEQUENCE, + 'optional' => true, + 'min' => 0, + 'max' => -1, + 'children' => RevokedCertificate::MAP + ], + 'crlExtensions' => [ + 'constant' => 0, + 'optional' => true, + 'explicit' => true + ] + Extensions::MAP + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TBSCertificate.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TBSCertificate.php index 3b0c5f2..3758026 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TBSCertificate.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TBSCertificate.php @@ -10,33 +10,56 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * TBSCertificate * * @author Jim Wigginton - * @internal */ abstract class TBSCertificate { // assert($TBSCertificate['children']['signature'] == $Certificate['children']['signatureAlgorithm']) - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => [ - // technically, default implies optional, but we'll define it as being optional, none-the-less, just to - // reenforce that fact - 'version' => ['type' => ASN1::TYPE_INTEGER, 'constant' => 0, 'optional' => \true, 'explicit' => \true, 'mapping' => ['v1', 'v2', 'v3'], 'default' => 'v1'], - 'serialNumber' => CertificateSerialNumber::MAP, - 'signature' => AlgorithmIdentifier::MAP, - 'issuer' => Name::MAP, - 'validity' => Validity::MAP, - 'subject' => Name::MAP, - 'subjectPublicKeyInfo' => SubjectPublicKeyInfo::MAP, - // implicit means that the T in the TLV structure is to be rewritten, regardless of the type - 'issuerUniqueID' => ['constant' => 1, 'optional' => \true, 'implicit' => \true] + UniqueIdentifier::MAP, - 'subjectUniqueID' => ['constant' => 2, 'optional' => \true, 'implicit' => \true] + UniqueIdentifier::MAP, - // doesn't use the EXPLICIT keyword but if - // it's not IMPLICIT, it's EXPLICIT - 'extensions' => ['constant' => 3, 'optional' => \true, 'explicit' => \true] + Extensions::MAP, - ]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + // technically, default implies optional, but we'll define it as being optional, none-the-less, just to + // reenforce that fact + 'version' => [ + 'type' => ASN1::TYPE_INTEGER, + 'constant' => 0, + 'optional' => true, + 'explicit' => true, + 'mapping' => ['v1', 'v2', 'v3'], + 'default' => 'v1' + ], + 'serialNumber' => CertificateSerialNumber::MAP, + 'signature' => AlgorithmIdentifier::MAP, + 'issuer' => Name::MAP, + 'validity' => Validity::MAP, + 'subject' => Name::MAP, + 'subjectPublicKeyInfo' => SubjectPublicKeyInfo::MAP, + // implicit means that the T in the TLV structure is to be rewritten, regardless of the type + 'issuerUniqueID' => [ + 'constant' => 1, + 'optional' => true, + 'implicit' => true + ] + UniqueIdentifier::MAP, + 'subjectUniqueID' => [ + 'constant' => 2, + 'optional' => true, + 'implicit' => true + ] + UniqueIdentifier::MAP, + // doesn't use the EXPLICIT keyword but if + // it's not IMPLICIT, it's EXPLICIT + 'extensions' => [ + 'constant' => 3, + 'optional' => true, + 'explicit' => true + ] + Extensions::MAP + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TerminalIdentifier.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TerminalIdentifier.php index ec02067..8dd065c 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TerminalIdentifier.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TerminalIdentifier.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * TerminalIdentifier * * @author Jim Wigginton - * @internal */ abstract class TerminalIdentifier { diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Time.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Time.php index 187f8ab..fdc070f 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Time.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Time.php @@ -10,16 +10,23 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * Time * * @author Jim Wigginton - * @internal */ abstract class Time { - const MAP = ['type' => ASN1::TYPE_CHOICE, 'children' => ['utcTime' => ['type' => ASN1::TYPE_UTC_TIME], 'generalTime' => ['type' => ASN1::TYPE_GENERALIZED_TIME]]]; + const MAP = [ + 'type' => ASN1::TYPE_CHOICE, + 'children' => [ + 'utcTime' => ['type' => ASN1::TYPE_UTC_TIME], + 'generalTime' => ['type' => ASN1::TYPE_GENERALIZED_TIME] + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Trinomial.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Trinomial.php index bf043cd..ed561a2 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Trinomial.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Trinomial.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * Trinomial * * @author Jim Wigginton - * @internal */ abstract class Trinomial { diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/UniqueIdentifier.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/UniqueIdentifier.php index 9441a55..2651d5c 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/UniqueIdentifier.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/UniqueIdentifier.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * UniqueIdentifier * * @author Jim Wigginton - * @internal */ abstract class UniqueIdentifier { diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/UserNotice.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/UserNotice.php index caeb721..b1e3ad0 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/UserNotice.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/UserNotice.php @@ -10,16 +10,29 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * UserNotice * * @author Jim Wigginton - * @internal */ abstract class UserNotice { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['noticeRef' => ['optional' => \true, 'implicit' => \true] + NoticeReference::MAP, 'explicitText' => ['optional' => \true, 'implicit' => \true] + DisplayText::MAP]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'noticeRef' => [ + 'optional' => true, + 'implicit' => true + ] + NoticeReference::MAP, + 'explicitText' => [ + 'optional' => true, + 'implicit' => true + ] + DisplayText::MAP + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Validity.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Validity.php index c0aa9bc..1ff4b3c 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Validity.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Validity.php @@ -10,16 +10,23 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * Validity * * @author Jim Wigginton - * @internal */ abstract class Validity { - const MAP = ['type' => ASN1::TYPE_SEQUENCE, 'children' => ['notBefore' => Time::MAP, 'notAfter' => Time::MAP]]; + const MAP = [ + 'type' => ASN1::TYPE_SEQUENCE, + 'children' => [ + 'notBefore' => Time::MAP, + 'notAfter' => Time::MAP + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_ca_policy_url.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_ca_policy_url.php index e27d170..0b7c078 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_ca_policy_url.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_ca_policy_url.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * netscape_ca_policy_url * * @author Jim Wigginton - * @internal */ abstract class netscape_ca_policy_url { diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_cert_type.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_cert_type.php index 56adbf6..10126e3 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_cert_type.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_cert_type.php @@ -10,18 +10,31 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * netscape_cert_type * * mapping is from * * @author Jim Wigginton - * @internal */ abstract class netscape_cert_type { - const MAP = ['type' => ASN1::TYPE_BIT_STRING, 'mapping' => ['SSLClient', 'SSLServer', 'Email', 'ObjectSigning', 'Reserved', 'SSLCA', 'EmailCA', 'ObjectSigningCA']]; + const MAP = [ + 'type' => ASN1::TYPE_BIT_STRING, + 'mapping' => [ + 'SSLClient', + 'SSLServer', + 'Email', + 'ObjectSigning', + 'Reserved', + 'SSLCA', + 'EmailCA', + 'ObjectSigningCA' + ] + ]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_comment.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_comment.php index 4f3b8b9..991c5a8 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_comment.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_comment.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\File\ASN1; + /** * netscape_comment * * @author Jim Wigginton - * @internal */ abstract class netscape_comment { diff --git a/composer/phpseclib/phpseclib/phpseclib/File/X509.php b/composer/phpseclib/phpseclib/phpseclib/File/X509.php index 4cbadc2..cbb4c39 100644 --- a/composer/phpseclib/phpseclib/phpseclib/File/X509.php +++ b/composer/phpseclib/phpseclib/phpseclib/File/X509.php @@ -21,6 +21,7 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\File; use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; @@ -37,11 +38,11 @@ use OCA\Libresign\Vendor\phpseclib3\File\ASN1\Element; use OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * Pure-PHP X.509 Parser * * @author Jim Wigginton - * @internal */ class X509 { @@ -52,6 +53,7 @@ class X509 * */ const VALIDATE_SIGNATURE_BY_CA = 1; + /** * Return internal array representation * @@ -88,6 +90,7 @@ class X509 * @see \phpseclib3\File\X509::getDN() */ const DN_HASH = 5; + /** * Save as PEM * @@ -126,46 +129,50 @@ class X509 * @see \phpseclib3\File\X509::saveCRL() */ const FORMAT_AUTO_DETECT = 3; + /** * Attribute value disposition. * If disposition is >= 0, this is the index of the target value. */ - const ATTR_ALL = -1; - // All attribute values (array). - const ATTR_APPEND = -2; - // Add a value. - const ATTR_REPLACE = -3; - // Clear first, then add a value. + const ATTR_ALL = -1; // All attribute values (array). + const ATTR_APPEND = -2; // Add a value. + const ATTR_REPLACE = -3; // Clear first, then add a value. + /** * Distinguished Name * * @var array */ private $dn; + /** * Public key * * @var string|PublicKey */ private $publicKey; + /** * Private key * * @var string|PrivateKey */ private $privateKey; + /** * The certificate authorities * * @var array */ private $CAs = []; + /** * The currently loaded certificate * * @var array */ private $currentCert; + /** * The signature subject * @@ -175,24 +182,28 @@ class X509 * @var string */ private $signatureSubject; + /** * Certificate Start Date * * @var string */ private $startDate; + /** * Certificate End Date * * @var string|Element */ private $endDate; + /** * Serial Number * * @var string */ private $serialNumber; + /** * Key Identifier * @@ -202,52 +213,62 @@ class X509 * @var string */ private $currentKeyIdentifier; + /** * CA Flag * * @var bool */ - private $caFlag = \false; + private $caFlag = false; + /** * SPKAC Challenge * * @var string */ private $challenge; + /** * @var array */ private $extensionValues = []; + /** * OIDs loaded * * @var bool */ - private static $oidsLoaded = \false; + private static $oidsLoaded = false; + /** * Recursion Limit * * @var int */ private static $recur_limit = 5; + /** * URL fetch flag * * @var bool */ - private static $disable_url_fetch = \false; + private static $disable_url_fetch = false; + /** * @var array */ private static $extensions = []; + /** * @var ?array */ private $ipAddresses = null; + /** * @var ?array */ private $domains = null; + /** * Default Constructor. * @@ -257,6 +278,7 @@ public function __construct() { // Explicitly Tagged Module, 1988 Syntax // http://tools.ietf.org/html/rfc5280#appendix-A.1 + if (!self::$oidsLoaded) { // OIDs from RFC5280 and those RFCs mentioned in RFC5280#section-4.1.1.2 ASN1::loadOIDs([ @@ -297,6 +319,7 @@ public function __construct() 'jurisdictionOfIncorporationStateOrProvinceName' => '1.3.6.1.4.1.311.60.2.1.2', 'jurisdictionLocalityName' => '1.3.6.1.4.1.311.60.2.1.1', 'id-at-businessCategory' => '2.5.4.15', + //'id-domainComponent' => '0.9.2342.19200300.100.1.25', //'pkcs-9' => '1.2.840.113549.1.9', 'pkcs-9-at-emailAddress' => '1.2.840.113549.1.9.1', @@ -307,7 +330,9 @@ public function __construct() 'id-ce-privateKeyUsagePeriod' => '2.5.29.16', 'id-ce-certificatePolicies' => '2.5.29.32', //'anyPolicy' => '2.5.29.32.0', + 'id-ce-policyMappings' => '2.5.29.33', + 'id-ce-subjectAltName' => '2.5.29.17', 'id-ce-issuerAltName' => '2.5.29.18', 'id-ce-subjectDirectoryAttributes' => '2.5.29.9', @@ -338,6 +363,7 @@ public function __construct() 'id-holdinstruction-callissuer' => '1.2.840.10040.2.2', 'id-holdinstruction-reject' => '1.2.840.10040.2.3', 'id-ce-invalidityDate' => '2.5.29.24', + 'rsaEncryption' => '1.2.840.113549.1.1.1', 'md2WithRSAEncryption' => '1.2.840.113549.1.1.2', 'md5WithRSAEncryption' => '1.2.840.113549.1.1.4', @@ -346,6 +372,7 @@ public function __construct() 'sha256WithRSAEncryption' => '1.2.840.113549.1.1.11', 'sha384WithRSAEncryption' => '1.2.840.113549.1.1.12', 'sha512WithRSAEncryption' => '1.2.840.113549.1.1.13', + 'id-ecPublicKey' => '1.2.840.10045.2.1', 'ecdsa-with-SHA1' => '1.2.840.10045.4.1', // from https://tools.ietf.org/html/rfc5758#section-3.2 @@ -353,15 +380,19 @@ public function __construct() 'ecdsa-with-SHA256' => '1.2.840.10045.4.3.2', 'ecdsa-with-SHA384' => '1.2.840.10045.4.3.3', 'ecdsa-with-SHA512' => '1.2.840.10045.4.3.4', + 'id-dsa' => '1.2.840.10040.4.1', 'id-dsa-with-sha1' => '1.2.840.10040.4.3', // from https://tools.ietf.org/html/rfc5758#section-3.1 'id-dsa-with-sha224' => '2.16.840.1.101.3.4.3.1', 'id-dsa-with-sha256' => '2.16.840.1.101.3.4.3.2', + // from https://tools.ietf.org/html/rfc8410: 'id-Ed25519' => '1.3.101.112', 'id-Ed448' => '1.3.101.113', + 'id-RSASSA-PSS' => '1.2.840.113549.1.1.10', + //'id-sha224' => '2.16.840.1.101.3.4.2.4', //'id-sha256' => '2.16.840.1.101.3.4.2.1', //'id-sha384' => '2.16.840.1.101.3.4.2.2', @@ -382,14 +413,13 @@ public function __construct() 'verisignPrivate' => '2.16.840.1.113733.1.6.9', // for Certificate Signing Requests // see http://tools.ietf.org/html/rfc2985 - 'pkcs-9-at-unstructuredName' => '1.2.840.113549.1.9.2', - // PKCS #9 unstructured name - 'pkcs-9-at-challengePassword' => '1.2.840.113549.1.9.7', - // Challenge password for certificate revocations - 'pkcs-9-at-extensionRequest' => '1.2.840.113549.1.9.14', + 'pkcs-9-at-unstructuredName' => '1.2.840.113549.1.9.2', // PKCS #9 unstructured name + 'pkcs-9-at-challengePassword' => '1.2.840.113549.1.9.7', // Challenge password for certificate revocations + 'pkcs-9-at-extensionRequest' => '1.2.840.113549.1.9.14' // Certificate extension request ]); } } + /** * Load X.509 certificate * @@ -401,53 +431,70 @@ public function __construct() */ public function loadX509($cert, $mode = self::FORMAT_AUTO_DETECT) { - if (\is_array($cert) && isset($cert['tbsCertificate'])) { + if (is_array($cert) && isset($cert['tbsCertificate'])) { unset($this->currentCert); unset($this->currentKeyIdentifier); $this->dn = $cert['tbsCertificate']['subject']; if (!isset($this->dn)) { - return \false; + return false; } $this->currentCert = $cert; + $currentKeyIdentifier = $this->getExtension('id-ce-subjectKeyIdentifier'); - $this->currentKeyIdentifier = \is_string($currentKeyIdentifier) ? $currentKeyIdentifier : null; + $this->currentKeyIdentifier = is_string($currentKeyIdentifier) ? $currentKeyIdentifier : null; + unset($this->signatureSubject); + return $cert; } + if ($mode != self::FORMAT_DER) { $newcert = ASN1::extractBER($cert); if ($mode == self::FORMAT_PEM && $cert == $newcert) { - return \false; + return false; } $cert = $newcert; } - if ($cert === \false) { - $this->currentCert = \false; - return \false; + + if ($cert === false) { + $this->currentCert = false; + return false; } + $decoded = ASN1::decodeBER($cert); + if ($decoded) { $x509 = ASN1::asn1map($decoded[0], Maps\Certificate::MAP); } - if (!isset($x509) || $x509 === \false) { - $this->currentCert = \false; - return \false; + if (!isset($x509) || $x509 === false) { + $this->currentCert = false; + return false; } - $this->signatureSubject = \substr($cert, $decoded[0]['content'][0]['start'], $decoded[0]['content'][0]['length']); + + $this->signatureSubject = substr($cert, $decoded[0]['content'][0]['start'], $decoded[0]['content'][0]['length']); + if ($this->isSubArrayValid($x509, 'tbsCertificate/extensions')) { $this->mapInExtensions($x509, 'tbsCertificate/extensions'); } $this->mapInDNs($x509, 'tbsCertificate/issuer/rdnSequence'); $this->mapInDNs($x509, 'tbsCertificate/subject/rdnSequence'); + $key = $x509['tbsCertificate']['subjectPublicKeyInfo']; $key = ASN1::encodeDER($key, Maps\SubjectPublicKeyInfo::MAP); - $x509['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey'] = "-----BEGIN PUBLIC KEY-----\r\n" . \chunk_split(\base64_encode($key), 64) . "-----END PUBLIC KEY-----"; + $x509['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey'] = + "-----BEGIN PUBLIC KEY-----\r\n" . + chunk_split(base64_encode($key), 64) . + "-----END PUBLIC KEY-----"; + $this->currentCert = $x509; $this->dn = $x509['tbsCertificate']['subject']; + $currentKeyIdentifier = $this->getExtension('id-ce-subjectKeyIdentifier'); - $this->currentKeyIdentifier = \is_string($currentKeyIdentifier) ? $currentKeyIdentifier : null; + $this->currentKeyIdentifier = is_string($currentKeyIdentifier) ? $currentKeyIdentifier : null; + return $x509; } + /** * Save X.509 certificate * @@ -457,17 +504,21 @@ public function loadX509($cert, $mode = self::FORMAT_AUTO_DETECT) */ public function saveX509(array $cert, $format = self::FORMAT_PEM) { - if (!\is_array($cert) || !isset($cert['tbsCertificate'])) { - return \false; + if (!is_array($cert) || !isset($cert['tbsCertificate'])) { + return false; } - switch (\true) { + + switch (true) { // "case !$a: case !$b: break; default: whatever();" is the same thing as "if ($a && $b) whatever()" case !($algorithm = $this->subArray($cert, 'tbsCertificate/subjectPublicKeyInfo/algorithm/algorithm')): - case \is_object($cert['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey']): + case is_object($cert['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey']): break; default: - $cert['tbsCertificate']['subjectPublicKeyInfo'] = new Element(\base64_decode(\preg_replace('#-.+-|[\\r\\n]#', '', $cert['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey']))); + $cert['tbsCertificate']['subjectPublicKeyInfo'] = new Element( + base64_decode(preg_replace('#-.+-|[\r\n]#', '', $cert['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey'])) + ); } + $filters = []; $type_utf8_string = ['type' => ASN1::TYPE_UTF8_STRING]; $filters['tbsCertificate']['signature']['parameters'] = $type_utf8_string; @@ -480,27 +531,35 @@ public function saveX509(array $cert, $format = self::FORMAT_PEM) //$filters['policyQualifiers']['qualifier'] = $type_utf8_string; $filters['distributionPoint']['fullName']['directoryName']['rdnSequence']['value'] = $type_utf8_string; $filters['directoryName']['rdnSequence']['value'] = $type_utf8_string; + foreach (self::$extensions as $extension) { $filters['tbsCertificate']['extensions'][] = $extension; } + /* in the case of policyQualifiers/qualifier, the type has to be \phpseclib3\File\ASN1::TYPE_IA5_STRING. - \phpseclib3\File\ASN1::TYPE_PRINTABLE_STRING will cause OpenSSL's X.509 parser to spit out random - characters. - */ - $filters['policyQualifiers']['qualifier'] = ['type' => ASN1::TYPE_IA5_STRING]; + \phpseclib3\File\ASN1::TYPE_PRINTABLE_STRING will cause OpenSSL's X.509 parser to spit out random + characters. + */ + $filters['policyQualifiers']['qualifier'] + = ['type' => ASN1::TYPE_IA5_STRING]; + ASN1::setFilters($filters); + $this->mapOutExtensions($cert, 'tbsCertificate/extensions'); $this->mapOutDNs($cert, 'tbsCertificate/issuer/rdnSequence'); $this->mapOutDNs($cert, 'tbsCertificate/subject/rdnSequence'); + $cert = ASN1::encodeDER($cert, Maps\Certificate::MAP); + switch ($format) { case self::FORMAT_DER: return $cert; // case self::FORMAT_PEM: default: - return "-----BEGIN CERTIFICATE-----\r\n" . \chunk_split(Strings::base64_encode($cert), 64) . '-----END CERTIFICATE-----'; + return "-----BEGIN CERTIFICATE-----\r\n" . chunk_split(Strings::base64_encode($cert), 64) . '-----END CERTIFICATE-----'; } } + /** * Map extension values from octet string to extension-specific internal * format. @@ -510,38 +569,42 @@ public function saveX509(array $cert, $format = self::FORMAT_PEM) */ private function mapInExtensions(array &$root, $path) { - $extensions =& $this->subArrayUnchecked($root, $path); + $extensions = &$this->subArrayUnchecked($root, $path); + if ($extensions) { - for ($i = 0; $i < \count($extensions); $i++) { + for ($i = 0; $i < count($extensions); $i++) { $id = $extensions[$i]['extnId']; - $value =& $extensions[$i]['extnValue']; + $value = &$extensions[$i]['extnValue']; /* [extnValue] contains the DER encoding of an ASN.1 value corresponding to the extension type identified by extnID */ $map = $this->getMapping($id); - if (!\is_bool($map)) { - $decoder = $id == 'id-ce-nameConstraints' ? [static::class, 'decodeNameConstraintIP'] : [static::class, 'decodeIP']; + if (!is_bool($map)) { + $decoder = $id == 'id-ce-nameConstraints' ? + [static::class, 'decodeNameConstraintIP'] : + [static::class, 'decodeIP']; $decoded = ASN1::decodeBER($value); if (!$decoded) { continue; } $mapped = ASN1::asn1map($decoded[0], $map, ['iPAddress' => $decoder]); - $value = $mapped === \false ? $decoded[0] : $mapped; + $value = $mapped === false ? $decoded[0] : $mapped; + if ($id == 'id-ce-certificatePolicies') { - for ($j = 0; $j < \count($value); $j++) { + for ($j = 0; $j < count($value); $j++) { if (!isset($value[$j]['policyQualifiers'])) { continue; } - for ($k = 0; $k < \count($value[$j]['policyQualifiers']); $k++) { + for ($k = 0; $k < count($value[$j]['policyQualifiers']); $k++) { $subid = $value[$j]['policyQualifiers'][$k]['policyQualifierId']; $map = $this->getMapping($subid); - $subvalue =& $value[$j]['policyQualifiers'][$k]['qualifier']; - if ($map !== \false) { + $subvalue = &$value[$j]['policyQualifiers'][$k]['qualifier']; + if ($map !== false) { $decoded = ASN1::decodeBER($subvalue); if (!$decoded) { continue; } $mapped = ASN1::asn1map($decoded[0], $map); - $subvalue = $mapped === \false ? $decoded[0] : $mapped; + $subvalue = $mapped === false ? $decoded[0] : $mapped; } } } @@ -550,6 +613,7 @@ private function mapInExtensions(array &$root, $path) } } } + /** * Map extension values from extension-specific internal format to * octet string. @@ -559,12 +623,17 @@ private function mapInExtensions(array &$root, $path) */ private function mapOutExtensions(array &$root, $path) { - $extensions =& $this->subArray($root, $path, !empty($this->extensionValues)); + $extensions = &$this->subArray($root, $path, !empty($this->extensionValues)); + foreach ($this->extensionValues as $id => $data) { $critical = $data['critical']; $replace = $data['replace']; $value = $data['value']; - $newext = ['extnId' => $id, 'extnValue' => $value, 'critical' => $critical]; + $newext = [ + 'extnId' => $id, + 'extnValue' => $value, + 'critical' => $critical + ]; if ($replace) { foreach ($extensions as $key => $value) { if ($value['extnId'] == $id) { @@ -575,25 +644,28 @@ private function mapOutExtensions(array &$root, $path) } $extensions[] = $newext; } - if (\is_array($extensions)) { - $size = \count($extensions); + + if (is_array($extensions)) { + $size = count($extensions); for ($i = 0; $i < $size; $i++) { if ($extensions[$i] instanceof Element) { continue; } + $id = $extensions[$i]['extnId']; - $value =& $extensions[$i]['extnValue']; + $value = &$extensions[$i]['extnValue']; + switch ($id) { case 'id-ce-certificatePolicies': - for ($j = 0; $j < \count($value); $j++) { + for ($j = 0; $j < count($value); $j++) { if (!isset($value[$j]['policyQualifiers'])) { continue; } - for ($k = 0; $k < \count($value[$j]['policyQualifiers']); $k++) { + for ($k = 0; $k < count($value[$j]['policyQualifiers']); $k++) { $subid = $value[$j]['policyQualifiers'][$k]['policyQualifierId']; $map = $this->getMapping($subid); - $subvalue =& $value[$j]['policyQualifiers'][$k]['qualifier']; - if ($map !== \false) { + $subvalue = &$value[$j]['policyQualifiers'][$k]['qualifier']; + if ($map !== false) { // by default \phpseclib3\File\ASN1 will try to render qualifier as a \phpseclib3\File\ASN1::TYPE_IA5_STRING since it's // actual type is \phpseclib3\File\ASN1::TYPE_ANY $subvalue = new Element(ASN1::encodeDER($subvalue, $map)); @@ -601,19 +673,19 @@ private function mapOutExtensions(array &$root, $path) } } break; - case 'id-ce-authorityKeyIdentifier': - // use 00 as the serial number instead of an empty string + case 'id-ce-authorityKeyIdentifier': // use 00 as the serial number instead of an empty string if (isset($value['authorityCertSerialNumber'])) { if ($value['authorityCertSerialNumber']->toBytes() == '') { - $temp = \chr(ASN1::CLASS_CONTEXT_SPECIFIC << 6 | 2) . "\x01\x00"; + $temp = chr((ASN1::CLASS_CONTEXT_SPECIFIC << 6) | 2) . "\1\0"; $value['authorityCertSerialNumber'] = new Element($temp); } } } + /* [extnValue] contains the DER encoding of an ASN.1 value corresponding to the extension type identified by extnID */ $map = $this->getMapping($id); - if (\is_bool($map)) { + if (is_bool($map)) { if (!$map) { //user_error($id . ' is not a currently supported extension'); unset($extensions[$i]); @@ -624,6 +696,7 @@ private function mapOutExtensions(array &$root, $path) } } } + /** * Map attribute values from ANY type to attribute-specific internal * format. @@ -633,24 +706,25 @@ private function mapOutExtensions(array &$root, $path) */ private function mapInAttributes(&$root, $path) { - $attributes =& $this->subArray($root, $path); - if (\is_array($attributes)) { - for ($i = 0; $i < \count($attributes); $i++) { + $attributes = &$this->subArray($root, $path); + + if (is_array($attributes)) { + for ($i = 0; $i < count($attributes); $i++) { $id = $attributes[$i]['type']; /* $value contains the DER encoding of an ASN.1 value corresponding to the attribute type identified by type */ $map = $this->getMapping($id); - if (\is_array($attributes[$i]['value'])) { - $values =& $attributes[$i]['value']; - for ($j = 0; $j < \count($values); $j++) { + if (is_array($attributes[$i]['value'])) { + $values = &$attributes[$i]['value']; + for ($j = 0; $j < count($values); $j++) { $value = ASN1::encodeDER($values[$j], Maps\AttributeValue::MAP); $decoded = ASN1::decodeBER($value); - if (!\is_bool($map)) { + if (!is_bool($map)) { if (!$decoded) { continue; } $mapped = ASN1::asn1map($decoded[0], $map); - if ($mapped !== \false) { + if ($mapped !== false) { $values[$j] = $mapped; } if ($id == 'pkcs-9-at-extensionRequest' && $this->isSubArrayValid($values, $j)) { @@ -664,6 +738,7 @@ private function mapInAttributes(&$root, $path) } } } + /** * Map attribute values from attribute-specific internal format to * ANY type. @@ -673,26 +748,28 @@ private function mapInAttributes(&$root, $path) */ private function mapOutAttributes(&$root, $path) { - $attributes =& $this->subArray($root, $path); - if (\is_array($attributes)) { - $size = \count($attributes); + $attributes = &$this->subArray($root, $path); + + if (is_array($attributes)) { + $size = count($attributes); for ($i = 0; $i < $size; $i++) { /* [value] contains the DER encoding of an ASN.1 value corresponding to the attribute type identified by type */ $id = $attributes[$i]['type']; $map = $this->getMapping($id); - if ($map === \false) { + if ($map === false) { //user_error($id . ' is not a currently supported attribute', E_USER_NOTICE); unset($attributes[$i]); - } elseif (\is_array($attributes[$i]['value'])) { - $values =& $attributes[$i]['value']; - for ($j = 0; $j < \count($values); $j++) { + } elseif (is_array($attributes[$i]['value'])) { + $values = &$attributes[$i]['value']; + for ($j = 0; $j < count($values); $j++) { switch ($id) { case 'pkcs-9-at-extensionRequest': $this->mapOutExtensions($values, $j); break; } - if (!\is_bool($map)) { + + if (!is_bool($map)) { $temp = ASN1::encodeDER($values[$j], $map); $decoded = ASN1::decodeBER($temp); if (!$decoded) { @@ -705,6 +782,7 @@ private function mapOutAttributes(&$root, $path) } } } + /** * Map DN values from ANY type to DN-specific internal * format. @@ -714,15 +792,16 @@ private function mapOutAttributes(&$root, $path) */ private function mapInDNs(array &$root, $path) { - $dns =& $this->subArray($root, $path); - if (\is_array($dns)) { - for ($i = 0; $i < \count($dns); $i++) { - for ($j = 0; $j < \count($dns[$i]); $j++) { + $dns = &$this->subArray($root, $path); + + if (is_array($dns)) { + for ($i = 0; $i < count($dns); $i++) { + for ($j = 0; $j < count($dns[$i]); $j++) { $type = $dns[$i][$j]['type']; - $value =& $dns[$i][$j]['value']; - if (\is_object($value) && $value instanceof Element) { + $value = &$dns[$i][$j]['value']; + if (is_object($value) && $value instanceof Element) { $map = $this->getMapping($type); - if (!\is_bool($map)) { + if (!is_bool($map)) { $decoded = ASN1::decodeBER($value); if (!$decoded) { continue; @@ -734,6 +813,7 @@ private function mapInDNs(array &$root, $path) } } } + /** * Map DN values from DN-specific internal format to * ANY type. @@ -743,24 +823,27 @@ private function mapInDNs(array &$root, $path) */ private function mapOutDNs(array &$root, $path) { - $dns =& $this->subArray($root, $path); - if (\is_array($dns)) { - $size = \count($dns); + $dns = &$this->subArray($root, $path); + + if (is_array($dns)) { + $size = count($dns); for ($i = 0; $i < $size; $i++) { - for ($j = 0; $j < \count($dns[$i]); $j++) { + for ($j = 0; $j < count($dns[$i]); $j++) { $type = $dns[$i][$j]['type']; - $value =& $dns[$i][$j]['value']; - if (\is_object($value) && $value instanceof Element) { + $value = &$dns[$i][$j]['value']; + if (is_object($value) && $value instanceof Element) { continue; } + $map = $this->getMapping($type); - if (!\is_bool($map)) { + if (!is_bool($map)) { $value = new Element(ASN1::encodeDER($value, $map)); } } } } } + /** * Associate an extension ID to an extension mapping * @@ -769,13 +852,14 @@ private function mapOutDNs(array &$root, $path) */ private function getMapping($extnId) { - if (!\is_string($extnId)) { - // eg. if it's a \phpseclib3\File\ASN1\Element object - return \true; + if (!is_string($extnId)) { // eg. if it's a \phpseclib3\File\ASN1\Element object + return true; } + if (isset(self::$extensions[$extnId])) { return self::$extensions[$extnId]; } + switch ($extnId) { case 'id-ce-keyUsage': return Maps\KeyUsage::MAP; @@ -805,38 +889,38 @@ private function getMapping($extnId) return Maps\PolicyMappings::MAP; case 'id-ce-nameConstraints': return Maps\NameConstraints::MAP; + case 'netscape-cert-type': return Maps\netscape_cert_type::MAP; case 'netscape-comment': return Maps\netscape_comment::MAP; case 'netscape-ca-policy-url': return Maps\netscape_ca_policy_url::MAP; + // since id-qt-cps isn't a constructed type it will have already been decoded as a string by the time it gets // back around to asn1map() and we don't want it decoded again. //case 'id-qt-cps': // return Maps\CPSuri::MAP; case 'id-qt-unotice': return Maps\UserNotice::MAP; + // the following OIDs are unsupported but we don't want them to give notices when calling saveX509(). - case 'id-pe-logotype': - // http://www.ietf.org/rfc/rfc3709.txt + case 'id-pe-logotype': // http://www.ietf.org/rfc/rfc3709.txt case 'entrustVersInfo': // http://support.microsoft.com/kb/287547 - case '1.3.6.1.4.1.311.20.2': - // szOID_ENROLL_CERTTYPE_EXTENSION - case '1.3.6.1.4.1.311.21.1': - // szOID_CERTSRV_CA_VERSION + case '1.3.6.1.4.1.311.20.2': // szOID_ENROLL_CERTTYPE_EXTENSION + case '1.3.6.1.4.1.311.21.1': // szOID_CERTSRV_CA_VERSION // "SET Secure Electronic Transaction Specification" // http://www.maithean.com/docs/set_bk3.pdf - case '2.23.42.7.0': - // id-set-hashedRootKey + case '2.23.42.7.0': // id-set-hashedRootKey // "Certificate Transparency" // https://tools.ietf.org/html/rfc6962 case '1.3.6.1.4.1.11129.2.4.2': // "Qualified Certificate statements" // https://tools.ietf.org/html/rfc3739#section-3.2.6 case '1.3.6.1.5.5.7.1.3': - return \true; + return true; + // CSR attributes case 'pkcs-9-at-unstructuredName': return Maps\PKCS9String::MAP; @@ -844,6 +928,7 @@ private function getMapping($extnId) return Maps\DirectoryString::MAP; case 'pkcs-9-at-extensionRequest': return Maps\Extensions::MAP; + // CRL extensions. case 'id-ce-cRLNumber': return Maps\CRLNumber::MAP; @@ -864,8 +949,10 @@ private function getMapping($extnId) case 'id-at-postalAddress': return Maps\PostalAddress::MAP; } - return \false; + + return false; } + /** * Load an X.509 certificate as a certificate authority * @@ -878,42 +965,50 @@ public function loadCA($cert) $oldcert = $this->currentCert; $oldsigsubj = $this->signatureSubject; $oldkeyid = $this->currentKeyIdentifier; + $cert = $this->loadX509($cert); if (!$cert) { $this->dn = $olddn; $this->currentCert = $oldcert; $this->signatureSubject = $oldsigsubj; $this->currentKeyIdentifier = $oldkeyid; - return \false; + + return false; } + /* From RFC5280 "PKIX Certificate and CRL Profile": - - If the keyUsage extension is present, then the subject public key - MUST NOT be used to verify signatures on certificates or CRLs unless - the corresponding keyCertSign or cRLSign bit is set. */ + + If the keyUsage extension is present, then the subject public key + MUST NOT be used to verify signatures on certificates or CRLs unless + the corresponding keyCertSign or cRLSign bit is set. */ //$keyUsage = $this->getExtension('id-ce-keyUsage'); //if ($keyUsage && !in_array('keyCertSign', $keyUsage)) { // return false; //} + /* From RFC5280 "PKIX Certificate and CRL Profile": - - The cA boolean indicates whether the certified public key may be used - to verify certificate signatures. If the cA boolean is not asserted, - then the keyCertSign bit in the key usage extension MUST NOT be - asserted. If the basic constraints extension is not present in a - version 3 certificate, or the extension is present but the cA boolean - is not asserted, then the certified public key MUST NOT be used to - verify certificate signatures. */ + + The cA boolean indicates whether the certified public key may be used + to verify certificate signatures. If the cA boolean is not asserted, + then the keyCertSign bit in the key usage extension MUST NOT be + asserted. If the basic constraints extension is not present in a + version 3 certificate, or the extension is present but the cA boolean + is not asserted, then the certified public key MUST NOT be used to + verify certificate signatures. */ //$basicConstraints = $this->getExtension('id-ce-basicConstraints'); //if (!$basicConstraints || !$basicConstraints['cA']) { // return false; //} + $this->CAs[] = $cert; + $this->dn = $olddn; $this->currentCert = $oldcert; $this->signatureSubject = $oldsigsubj; - return \true; + + return true; } + /** * Validate an X.509 certificate against a URL * @@ -932,51 +1027,56 @@ public function loadCA($cert) */ public function validateURL($url) { - if (!\is_array($this->currentCert) || !isset($this->currentCert['tbsCertificate'])) { - return \false; + if (!is_array($this->currentCert) || !isset($this->currentCert['tbsCertificate'])) { + return false; } - $components = \parse_url($url); + + $components = parse_url($url); if (!isset($components['host'])) { - return \false; + return false; } + if ($names = $this->getExtension('id-ce-subjectAltName')) { foreach ($names as $name) { foreach ($name as $key => $value) { - $value = \preg_quote($value); - $value = \str_replace('\\*', '[^.]*', $value); + $value = preg_quote($value); + $value = str_replace('\*', '[^.]*', $value); switch ($key) { case 'dNSName': /* From RFC2818 "HTTP over TLS": - - If a subjectAltName extension of type dNSName is present, that MUST - be used as the identity. Otherwise, the (most specific) Common Name - field in the Subject field of the certificate MUST be used. Although - the use of the Common Name is existing practice, it is deprecated and - Certification Authorities are encouraged to use the dNSName instead. */ - if (\preg_match('#^' . $value . '$#', $components['host'])) { - return \true; + + If a subjectAltName extension of type dNSName is present, that MUST + be used as the identity. Otherwise, the (most specific) Common Name + field in the Subject field of the certificate MUST be used. Although + the use of the Common Name is existing practice, it is deprecated and + Certification Authorities are encouraged to use the dNSName instead. */ + if (preg_match('#^' . $value . '$#', $components['host'])) { + return true; } break; case 'iPAddress': /* From RFC2818 "HTTP over TLS": - - In some cases, the URI is specified as an IP address rather than a - hostname. In this case, the iPAddress subjectAltName must be present - in the certificate and must exactly match the IP in the URI. */ - if (\preg_match('#(?:\\d{1-3}\\.){4}#', $components['host'] . '.') && \preg_match('#^' . $value . '$#', $components['host'])) { - return \true; + + In some cases, the URI is specified as an IP address rather than a + hostname. In this case, the iPAddress subjectAltName must be present + in the certificate and must exactly match the IP in the URI. */ + if (preg_match('#(?:\d{1-3}\.){4}#', $components['host'] . '.') && preg_match('#^' . $value . '$#', $components['host'])) { + return true; } } } } - return \false; + return false; } + if ($value = $this->getDNProp('id-at-commonName')) { - $value = \str_replace(['.', '*'], ['\\.', '[^.]*'], $value[0]); - return \preg_match('#^' . $value . '$#', $components['host']) === 1; + $value = str_replace(['.', '*'], ['\.', '[^.]*'], $value[0]); + return preg_match('#^' . $value . '$#', $components['host']) === 1; } - return \false; + + return false; } + /** * Validate a date * @@ -987,23 +1087,30 @@ public function validateURL($url) */ public function validateDate($date = null) { - if (!\is_array($this->currentCert) || !isset($this->currentCert['tbsCertificate'])) { - return \false; + if (!is_array($this->currentCert) || !isset($this->currentCert['tbsCertificate'])) { + return false; } + if (!isset($date)) { - $date = new \DateTimeImmutable('now', new \DateTimeZone(@\date_default_timezone_get())); + $date = new \DateTimeImmutable('now', new \DateTimeZone(@date_default_timezone_get())); } + $notBefore = $this->currentCert['tbsCertificate']['validity']['notBefore']; $notBefore = isset($notBefore['generalTime']) ? $notBefore['generalTime'] : $notBefore['utcTime']; + $notAfter = $this->currentCert['tbsCertificate']['validity']['notAfter']; $notAfter = isset($notAfter['generalTime']) ? $notAfter['generalTime'] : $notAfter['utcTime']; - if (\is_string($date)) { - $date = new \DateTimeImmutable($date, new \DateTimeZone(@\date_default_timezone_get())); + + if (is_string($date)) { + $date = new \DateTimeImmutable($date, new \DateTimeZone(@date_default_timezone_get())); } - $notBefore = new \DateTimeImmutable($notBefore, new \DateTimeZone(@\date_default_timezone_get())); - $notAfter = new \DateTimeImmutable($notAfter, new \DateTimeZone(@\date_default_timezone_get())); + + $notBefore = new \DateTimeImmutable($notBefore, new \DateTimeZone(@date_default_timezone_get())); + $notAfter = new \DateTimeImmutable($notAfter, new \DateTimeZone(@date_default_timezone_get())); + return $date >= $notBefore && $date <= $notAfter; } + /** * Fetches a URL * @@ -1013,44 +1120,53 @@ public function validateDate($date = null) private static function fetchURL($url) { if (self::$disable_url_fetch) { - return \false; + return false; } - $parts = \parse_url($url); + + $parts = parse_url($url); $data = ''; switch ($parts['scheme']) { case 'http': - $fsock = @\fsockopen($parts['host'], isset($parts['port']) ? $parts['port'] : 80); + $fsock = @fsockopen($parts['host'], isset($parts['port']) ? $parts['port'] : 80); if (!$fsock) { - return \false; + return false; } $path = $parts['path']; if (isset($parts['query'])) { $path .= '?' . $parts['query']; } - \fputs($fsock, "GET {$path} HTTP/1.0\r\n"); - \fputs($fsock, "Host: {$parts['host']}\r\n\r\n"); - $line = \fgets($fsock, 1024); - if (\strlen($line) < 3) { - return \false; + fputs($fsock, "GET $path HTTP/1.0\r\n"); + fputs($fsock, "Host: $parts[host]\r\n\r\n"); + $line = fgets($fsock, 1024); + if (strlen($line) < 3) { + return false; } - \preg_match('#HTTP/1.\\d (\\d{3})#', $line, $temp); + preg_match('#HTTP/1.\d (\d{3})#', $line, $temp); if ($temp[1] != '200') { - return \false; + return false; } + // skip the rest of the headers in the http response - while (!\feof($fsock) && \fgets($fsock, 1024) != "\r\n") { + while (!feof($fsock) && fgets($fsock, 1024) != "\r\n") { } - while (!\feof($fsock)) { - $temp = \fread($fsock, 1024); - if ($temp === \false) { - return \false; + + while (!feof($fsock)) { + $temp = fread($fsock, 1024); + if ($temp === false) { + return false; } $data .= $temp; } + break; + //case 'ftp': + //case 'ldap': + //default: } + return $data; } + /** * Validates an intermediate cert as identified via authority info access extension * @@ -1063,8 +1179,8 @@ private static function fetchURL($url) private function testForIntermediate($caonly, $count) { $opts = $this->getExtension('id-pe-authorityInfoAccess'); - if (!\is_array($opts)) { - return \false; + if (!is_array($opts)) { + return false; } foreach ($opts as $opt) { if ($opt['accessMethod'] == 'id-ad-caIssuers') { @@ -1077,34 +1193,41 @@ private function testForIntermediate($caonly, $count) } } } + if (!isset($url)) { - return \false; + return false; } + $cert = static::fetchURL($url); - if (!\is_string($cert)) { - return \false; + if (!is_string($cert)) { + return false; } + $parent = new static(); $parent->CAs = $this->CAs; /* "Conforming applications that support HTTP or FTP for accessing certificates MUST be able to accept .cer files and SHOULD be able to accept .p7c files." -- https://tools.ietf.org/html/rfc4325 - + A .p7c file is 'a "certs-only" CMS message as specified in RFC 2797" - + These are currently unsupported */ - if (!\is_array($parent->loadX509($cert))) { - return \false; + if (!is_array($parent->loadX509($cert))) { + return false; } + if (!$parent->validateSignatureCountable($caonly, ++$count)) { - return \false; + return false; } + $this->CAs[] = $parent->currentCert; //$this->loadCA($cert); - return \true; + + return true; } + /** * Validate a signature * @@ -1119,10 +1242,11 @@ private function testForIntermediate($caonly, $count) * @param bool $caonly optional * @return mixed */ - public function validateSignature($caonly = \true) + public function validateSignature($caonly = true) { return $this->validateSignatureCountable($caonly, 0); } + /** * Validate a signature * @@ -1134,99 +1258,124 @@ public function validateSignature($caonly = \true) */ private function validateSignatureCountable($caonly, $count) { - if (!\is_array($this->currentCert) || !isset($this->signatureSubject)) { + if (!is_array($this->currentCert) || !isset($this->signatureSubject)) { return null; } + if ($count == self::$recur_limit) { - return \false; + return false; } + /* TODO: - "emailAddress attribute values are not case-sensitive (e.g., "subscriber@example.com" is the same as "SUBSCRIBER@EXAMPLE.COM")." - -- http://tools.ietf.org/html/rfc5280#section-4.1.2.6 - - implement pathLenConstraint in the id-ce-basicConstraints extension */ - switch (\true) { + "emailAddress attribute values are not case-sensitive (e.g., "subscriber@example.com" is the same as "SUBSCRIBER@EXAMPLE.COM")." + -- http://tools.ietf.org/html/rfc5280#section-4.1.2.6 + + implement pathLenConstraint in the id-ce-basicConstraints extension */ + + switch (true) { case isset($this->currentCert['tbsCertificate']): // self-signed cert - switch (\true) { - case !\defined('FILE_X509_IGNORE_TYPE') && $this->currentCert['tbsCertificate']['issuer'] === $this->currentCert['tbsCertificate']['subject']: - case \defined('FILE_X509_IGNORE_TYPE') && $this->getIssuerDN(self::DN_STRING) === $this->getDN(self::DN_STRING): + switch (true) { + case !defined('FILE_X509_IGNORE_TYPE') && $this->currentCert['tbsCertificate']['issuer'] === $this->currentCert['tbsCertificate']['subject']: + case defined('FILE_X509_IGNORE_TYPE') && $this->getIssuerDN(self::DN_STRING) === $this->getDN(self::DN_STRING): $authorityKey = $this->getExtension('id-ce-authorityKeyIdentifier'); $subjectKeyID = $this->getExtension('id-ce-subjectKeyIdentifier'); - switch (\true) { - case !\is_array($authorityKey): + switch (true) { + case !is_array($authorityKey): case !$subjectKeyID: case isset($authorityKey['keyIdentifier']) && $authorityKey['keyIdentifier'] === $subjectKeyID: - $signingCert = $this->currentCert; + $signingCert = $this->currentCert; // working cert } } + if (!empty($this->CAs)) { - for ($i = 0; $i < \count($this->CAs); $i++) { + for ($i = 0; $i < count($this->CAs); $i++) { // even if the cert is a self-signed one we still want to see if it's a CA; // if not, we'll conditionally return an error $ca = $this->CAs[$i]; - switch (\true) { - case !\defined('FILE_X509_IGNORE_TYPE') && $this->currentCert['tbsCertificate']['issuer'] === $ca['tbsCertificate']['subject']: - case \defined('FILE_X509_IGNORE_TYPE') && $this->getDN(self::DN_STRING, $this->currentCert['tbsCertificate']['issuer']) === $this->getDN(self::DN_STRING, $ca['tbsCertificate']['subject']): + switch (true) { + case !defined('FILE_X509_IGNORE_TYPE') && $this->currentCert['tbsCertificate']['issuer'] === $ca['tbsCertificate']['subject']: + case defined('FILE_X509_IGNORE_TYPE') && $this->getDN(self::DN_STRING, $this->currentCert['tbsCertificate']['issuer']) === $this->getDN(self::DN_STRING, $ca['tbsCertificate']['subject']): $authorityKey = $this->getExtension('id-ce-authorityKeyIdentifier'); $subjectKeyID = $this->getExtension('id-ce-subjectKeyIdentifier', $ca); - switch (\true) { - case !\is_array($authorityKey): + switch (true) { + case !is_array($authorityKey): case !$subjectKeyID: case isset($authorityKey['keyIdentifier']) && $authorityKey['keyIdentifier'] === $subjectKeyID: - if (\is_array($authorityKey) && isset($authorityKey['authorityCertSerialNumber']) && !$authorityKey['authorityCertSerialNumber']->equals($ca['tbsCertificate']['serialNumber'])) { - break 2; - // serial mismatch - check other ca + if (is_array($authorityKey) && isset($authorityKey['authorityCertSerialNumber']) && !$authorityKey['authorityCertSerialNumber']->equals($ca['tbsCertificate']['serialNumber'])) { + break 2; // serial mismatch - check other ca } - $signingCert = $ca; - // working cert + $signingCert = $ca; // working cert break 3; } } } - if (\count($this->CAs) == $i && $caonly) { + if (count($this->CAs) == $i && $caonly) { return $this->testForIntermediate($caonly, $count) && $this->validateSignature($caonly); } } elseif (!isset($signingCert) || $caonly) { return $this->testForIntermediate($caonly, $count) && $this->validateSignature($caonly); } - return $this->validateSignatureHelper($signingCert['tbsCertificate']['subjectPublicKeyInfo']['algorithm']['algorithm'], $signingCert['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey'], $this->currentCert['signatureAlgorithm']['algorithm'], \substr($this->currentCert['signature'], 1), $this->signatureSubject); + return $this->validateSignatureHelper( + $signingCert['tbsCertificate']['subjectPublicKeyInfo']['algorithm']['algorithm'], + $signingCert['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey'], + $this->currentCert['signatureAlgorithm']['algorithm'], + substr($this->currentCert['signature'], 1), + $this->signatureSubject + ); case isset($this->currentCert['certificationRequestInfo']): - return $this->validateSignatureHelper($this->currentCert['certificationRequestInfo']['subjectPKInfo']['algorithm']['algorithm'], $this->currentCert['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey'], $this->currentCert['signatureAlgorithm']['algorithm'], \substr($this->currentCert['signature'], 1), $this->signatureSubject); + return $this->validateSignatureHelper( + $this->currentCert['certificationRequestInfo']['subjectPKInfo']['algorithm']['algorithm'], + $this->currentCert['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey'], + $this->currentCert['signatureAlgorithm']['algorithm'], + substr($this->currentCert['signature'], 1), + $this->signatureSubject + ); case isset($this->currentCert['publicKeyAndChallenge']): - return $this->validateSignatureHelper($this->currentCert['publicKeyAndChallenge']['spki']['algorithm']['algorithm'], $this->currentCert['publicKeyAndChallenge']['spki']['subjectPublicKey'], $this->currentCert['signatureAlgorithm']['algorithm'], \substr($this->currentCert['signature'], 1), $this->signatureSubject); + return $this->validateSignatureHelper( + $this->currentCert['publicKeyAndChallenge']['spki']['algorithm']['algorithm'], + $this->currentCert['publicKeyAndChallenge']['spki']['subjectPublicKey'], + $this->currentCert['signatureAlgorithm']['algorithm'], + substr($this->currentCert['signature'], 1), + $this->signatureSubject + ); case isset($this->currentCert['tbsCertList']): if (!empty($this->CAs)) { - for ($i = 0; $i < \count($this->CAs); $i++) { + for ($i = 0; $i < count($this->CAs); $i++) { $ca = $this->CAs[$i]; - switch (\true) { - case !\defined('FILE_X509_IGNORE_TYPE') && $this->currentCert['tbsCertList']['issuer'] === $ca['tbsCertificate']['subject']: - case \defined('FILE_X509_IGNORE_TYPE') && $this->getDN(self::DN_STRING, $this->currentCert['tbsCertList']['issuer']) === $this->getDN(self::DN_STRING, $ca['tbsCertificate']['subject']): + switch (true) { + case !defined('FILE_X509_IGNORE_TYPE') && $this->currentCert['tbsCertList']['issuer'] === $ca['tbsCertificate']['subject']: + case defined('FILE_X509_IGNORE_TYPE') && $this->getDN(self::DN_STRING, $this->currentCert['tbsCertList']['issuer']) === $this->getDN(self::DN_STRING, $ca['tbsCertificate']['subject']): $authorityKey = $this->getExtension('id-ce-authorityKeyIdentifier'); $subjectKeyID = $this->getExtension('id-ce-subjectKeyIdentifier', $ca); - switch (\true) { - case !\is_array($authorityKey): + switch (true) { + case !is_array($authorityKey): case !$subjectKeyID: case isset($authorityKey['keyIdentifier']) && $authorityKey['keyIdentifier'] === $subjectKeyID: - if (\is_array($authorityKey) && isset($authorityKey['authorityCertSerialNumber']) && !$authorityKey['authorityCertSerialNumber']->equals($ca['tbsCertificate']['serialNumber'])) { - break 2; - // serial mismatch - check other ca + if (is_array($authorityKey) && isset($authorityKey['authorityCertSerialNumber']) && !$authorityKey['authorityCertSerialNumber']->equals($ca['tbsCertificate']['serialNumber'])) { + break 2; // serial mismatch - check other ca } - $signingCert = $ca; - // working cert + $signingCert = $ca; // working cert break 3; } } } } if (!isset($signingCert)) { - return \false; + return false; } - return $this->validateSignatureHelper($signingCert['tbsCertificate']['subjectPublicKeyInfo']['algorithm']['algorithm'], $signingCert['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey'], $this->currentCert['signatureAlgorithm']['algorithm'], \substr($this->currentCert['signature'], 1), $this->signatureSubject); + return $this->validateSignatureHelper( + $signingCert['tbsCertificate']['subjectPublicKeyInfo']['algorithm']['algorithm'], + $signingCert['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey'], + $this->currentCert['signatureAlgorithm']['algorithm'], + substr($this->currentCert['signature'], 1), + $this->signatureSubject + ); default: - return \false; + return false; } } + /** * Validates a signature * @@ -1259,7 +1408,9 @@ private function validateSignatureHelper($publicKeyAlgorithm, $publicKey, $signa case 'sha256WithRSAEncryption': case 'sha384WithRSAEncryption': case 'sha512WithRSAEncryption': - $key = $key->withHash(\preg_replace('#WithRSAEncryption$#', '', $signatureAlgorithm))->withPadding(RSA::SIGNATURE_PKCS1); + $key = $key + ->withHash(preg_replace('#WithRSAEncryption$#', '', $signatureAlgorithm)) + ->withPadding(RSA::SIGNATURE_PKCS1); break; default: throw new UnsupportedAlgorithmException('Signature algorithm unsupported'); @@ -1277,7 +1428,8 @@ private function validateSignatureHelper($publicKeyAlgorithm, $publicKey, $signa case 'ecdsa-with-SHA256': case 'ecdsa-with-SHA384': case 'ecdsa-with-SHA512': - $key = $key->withHash(\preg_replace('#^ecdsa-with-#', '', \strtolower($signatureAlgorithm))); + $key = $key + ->withHash(preg_replace('#^ecdsa-with-#', '', strtolower($signatureAlgorithm))); break; default: throw new UnsupportedAlgorithmException('Signature algorithm unsupported'); @@ -1289,7 +1441,8 @@ private function validateSignatureHelper($publicKeyAlgorithm, $publicKey, $signa case 'id-dsa-with-sha1': case 'id-dsa-with-sha224': case 'id-dsa-with-sha256': - $key = $key->withHash(\preg_replace('#^id-dsa-with-#', '', \strtolower($signatureAlgorithm))); + $key = $key + ->withHash(preg_replace('#^id-dsa-with-#', '', strtolower($signatureAlgorithm))); break; default: throw new UnsupportedAlgorithmException('Signature algorithm unsupported'); @@ -1298,8 +1451,10 @@ private function validateSignatureHelper($publicKeyAlgorithm, $publicKey, $signa default: throw new UnsupportedAlgorithmException('Public key algorithm unsupported'); } + return $key->verify($signatureSubject, $signature); } + /** * Sets the recursion limit * @@ -1313,22 +1468,25 @@ public static function setRecurLimit($count) { self::$recur_limit = $count; } + /** * Prevents URIs from being automatically retrieved * */ public static function disableURLFetch() { - self::$disable_url_fetch = \true; + self::$disable_url_fetch = true; } + /** * Allows URIs to be automatically retrieved * */ public static function enableURLFetch() { - self::$disable_url_fetch = \false; + self::$disable_url_fetch = false; } + /** * Decodes an IP address * @@ -1339,8 +1497,9 @@ public static function enableURLFetch() */ public static function decodeIP($ip) { - return \inet_ntop($ip); + return inet_ntop($ip); } + /** * Decodes an IP address in a name constraints extension * @@ -1351,11 +1510,12 @@ public static function decodeIP($ip) */ public static function decodeNameConstraintIP($ip) { - $size = \strlen($ip) >> 1; - $mask = \substr($ip, $size); - $ip = \substr($ip, 0, $size); - return [\inet_ntop($ip), \inet_ntop($mask)]; + $size = strlen($ip) >> 1; + $mask = substr($ip, $size); + $ip = substr($ip, 0, $size); + return [inet_ntop($ip), inet_ntop($mask)]; } + /** * Encodes an IP address * @@ -1366,8 +1526,11 @@ public static function decodeNameConstraintIP($ip) */ public static function encodeIP($ip) { - return \is_string($ip) ? \inet_pton($ip) : \inet_pton($ip[0]) . \inet_pton($ip[1]); + return is_string($ip) ? + inet_pton($ip) : + inet_pton($ip[0]) . inet_pton($ip[1]); } + /** * "Normalizes" a Distinguished Name property * @@ -1376,7 +1539,7 @@ public static function encodeIP($ip) */ private function translateDNProp($propName) { - switch (\strtolower($propName)) { + switch (strtolower($propName)) { case 'jurisdictionofincorporationcountryname': case 'jurisdictioncountryname': case 'jurisdictionc': @@ -1469,9 +1632,10 @@ private function translateDNProp($propName) case 'id-at-postaladdress': return 'id-at-postalAddress'; default: - return \false; + return false; } } + /** * Set a Distinguished Name property * @@ -1485,17 +1649,26 @@ public function setDNProp($propName, $propValue, $type = 'utf8String') if (empty($this->dn)) { $this->dn = ['rdnSequence' => []]; } - if (($propName = $this->translateDNProp($propName)) === \false) { - return \false; + + if (($propName = $this->translateDNProp($propName)) === false) { + return false; } + foreach ((array) $propValue as $v) { - if (!\is_array($v) && isset($type)) { + if (!is_array($v) && isset($type)) { $v = [$type => $v]; } - $this->dn['rdnSequence'][] = [['type' => $propName, 'value' => $v]]; + $this->dn['rdnSequence'][] = [ + [ + 'type' => $propName, + 'value' => $v + ] + ]; } - return \true; + + return true; } + /** * Remove Distinguished Name properties * @@ -1506,22 +1679,26 @@ public function removeDNProp($propName) if (empty($this->dn)) { return; } - if (($propName = $this->translateDNProp($propName)) === \false) { + + if (($propName = $this->translateDNProp($propName)) === false) { return; } - $dn =& $this->dn['rdnSequence']; - $size = \count($dn); + + $dn = &$this->dn['rdnSequence']; + $size = count($dn); for ($i = 0; $i < $size; $i++) { if ($dn[$i][0]['type'] == $propName) { unset($dn[$i]); } } - $dn = \array_values($dn); + + $dn = array_values($dn); // fix for https://bugs.php.net/75433 affecting PHP 7.2 if (!isset($dn[0])) { - $dn = \array_splice($dn, 0, 0); + $dn = array_splice($dn, 0, 0); } } + /** * Get Distinguished Name properties * @@ -1530,48 +1707,50 @@ public function removeDNProp($propName) * @param bool $withType optional * @return mixed */ - public function getDNProp($propName, $dn = null, $withType = \false) + public function getDNProp($propName, $dn = null, $withType = false) { if (!isset($dn)) { $dn = $this->dn; } + if (empty($dn)) { - return \false; + return false; } - if (($propName = $this->translateDNProp($propName)) === \false) { - return \false; + + if (($propName = $this->translateDNProp($propName)) === false) { + return false; } + $filters = []; $filters['value'] = ['type' => ASN1::TYPE_UTF8_STRING]; ASN1::setFilters($filters); $this->mapOutDNs($dn, 'rdnSequence'); $dn = $dn['rdnSequence']; $result = []; - for ($i = 0; $i < \count($dn); $i++) { + for ($i = 0; $i < count($dn); $i++) { if ($dn[$i][0]['type'] == $propName) { $v = $dn[$i][0]['value']; if (!$withType) { - if (\is_array($v)) { + if (is_array($v)) { foreach ($v as $type => $s) { - $type = \array_search($type, ASN1::ANY_MAP); - if ($type !== \false && \array_key_exists($type, ASN1::STRING_TYPE_SIZE)) { + $type = array_search($type, ASN1::ANY_MAP); + if ($type !== false && array_key_exists($type, ASN1::STRING_TYPE_SIZE)) { $s = ASN1::convert($s, $type); - if ($s !== \false) { + if ($s !== false) { $v = $s; break; } } } - if (\is_array($v)) { - $v = \array_pop($v); - // Always strip data type. + if (is_array($v)) { + $v = array_pop($v); // Always strip data type. } - } elseif (\is_object($v) && $v instanceof Element) { + } elseif (is_object($v) && $v instanceof Element) { $map = $this->getMapping($propName); - if (!\is_bool($map)) { + if (!is_bool($map)) { $decoded = ASN1::decodeBER($v); if (!$decoded) { - return \false; + return false; } $v = ASN1::asn1map($decoded[0], $map); } @@ -1580,8 +1759,10 @@ public function getDNProp($propName, $dn = null, $withType = \false) $result[] = $v; } } + return $result; } + /** * Set a Distinguished Name * @@ -1590,36 +1771,40 @@ public function getDNProp($propName, $dn = null, $withType = \false) * @param string $type optional * @return bool */ - public function setDN($dn, $merge = \false, $type = 'utf8String') + public function setDN($dn, $merge = false, $type = 'utf8String') { if (!$merge) { $this->dn = null; } - if (\is_array($dn)) { + + if (is_array($dn)) { if (isset($dn['rdnSequence'])) { - $this->dn = $dn; - // No merge here. - return \true; + $this->dn = $dn; // No merge here. + return true; } + // handles stuff generated by openssl_x509_parse() foreach ($dn as $prop => $value) { if (!$this->setDNProp($prop, $value, $type)) { - return \false; + return false; } } - return \true; + return true; } + // handles everything else - $results = \preg_split('#((?:^|, *|/)(?:C=|O=|OU=|CN=|L=|ST=|SN=|postalCode=|streetAddress=|emailAddress=|serialNumber=|organizationalUnitName=|title=|description=|role=|x500UniqueIdentifier=|postalAddress=))#', $dn, -1, \PREG_SPLIT_DELIM_CAPTURE); - for ($i = 1; $i < \count($results); $i += 2) { - $prop = \trim($results[$i], ', =/'); + $results = preg_split('#((?:^|, *|/)(?:C=|O=|OU=|CN=|L=|ST=|SN=|postalCode=|streetAddress=|emailAddress=|serialNumber=|organizationalUnitName=|title=|description=|role=|x500UniqueIdentifier=|postalAddress=))#', $dn, -1, PREG_SPLIT_DELIM_CAPTURE); + for ($i = 1; $i < count($results); $i += 2) { + $prop = trim($results[$i], ', =/'); $value = $results[$i + 1]; if (!$this->setDNProp($prop, $value, $type)) { - return \false; + return false; } } - return \true; + + return true; } + /** * Get the Distinguished Name for a certificates subject * @@ -1632,6 +1817,7 @@ public function getDN($format = self::DN_ARRAY, $dn = null) if (!isset($dn)) { $dn = isset($this->currentCert['tbsCertList']) ? $this->currentCert['tbsCertList']['issuer'] : $this->dn; } + switch ((int) $format) { case self::DN_ARRAY: return $dn; @@ -1652,15 +1838,15 @@ public function getDN($format = self::DN_ARRAY, $dn = null) $this->mapOutDNs($dn, 'rdnSequence'); foreach ($dn['rdnSequence'] as $rdn) { foreach ($rdn as $i => $attr) { - $attr =& $rdn[$i]; - if (\is_array($attr['value'])) { + $attr = &$rdn[$i]; + if (is_array($attr['value'])) { foreach ($attr['value'] as $type => $v) { - $type = \array_search($type, ASN1::ANY_MAP, \true); - if ($type !== \false && \array_key_exists($type, ASN1::STRING_TYPE_SIZE)) { + $type = array_search($type, ASN1::ANY_MAP, true); + if ($type !== false && array_key_exists($type, ASN1::STRING_TYPE_SIZE)) { $v = ASN1::convert($v, $type); - if ($v !== \false) { - $v = \preg_replace('/\\s+/', ' ', $v); - $attr['value'] = \strtolower(\trim($v)); + if ($v !== false) { + $v = preg_replace('/\s+/', ' ', $v); + $attr['value'] = strtolower(trim($v)); break; } } @@ -1674,20 +1860,24 @@ public function getDN($format = self::DN_ARRAY, $dn = null) $dn = $this->getDN(self::DN_CANON, $dn); $hash = new Hash('sha1'); $hash = $hash->hash($dn); - $hash = \unpack('Vhash', $hash)['hash']; - return \strtolower(Strings::bin2hex(\pack('N', $hash))); + $hash = unpack('Vhash', $hash)['hash']; + return strtolower(Strings::bin2hex(pack('N', $hash))); } + // Default is to return a string. - $start = \true; + $start = true; $output = ''; + $result = []; $filters = []; $filters['rdnSequence']['value'] = ['type' => ASN1::TYPE_UTF8_STRING]; ASN1::setFilters($filters); $this->mapOutDNs($dn, 'rdnSequence'); + foreach ($dn['rdnSequence'] as $field) { $prop = $field[0]['type']; $value = $field[0]['value']; + $delim = ', '; switch ($prop) { case 'id-at-countryName': @@ -1721,38 +1911,42 @@ public function getDN($format = self::DN_ARRAY, $dn = null) break; default: $delim = '/'; - $desc = \preg_replace('#.+-([^-]+)$#', '$1', $prop); + $desc = preg_replace('#.+-([^-]+)$#', '$1', $prop); } + if (!$start) { $output .= $delim; } - if (\is_array($value)) { + if (is_array($value)) { foreach ($value as $type => $v) { - $type = \array_search($type, ASN1::ANY_MAP, \true); - if ($type !== \false && \array_key_exists($type, ASN1::STRING_TYPE_SIZE)) { + $type = array_search($type, ASN1::ANY_MAP, true); + if ($type !== false && array_key_exists($type, ASN1::STRING_TYPE_SIZE)) { $v = ASN1::convert($v, $type); - if ($v !== \false) { + if ($v !== false) { $value = $v; break; } } } - if (\is_array($value)) { - $value = \array_pop($value); - // Always strip data type. + if (is_array($value)) { + $value = array_pop($value); // Always strip data type. } - } elseif (\is_object($value) && $value instanceof Element) { + } elseif (is_object($value) && $value instanceof Element) { $callback = function ($x) { - return '\\x' . \bin2hex($x[0]); + return '\x' . bin2hex($x[0]); }; - $value = \strtoupper(\preg_replace_callback('#[^\\x20-\\x7E]#', $callback, $value->element)); + $value = strtoupper(preg_replace_callback('#[^\x20-\x7E]#', $callback, $value->element)); } $output .= $desc . '=' . $value; - $result[$desc] = isset($result[$desc]) ? \array_merge((array) $result[$desc], [$value]) : $value; - $start = \false; + $result[$desc] = isset($result[$desc]) ? + array_merge((array) $result[$desc], [$value]) : + $value; + $start = false; } + return $format == self::DN_OPENSSL ? $result : $output; } + /** * Get the Distinguished Name for a certificate/crl issuer * @@ -1761,16 +1955,18 @@ public function getDN($format = self::DN_ARRAY, $dn = null) */ public function getIssuerDN($format = self::DN_ARRAY) { - switch (\true) { - case !isset($this->currentCert) || !\is_array($this->currentCert): + switch (true) { + case !isset($this->currentCert) || !is_array($this->currentCert): break; case isset($this->currentCert['tbsCertificate']): return $this->getDN($format, $this->currentCert['tbsCertificate']['issuer']); case isset($this->currentCert['tbsCertList']): return $this->getDN($format, $this->currentCert['tbsCertList']['issuer']); } - return \false; + + return false; } + /** * Get the Distinguished Name for a certificate/csr subject * Alias of getDN() @@ -1780,18 +1976,20 @@ public function getIssuerDN($format = self::DN_ARRAY) */ public function getSubjectDN($format = self::DN_ARRAY) { - switch (\true) { + switch (true) { case !empty($this->dn): return $this->getDN($format); - case !isset($this->currentCert) || !\is_array($this->currentCert): + case !isset($this->currentCert) || !is_array($this->currentCert): break; case isset($this->currentCert['tbsCertificate']): return $this->getDN($format, $this->currentCert['tbsCertificate']['subject']); case isset($this->currentCert['certificationRequestInfo']): return $this->getDN($format, $this->currentCert['certificationRequestInfo']['subject']); } - return \false; + + return false; } + /** * Get an individual Distinguished Name property for a certificate/crl issuer * @@ -1799,18 +1997,20 @@ public function getSubjectDN($format = self::DN_ARRAY) * @param bool $withType optional * @return mixed */ - public function getIssuerDNProp($propName, $withType = \false) + public function getIssuerDNProp($propName, $withType = false) { - switch (\true) { - case !isset($this->currentCert) || !\is_array($this->currentCert): + switch (true) { + case !isset($this->currentCert) || !is_array($this->currentCert): break; case isset($this->currentCert['tbsCertificate']): return $this->getDNProp($propName, $this->currentCert['tbsCertificate']['issuer'], $withType); case isset($this->currentCert['tbsCertList']): return $this->getDNProp($propName, $this->currentCert['tbsCertList']['issuer'], $withType); } - return \false; + + return false; } + /** * Get an individual Distinguished Name property for a certificate/csr subject * @@ -1818,20 +2018,22 @@ public function getIssuerDNProp($propName, $withType = \false) * @param bool $withType optional * @return mixed */ - public function getSubjectDNProp($propName, $withType = \false) + public function getSubjectDNProp($propName, $withType = false) { - switch (\true) { + switch (true) { case !empty($this->dn): return $this->getDNProp($propName, null, $withType); - case !isset($this->currentCert) || !\is_array($this->currentCert): + case !isset($this->currentCert) || !is_array($this->currentCert): break; case isset($this->currentCert['tbsCertificate']): return $this->getDNProp($propName, $this->currentCert['tbsCertificate']['subject'], $withType); case isset($this->currentCert['certificationRequestInfo']): return $this->getDNProp($propName, $this->currentCert['certificationRequestInfo']['subject'], $withType); } - return \false; + + return false; } + /** * Get the certificate chain for the current cert * @@ -1840,19 +2042,20 @@ public function getSubjectDNProp($propName, $withType = \false) public function getChain() { $chain = [$this->currentCert]; - if (!\is_array($this->currentCert) || !isset($this->currentCert['tbsCertificate'])) { - return \false; + + if (!is_array($this->currentCert) || !isset($this->currentCert['tbsCertificate'])) { + return false; } - while (\true) { - $currentCert = $chain[\count($chain) - 1]; - for ($i = 0; $i < \count($this->CAs); $i++) { + while (true) { + $currentCert = $chain[count($chain) - 1]; + for ($i = 0; $i < count($this->CAs); $i++) { $ca = $this->CAs[$i]; if ($currentCert['tbsCertificate']['issuer'] === $ca['tbsCertificate']['subject']) { $authorityKey = $this->getExtension('id-ce-authorityKeyIdentifier', $currentCert); $subjectKeyID = $this->getExtension('id-ce-subjectKeyIdentifier', $ca); - switch (\true) { - case !\is_array($authorityKey): - case \is_array($authorityKey) && isset($authorityKey['keyIdentifier']) && $authorityKey['keyIdentifier'] === $subjectKeyID: + switch (true) { + case !is_array($authorityKey): + case is_array($authorityKey) && isset($authorityKey['keyIdentifier']) && $authorityKey['keyIdentifier'] === $subjectKeyID: if ($currentCert === $ca) { break 3; } @@ -1861,7 +2064,7 @@ public function getChain() } } } - if ($i == \count($this->CAs)) { + if ($i == count($this->CAs)) { break; } } @@ -1871,6 +2074,7 @@ public function getChain() } return $chain; } + /** * Returns the current cert * @@ -1880,6 +2084,7 @@ public function &getCurrentCert() { return $this->currentCert; } + /** * Set public key * @@ -1892,6 +2097,7 @@ public function setPublicKey(PublicKey $key) { $this->publicKey = $key; } + /** * Set private key * @@ -1903,6 +2109,7 @@ public function setPrivateKey(PrivateKey $key) { $this->privateKey = $key; } + /** * Set challenge * @@ -1914,6 +2121,7 @@ public function setChallenge($challenge) { $this->challenge = $challenge; } + /** * Gets the public key * @@ -1926,8 +2134,13 @@ public function getPublicKey() if (isset($this->publicKey)) { return $this->publicKey; } - if (isset($this->currentCert) && \is_array($this->currentCert)) { - $paths = ['tbsCertificate/subjectPublicKeyInfo', 'certificationRequestInfo/subjectPKInfo', 'publicKeyAndChallenge/spki']; + + if (isset($this->currentCert) && is_array($this->currentCert)) { + $paths = [ + 'tbsCertificate/subjectPublicKeyInfo', + 'certificationRequestInfo/subjectPKInfo', + 'publicKeyAndChallenge/spki' + ]; foreach ($paths as $path) { $keyinfo = $this->subArray($this->currentCert, $path); if (!empty($keyinfo)) { @@ -1936,9 +2149,11 @@ public function getPublicKey() } } if (empty($keyinfo)) { - return \false; + return false; } + $key = $keyinfo['subjectPublicKey']; + switch ($keyinfo['algorithm']['algorithm']) { case 'id-RSASSA-PSS': return RSA::loadFormat('PSS', $key); @@ -1951,8 +2166,10 @@ public function getPublicKey() case 'id-dsa': return DSA::loadFormat('PKCS8', $key); } - return \false; + + return false; } + /** * Load a Certificate Signing Request * @@ -1962,53 +2179,71 @@ public function getPublicKey() */ public function loadCSR($csr, $mode = self::FORMAT_AUTO_DETECT) { - if (\is_array($csr) && isset($csr['certificationRequestInfo'])) { + if (is_array($csr) && isset($csr['certificationRequestInfo'])) { unset($this->currentCert); unset($this->currentKeyIdentifier); unset($this->signatureSubject); $this->dn = $csr['certificationRequestInfo']['subject']; if (!isset($this->dn)) { - return \false; + return false; } + $this->currentCert = $csr; return $csr; } + // see http://tools.ietf.org/html/rfc2986 + if ($mode != self::FORMAT_DER) { $newcsr = ASN1::extractBER($csr); if ($mode == self::FORMAT_PEM && $csr == $newcsr) { - return \false; + return false; } $csr = $newcsr; } $orig = $csr; - if ($csr === \false) { - $this->currentCert = \false; - return \false; + + if ($csr === false) { + $this->currentCert = false; + return false; } + $decoded = ASN1::decodeBER($csr); + if (!$decoded) { - $this->currentCert = \false; - return \false; + $this->currentCert = false; + return false; } + $csr = ASN1::asn1map($decoded[0], Maps\CertificationRequest::MAP); - if (!isset($csr) || $csr === \false) { - $this->currentCert = \false; - return \false; + if (!isset($csr) || $csr === false) { + $this->currentCert = false; + return false; } + $this->mapInAttributes($csr, 'certificationRequestInfo/attributes'); $this->mapInDNs($csr, 'certificationRequestInfo/subject/rdnSequence'); + $this->dn = $csr['certificationRequestInfo']['subject']; - $this->signatureSubject = \substr($orig, $decoded[0]['content'][0]['start'], $decoded[0]['content'][0]['length']); + + $this->signatureSubject = substr($orig, $decoded[0]['content'][0]['start'], $decoded[0]['content'][0]['length']); + $key = $csr['certificationRequestInfo']['subjectPKInfo']; $key = ASN1::encodeDER($key, Maps\SubjectPublicKeyInfo::MAP); - $csr['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey'] = "-----BEGIN PUBLIC KEY-----\r\n" . \chunk_split(\base64_encode($key), 64) . "-----END PUBLIC KEY-----"; + $csr['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey'] = + "-----BEGIN PUBLIC KEY-----\r\n" . + chunk_split(base64_encode($key), 64) . + "-----END PUBLIC KEY-----"; + $this->currentKeyIdentifier = null; $this->currentCert = $csr; + $this->publicKey = null; $this->publicKey = $this->getPublicKey(); + return $csr; } + /** * Save CSR request * @@ -2018,30 +2253,39 @@ public function loadCSR($csr, $mode = self::FORMAT_AUTO_DETECT) */ public function saveCSR(array $csr, $format = self::FORMAT_PEM) { - if (!\is_array($csr) || !isset($csr['certificationRequestInfo'])) { - return \false; + if (!is_array($csr) || !isset($csr['certificationRequestInfo'])) { + return false; } - switch (\true) { + + switch (true) { case !($algorithm = $this->subArray($csr, 'certificationRequestInfo/subjectPKInfo/algorithm/algorithm')): - case \is_object($csr['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey']): + case is_object($csr['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey']): break; default: - $csr['certificationRequestInfo']['subjectPKInfo'] = new Element(\base64_decode(\preg_replace('#-.+-|[\\r\\n]#', '', $csr['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey']))); + $csr['certificationRequestInfo']['subjectPKInfo'] = new Element( + base64_decode(preg_replace('#-.+-|[\r\n]#', '', $csr['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey'])) + ); } + $filters = []; - $filters['certificationRequestInfo']['subject']['rdnSequence']['value'] = ['type' => ASN1::TYPE_UTF8_STRING]; + $filters['certificationRequestInfo']['subject']['rdnSequence']['value'] + = ['type' => ASN1::TYPE_UTF8_STRING]; + ASN1::setFilters($filters); + $this->mapOutDNs($csr, 'certificationRequestInfo/subject/rdnSequence'); $this->mapOutAttributes($csr, 'certificationRequestInfo/attributes'); $csr = ASN1::encodeDER($csr, Maps\CertificationRequest::MAP); + switch ($format) { case self::FORMAT_DER: return $csr; // case self::FORMAT_PEM: default: - return "-----BEGIN CERTIFICATE REQUEST-----\r\n" . \chunk_split(Strings::base64_encode($csr), 64) . '-----END CERTIFICATE REQUEST-----'; + return "-----BEGIN CERTIFICATE REQUEST-----\r\n" . chunk_split(Strings::base64_encode($csr), 64) . '-----END CERTIFICATE REQUEST-----'; } } + /** * Load a SPKAC CSR * @@ -2054,45 +2298,61 @@ public function saveCSR(array $csr, $format = self::FORMAT_PEM) */ public function loadSPKAC($spkac) { - if (\is_array($spkac) && isset($spkac['publicKeyAndChallenge'])) { + if (is_array($spkac) && isset($spkac['publicKeyAndChallenge'])) { unset($this->currentCert); unset($this->currentKeyIdentifier); unset($this->signatureSubject); $this->currentCert = $spkac; return $spkac; } + // see http://www.w3.org/html/wg/drafts/html/master/forms.html#signedpublickeyandchallenge + // OpenSSL produces SPKAC's that are preceded by the string SPKAC= - $temp = \preg_replace('#(?:SPKAC=)|[ \\r\\n\\\\]#', '', $spkac); - $temp = \preg_match('#^[a-zA-Z\\d/+]*={0,2}$#', $temp) ? Strings::base64_decode($temp) : \false; - if ($temp != \false) { + $temp = preg_replace('#(?:SPKAC=)|[ \r\n\\\]#', '', $spkac); + $temp = preg_match('#^[a-zA-Z\d/+]*={0,2}$#', $temp) ? Strings::base64_decode($temp) : false; + if ($temp != false) { $spkac = $temp; } $orig = $spkac; - if ($spkac === \false) { - $this->currentCert = \false; - return \false; + + if ($spkac === false) { + $this->currentCert = false; + return false; } + $decoded = ASN1::decodeBER($spkac); + if (!$decoded) { - $this->currentCert = \false; - return \false; + $this->currentCert = false; + return false; } + $spkac = ASN1::asn1map($decoded[0], Maps\SignedPublicKeyAndChallenge::MAP); - if (!isset($spkac) || !\is_array($spkac)) { - $this->currentCert = \false; - return \false; + + if (!isset($spkac) || !is_array($spkac)) { + $this->currentCert = false; + return false; } - $this->signatureSubject = \substr($orig, $decoded[0]['content'][0]['start'], $decoded[0]['content'][0]['length']); + + $this->signatureSubject = substr($orig, $decoded[0]['content'][0]['start'], $decoded[0]['content'][0]['length']); + $key = $spkac['publicKeyAndChallenge']['spki']; $key = ASN1::encodeDER($key, Maps\SubjectPublicKeyInfo::MAP); - $spkac['publicKeyAndChallenge']['spki']['subjectPublicKey'] = "-----BEGIN PUBLIC KEY-----\r\n" . \chunk_split(\base64_encode($key), 64) . "-----END PUBLIC KEY-----"; + $spkac['publicKeyAndChallenge']['spki']['subjectPublicKey'] = + "-----BEGIN PUBLIC KEY-----\r\n" . + chunk_split(base64_encode($key), 64) . + "-----END PUBLIC KEY-----"; + $this->currentKeyIdentifier = null; $this->currentCert = $spkac; + $this->publicKey = null; $this->publicKey = $this->getPublicKey(); + return $spkac; } + /** * Save a SPKAC CSR request * @@ -2102,18 +2362,23 @@ public function loadSPKAC($spkac) */ public function saveSPKAC(array $spkac, $format = self::FORMAT_PEM) { - if (!\is_array($spkac) || !isset($spkac['publicKeyAndChallenge'])) { - return \false; + if (!is_array($spkac) || !isset($spkac['publicKeyAndChallenge'])) { + return false; } + $algorithm = $this->subArray($spkac, 'publicKeyAndChallenge/spki/algorithm/algorithm'); - switch (\true) { + switch (true) { case !$algorithm: - case \is_object($spkac['publicKeyAndChallenge']['spki']['subjectPublicKey']): + case is_object($spkac['publicKeyAndChallenge']['spki']['subjectPublicKey']): break; default: - $spkac['publicKeyAndChallenge']['spki'] = new Element(\base64_decode(\preg_replace('#-.+-|[\\r\\n]#', '', $spkac['publicKeyAndChallenge']['spki']['subjectPublicKey']))); + $spkac['publicKeyAndChallenge']['spki'] = new Element( + base64_decode(preg_replace('#-.+-|[\r\n]#', '', $spkac['publicKeyAndChallenge']['spki']['subjectPublicKey'])) + ); } + $spkac = ASN1::encodeDER($spkac, Maps\SignedPublicKeyAndChallenge::MAP); + switch ($format) { case self::FORMAT_DER: return $spkac; @@ -2124,62 +2389,73 @@ public function saveSPKAC(array $spkac, $format = self::FORMAT_PEM) return 'SPKAC=' . Strings::base64_encode($spkac); } } + /** * Load a Certificate Revocation List * - * @param string|array $crl + * @param string $crl * @param int $mode * @return mixed */ public function loadCRL($crl, $mode = self::FORMAT_AUTO_DETECT) { - if (\is_array($crl) && isset($crl['tbsCertList'])) { + if (is_array($crl) && isset($crl['tbsCertList'])) { $this->currentCert = $crl; unset($this->signatureSubject); return $crl; } + if ($mode != self::FORMAT_DER) { $newcrl = ASN1::extractBER($crl); if ($mode == self::FORMAT_PEM && $crl == $newcrl) { - return \false; + return false; } $crl = $newcrl; } $orig = $crl; - if ($crl === \false) { - $this->currentCert = \false; - return \false; + + if ($crl === false) { + $this->currentCert = false; + return false; } + $decoded = ASN1::decodeBER($crl); + if (!$decoded) { - $this->currentCert = \false; - return \false; + $this->currentCert = false; + return false; } + $crl = ASN1::asn1map($decoded[0], Maps\CertificateList::MAP); - if (!isset($crl) || $crl === \false) { - $this->currentCert = \false; - return \false; + if (!isset($crl) || $crl === false) { + $this->currentCert = false; + return false; } - $this->signatureSubject = \substr($orig, $decoded[0]['content'][0]['start'], $decoded[0]['content'][0]['length']); + + $this->signatureSubject = substr($orig, $decoded[0]['content'][0]['start'], $decoded[0]['content'][0]['length']); + $this->mapInDNs($crl, 'tbsCertList/issuer/rdnSequence'); if ($this->isSubArrayValid($crl, 'tbsCertList/crlExtensions')) { $this->mapInExtensions($crl, 'tbsCertList/crlExtensions'); } if ($this->isSubArrayValid($crl, 'tbsCertList/revokedCertificates')) { - $rclist_ref =& $this->subArrayUnchecked($crl, 'tbsCertList/revokedCertificates'); + $rclist_ref = &$this->subArrayUnchecked($crl, 'tbsCertList/revokedCertificates'); if ($rclist_ref) { $rclist = $crl['tbsCertList']['revokedCertificates']; foreach ($rclist as $i => $extension) { - if ($this->isSubArrayValid($rclist, "{$i}/crlEntryExtensions")) { - $this->mapInExtensions($rclist_ref, "{$i}/crlEntryExtensions"); + if ($this->isSubArrayValid($rclist, "$i/crlEntryExtensions")) { + $this->mapInExtensions($rclist_ref, "$i/crlEntryExtensions"); } } } } + $this->currentKeyIdentifier = null; $this->currentCert = $crl; + return $crl; } + /** * Save Certificate Revocation List. * @@ -2189,37 +2465,50 @@ public function loadCRL($crl, $mode = self::FORMAT_AUTO_DETECT) */ public function saveCRL(array $crl, $format = self::FORMAT_PEM) { - if (!\is_array($crl) || !isset($crl['tbsCertList'])) { - return \false; + if (!is_array($crl) || !isset($crl['tbsCertList'])) { + return false; } + $filters = []; - $filters['tbsCertList']['issuer']['rdnSequence']['value'] = ['type' => ASN1::TYPE_UTF8_STRING]; - $filters['tbsCertList']['signature']['parameters'] = ['type' => ASN1::TYPE_UTF8_STRING]; - $filters['signatureAlgorithm']['parameters'] = ['type' => ASN1::TYPE_UTF8_STRING]; + $filters['tbsCertList']['issuer']['rdnSequence']['value'] + = ['type' => ASN1::TYPE_UTF8_STRING]; + $filters['tbsCertList']['signature']['parameters'] + = ['type' => ASN1::TYPE_UTF8_STRING]; + $filters['signatureAlgorithm']['parameters'] + = ['type' => ASN1::TYPE_UTF8_STRING]; + if (empty($crl['tbsCertList']['signature']['parameters'])) { - $filters['tbsCertList']['signature']['parameters'] = ['type' => ASN1::TYPE_NULL]; + $filters['tbsCertList']['signature']['parameters'] + = ['type' => ASN1::TYPE_NULL]; } + if (empty($crl['signatureAlgorithm']['parameters'])) { - $filters['signatureAlgorithm']['parameters'] = ['type' => ASN1::TYPE_NULL]; + $filters['signatureAlgorithm']['parameters'] + = ['type' => ASN1::TYPE_NULL]; } + ASN1::setFilters($filters); + $this->mapOutDNs($crl, 'tbsCertList/issuer/rdnSequence'); $this->mapOutExtensions($crl, 'tbsCertList/crlExtensions'); - $rclist =& $this->subArray($crl, 'tbsCertList/revokedCertificates'); - if (\is_array($rclist)) { + $rclist = &$this->subArray($crl, 'tbsCertList/revokedCertificates'); + if (is_array($rclist)) { foreach ($rclist as $i => $extension) { - $this->mapOutExtensions($rclist, "{$i}/crlEntryExtensions"); + $this->mapOutExtensions($rclist, "$i/crlEntryExtensions"); } } + $crl = ASN1::encodeDER($crl, Maps\CertificateList::MAP); + switch ($format) { case self::FORMAT_DER: return $crl; // case self::FORMAT_PEM: default: - return "-----BEGIN X509 CRL-----\r\n" . \chunk_split(Strings::base64_encode($crl), 64) . '-----END X509 CRL-----'; + return "-----BEGIN X509 CRL-----\r\n" . chunk_split(Strings::base64_encode($crl), 64) . '-----END X509 CRL-----'; } } + /** * Helper function to build a time field according to RFC 3280 section * - 4.1.2.5 Validity @@ -2237,14 +2526,14 @@ private function timeField($date) return $date; } $dateObj = new \DateTimeImmutable($date, new \DateTimeZone('GMT')); - $year = $dateObj->format('Y'); - // the same way ASN1.php parses this + $year = $dateObj->format('Y'); // the same way ASN1.php parses this if ($year < 2050) { return ['utcTime' => $date]; } else { return ['generalTime' => $date]; } } + /** * Sign an X.509 certificate * @@ -2256,19 +2545,23 @@ private function timeField($date) */ public function sign(X509 $issuer, X509 $subject) { - if (!\is_object($issuer->privateKey) || empty($issuer->dn)) { - return \false; + if (!is_object($issuer->privateKey) || empty($issuer->dn)) { + return false; } + if (isset($subject->publicKey) && !($subjectPublicKey = $subject->formatSubjectPublicKey())) { - return \false; + return false; } + $currentCert = isset($this->currentCert) ? $this->currentCert : null; $signatureSubject = isset($this->signatureSubject) ? $this->signatureSubject : null; $signatureAlgorithm = self::identifySignatureAlgorithm($issuer->privateKey); - if (isset($subject->currentCert) && \is_array($subject->currentCert) && isset($subject->currentCert['tbsCertificate'])) { + + if (isset($subject->currentCert) && is_array($subject->currentCert) && isset($subject->currentCert['tbsCertificate'])) { $this->currentCert = $subject->currentCert; $this->currentCert['tbsCertificate']['signature'] = $signatureAlgorithm; $this->currentCert['signatureAlgorithm'] = $signatureAlgorithm; + if (!empty($this->startDate)) { $this->currentCert['tbsCertificate']['validity']['notBefore'] = $this->timeField($this->startDate); } @@ -2288,111 +2581,145 @@ public function sign(X509 $issuer, X509 $subject) if (isset($subject->domains)) { $this->removeExtension('id-ce-subjectAltName'); } - } elseif (isset($subject->currentCert) && \is_array($subject->currentCert) && isset($subject->currentCert['tbsCertList'])) { - return \false; + } elseif (isset($subject->currentCert) && is_array($subject->currentCert) && isset($subject->currentCert['tbsCertList'])) { + return false; } else { if (!isset($subject->publicKey)) { - return \false; + return false; } - $startDate = new \DateTimeImmutable('now', new \DateTimeZone(@\date_default_timezone_get())); + + $startDate = new \DateTimeImmutable('now', new \DateTimeZone(@date_default_timezone_get())); $startDate = !empty($this->startDate) ? $this->startDate : $startDate->format('D, d M Y H:i:s O'); - $endDate = new \DateTimeImmutable('+1 year', new \DateTimeZone(@\date_default_timezone_get())); + + $endDate = new \DateTimeImmutable('+1 year', new \DateTimeZone(@date_default_timezone_get())); $endDate = !empty($this->endDate) ? $this->endDate : $endDate->format('D, d M Y H:i:s O'); + /* "The serial number MUST be a positive integer" - "Conforming CAs MUST NOT use serialNumber values longer than 20 octets." - -- https://tools.ietf.org/html/rfc5280#section-4.1.2.2 - - for the integer to be positive the leading bit needs to be 0 hence the - application of a bitmap - */ - $serialNumber = !empty($this->serialNumber) ? $this->serialNumber : new BigInteger(Random::string(20) & "" . \str_repeat("\xff", 19), 256); - $this->currentCert = ['tbsCertificate' => [ - 'version' => 'v3', - 'serialNumber' => $serialNumber, - // $this->setSerialNumber() - 'signature' => $signatureAlgorithm, - 'issuer' => \false, - // this is going to be overwritten later - 'validity' => [ - 'notBefore' => $this->timeField($startDate), - // $this->setStartDate() - 'notAfter' => $this->timeField($endDate), - ], - 'subject' => $subject->dn, - 'subjectPublicKeyInfo' => $subjectPublicKey, - ], 'signatureAlgorithm' => $signatureAlgorithm, 'signature' => \false]; + "Conforming CAs MUST NOT use serialNumber values longer than 20 octets." + -- https://tools.ietf.org/html/rfc5280#section-4.1.2.2 + + for the integer to be positive the leading bit needs to be 0 hence the + application of a bitmap + */ + $serialNumber = !empty($this->serialNumber) ? + $this->serialNumber : + new BigInteger(Random::string(20) & ("\x7F" . str_repeat("\xFF", 19)), 256); + + $this->currentCert = [ + 'tbsCertificate' => + [ + 'version' => 'v3', + 'serialNumber' => $serialNumber, // $this->setSerialNumber() + 'signature' => $signatureAlgorithm, + 'issuer' => false, // this is going to be overwritten later + 'validity' => [ + 'notBefore' => $this->timeField($startDate), // $this->setStartDate() + 'notAfter' => $this->timeField($endDate) // $this->setEndDate() + ], + 'subject' => $subject->dn, + 'subjectPublicKeyInfo' => $subjectPublicKey + ], + 'signatureAlgorithm' => $signatureAlgorithm, + 'signature' => false // this is going to be overwritten later + ]; + // Copy extensions from CSR. $csrexts = $subject->getAttribute('pkcs-9-at-extensionRequest', 0); + if (!empty($csrexts)) { $this->currentCert['tbsCertificate']['extensions'] = $csrexts; } } + $this->currentCert['tbsCertificate']['issuer'] = $issuer->dn; + if (isset($issuer->currentKeyIdentifier)) { $this->setExtension('id-ce-authorityKeyIdentifier', [ - //'authorityCertIssuer' => array( - // array( - // 'directoryName' => $issuer->dn - // ) - //), - 'keyIdentifier' => $issuer->currentKeyIdentifier, - ]); + //'authorityCertIssuer' => array( + // array( + // 'directoryName' => $issuer->dn + // ) + //), + 'keyIdentifier' => $issuer->currentKeyIdentifier + ]); //$extensions = &$this->currentCert['tbsCertificate']['extensions']; //if (isset($issuer->serialNumber)) { // $extensions[count($extensions) - 1]['authorityCertSerialNumber'] = $issuer->serialNumber; //} //unset($extensions); } + if (isset($subject->currentKeyIdentifier)) { $this->setExtension('id-ce-subjectKeyIdentifier', $subject->currentKeyIdentifier); } + $altName = []; - if (isset($subject->domains) && \count($subject->domains)) { - $altName = \array_map(['\\OCA\\Libresign\\Vendor\\phpseclib3\\File\\X509', 'dnsName'], $subject->domains); + + if (isset($subject->domains) && count($subject->domains)) { + $altName = array_map(['\phpseclib3\File\X509', 'dnsName'], $subject->domains); } - if (isset($subject->ipAddresses) && \count($subject->ipAddresses)) { + + if (isset($subject->ipAddresses) && count($subject->ipAddresses)) { // should an IP address appear as the CN if no domain name is specified? idk //$ips = count($subject->domains) ? $subject->ipAddresses : array_slice($subject->ipAddresses, 1); $ipAddresses = []; foreach ($subject->ipAddresses as $ipAddress) { $encoded = $subject->ipAddress($ipAddress); - if ($encoded !== \false) { + if ($encoded !== false) { $ipAddresses[] = $encoded; } } - if (\count($ipAddresses)) { - $altName = \array_merge($altName, $ipAddresses); + if (count($ipAddresses)) { + $altName = array_merge($altName, $ipAddresses); } } + if (!empty($altName)) { $this->setExtension('id-ce-subjectAltName', $altName); } + if ($this->caFlag) { $keyUsage = $this->getExtension('id-ce-keyUsage'); if (!$keyUsage) { $keyUsage = []; } - $this->setExtension('id-ce-keyUsage', \array_values(\array_unique(\array_merge($keyUsage, ['cRLSign', 'keyCertSign'])))); + + $this->setExtension( + 'id-ce-keyUsage', + array_values(array_unique(array_merge($keyUsage, ['cRLSign', 'keyCertSign']))) + ); + $basicConstraints = $this->getExtension('id-ce-basicConstraints'); if (!$basicConstraints) { $basicConstraints = []; } - $this->setExtension('id-ce-basicConstraints', \array_merge(['cA' => \true], $basicConstraints), \true); + + $this->setExtension( + 'id-ce-basicConstraints', + array_merge(['cA' => true], $basicConstraints), + true + ); + if (!isset($subject->currentKeyIdentifier)) { - $this->setExtension('id-ce-subjectKeyIdentifier', $this->computeKeyIdentifier($this->currentCert), \false, \false); + $this->setExtension('id-ce-subjectKeyIdentifier', $this->computeKeyIdentifier($this->currentCert), false, false); } } + // resync $this->signatureSubject // save $tbsCertificate in case there are any \phpseclib3\File\ASN1\Element objects in it $tbsCertificate = $this->currentCert['tbsCertificate']; $this->loadX509($this->saveX509($this->currentCert)); + $result = $this->currentCert; - $this->currentCert['signature'] = $result['signature'] = "\x00" . $issuer->privateKey->sign($this->signatureSubject); + $this->currentCert['signature'] = $result['signature'] = "\0" . $issuer->privateKey->sign($this->signatureSubject); $result['tbsCertificate'] = $tbsCertificate; + $this->currentCert = $currentCert; $this->signatureSubject = $signatureSubject; + return $result; } + /** * Sign a CSR * @@ -2400,36 +2727,54 @@ public function sign(X509 $issuer, X509 $subject) */ public function signCSR() { - if (!\is_object($this->privateKey) || empty($this->dn)) { - return \false; + if (!is_object($this->privateKey) || empty($this->dn)) { + return false; } + $origPublicKey = $this->publicKey; $this->publicKey = $this->privateKey->getPublicKey(); $publicKey = $this->formatSubjectPublicKey(); $this->publicKey = $origPublicKey; + $currentCert = isset($this->currentCert) ? $this->currentCert : null; $signatureSubject = isset($this->signatureSubject) ? $this->signatureSubject : null; $signatureAlgorithm = self::identifySignatureAlgorithm($this->privateKey); - if (isset($this->currentCert) && \is_array($this->currentCert) && isset($this->currentCert['certificationRequestInfo'])) { + + if (isset($this->currentCert) && is_array($this->currentCert) && isset($this->currentCert['certificationRequestInfo'])) { $this->currentCert['signatureAlgorithm'] = $signatureAlgorithm; if (!empty($this->dn)) { $this->currentCert['certificationRequestInfo']['subject'] = $this->dn; } $this->currentCert['certificationRequestInfo']['subjectPKInfo'] = $publicKey; } else { - $this->currentCert = ['certificationRequestInfo' => ['version' => 'v1', 'subject' => $this->dn, 'subjectPKInfo' => $publicKey, 'attributes' => []], 'signatureAlgorithm' => $signatureAlgorithm, 'signature' => \false]; + $this->currentCert = [ + 'certificationRequestInfo' => + [ + 'version' => 'v1', + 'subject' => $this->dn, + 'subjectPKInfo' => $publicKey, + 'attributes' => [] + ], + 'signatureAlgorithm' => $signatureAlgorithm, + 'signature' => false // this is going to be overwritten later + ]; } + // resync $this->signatureSubject // save $certificationRequestInfo in case there are any \phpseclib3\File\ASN1\Element objects in it $certificationRequestInfo = $this->currentCert['certificationRequestInfo']; $this->loadCSR($this->saveCSR($this->currentCert)); + $result = $this->currentCert; - $this->currentCert['signature'] = $result['signature'] = "\x00" . $this->privateKey->sign($this->signatureSubject); + $this->currentCert['signature'] = $result['signature'] = "\0" . $this->privateKey->sign($this->signatureSubject); $result['certificationRequestInfo'] = $certificationRequestInfo; + $this->currentCert = $currentCert; $this->signatureSubject = $signatureSubject; + return $result; } + /** * Sign a SPKAC * @@ -2437,46 +2782,59 @@ public function signCSR() */ public function signSPKAC() { - if (!\is_object($this->privateKey)) { - return \false; + if (!is_object($this->privateKey)) { + return false; } + $origPublicKey = $this->publicKey; $this->publicKey = $this->privateKey->getPublicKey(); $publicKey = $this->formatSubjectPublicKey(); $this->publicKey = $origPublicKey; + $currentCert = isset($this->currentCert) ? $this->currentCert : null; $signatureSubject = isset($this->signatureSubject) ? $this->signatureSubject : null; $signatureAlgorithm = self::identifySignatureAlgorithm($this->privateKey); + // re-signing a SPKAC seems silly but since everything else supports re-signing why not? - if (isset($this->currentCert) && \is_array($this->currentCert) && isset($this->currentCert['publicKeyAndChallenge'])) { + if (isset($this->currentCert) && is_array($this->currentCert) && isset($this->currentCert['publicKeyAndChallenge'])) { $this->currentCert['signatureAlgorithm'] = $signatureAlgorithm; $this->currentCert['publicKeyAndChallenge']['spki'] = $publicKey; if (!empty($this->challenge)) { // the bitwise AND ensures that the output is a valid IA5String - $this->currentCert['publicKeyAndChallenge']['challenge'] = $this->challenge & \str_repeat("", \strlen($this->challenge)); + $this->currentCert['publicKeyAndChallenge']['challenge'] = $this->challenge & str_repeat("\x7F", strlen($this->challenge)); } } else { - $this->currentCert = ['publicKeyAndChallenge' => [ - 'spki' => $publicKey, - // quoting , - // "A challenge string that is submitted along with the public key. Defaults to an empty string if not specified." - // both Firefox and OpenSSL ("openssl spkac -key private.key") behave this way - // we could alternatively do this instead if we ignored the specs: - // Random::string(8) & str_repeat("\x7F", 8) - 'challenge' => !empty($this->challenge) ? $this->challenge : '', - ], 'signatureAlgorithm' => $signatureAlgorithm, 'signature' => \false]; + $this->currentCert = [ + 'publicKeyAndChallenge' => + [ + 'spki' => $publicKey, + // quoting , + // "A challenge string that is submitted along with the public key. Defaults to an empty string if not specified." + // both Firefox and OpenSSL ("openssl spkac -key private.key") behave this way + // we could alternatively do this instead if we ignored the specs: + // Random::string(8) & str_repeat("\x7F", 8) + 'challenge' => !empty($this->challenge) ? $this->challenge : '' + ], + 'signatureAlgorithm' => $signatureAlgorithm, + 'signature' => false // this is going to be overwritten later + ]; } + // resync $this->signatureSubject // save $publicKeyAndChallenge in case there are any \phpseclib3\File\ASN1\Element objects in it $publicKeyAndChallenge = $this->currentCert['publicKeyAndChallenge']; $this->loadSPKAC($this->saveSPKAC($this->currentCert)); + $result = $this->currentCert; - $this->currentCert['signature'] = $result['signature'] = "\x00" . $this->privateKey->sign($this->signatureSubject); + $this->currentCert['signature'] = $result['signature'] = "\0" . $this->privateKey->sign($this->signatureSubject); $result['publicKeyAndChallenge'] = $publicKeyAndChallenge; + $this->currentCert = $currentCert; $this->signatureSubject = $signatureSubject; + return $result; } + /** * Sign a CRL * @@ -2486,36 +2844,45 @@ public function signSPKAC() */ public function signCRL(X509 $issuer, X509 $crl) { - if (!\is_object($issuer->privateKey) || empty($issuer->dn)) { - return \false; + if (!is_object($issuer->privateKey) || empty($issuer->dn)) { + return false; } + $currentCert = isset($this->currentCert) ? $this->currentCert : null; $signatureSubject = isset($this->signatureSubject) ? $this->signatureSubject : null; $signatureAlgorithm = self::identifySignatureAlgorithm($issuer->privateKey); - $thisUpdate = new \DateTimeImmutable('now', new \DateTimeZone(@\date_default_timezone_get())); + + $thisUpdate = new \DateTimeImmutable('now', new \DateTimeZone(@date_default_timezone_get())); $thisUpdate = !empty($this->startDate) ? $this->startDate : $thisUpdate->format('D, d M Y H:i:s O'); - if (isset($crl->currentCert) && \is_array($crl->currentCert) && isset($crl->currentCert['tbsCertList'])) { + + if (isset($crl->currentCert) && is_array($crl->currentCert) && isset($crl->currentCert['tbsCertList'])) { $this->currentCert = $crl->currentCert; $this->currentCert['tbsCertList']['signature'] = $signatureAlgorithm; $this->currentCert['signatureAlgorithm'] = $signatureAlgorithm; } else { - $this->currentCert = ['tbsCertList' => [ - 'version' => 'v2', - 'signature' => $signatureAlgorithm, - 'issuer' => \false, - // this is going to be overwritten later - 'thisUpdate' => $this->timeField($thisUpdate), - ], 'signatureAlgorithm' => $signatureAlgorithm, 'signature' => \false]; - } - $tbsCertList =& $this->currentCert['tbsCertList']; + $this->currentCert = [ + 'tbsCertList' => + [ + 'version' => 'v2', + 'signature' => $signatureAlgorithm, + 'issuer' => false, // this is going to be overwritten later + 'thisUpdate' => $this->timeField($thisUpdate) // $this->setStartDate() + ], + 'signatureAlgorithm' => $signatureAlgorithm, + 'signature' => false // this is going to be overwritten later + ]; + } + + $tbsCertList = &$this->currentCert['tbsCertList']; $tbsCertList['issuer'] = $issuer->dn; $tbsCertList['thisUpdate'] = $this->timeField($thisUpdate); + if (!empty($this->endDate)) { - $tbsCertList['nextUpdate'] = $this->timeField($this->endDate); - // $this->setEndDate() + $tbsCertList['nextUpdate'] = $this->timeField($this->endDate); // $this->setEndDate() } else { unset($tbsCertList['nextUpdate']); } + if (!empty($this->serialNumber)) { $crlNumber = $this->serialNumber; } else { @@ -2525,69 +2892,80 @@ public function signCRL(X509 $issuer, X509 $crl) // CRL issuer. This extension allows users to easily determine when a // particular CRL supersedes another CRL." // -- https://tools.ietf.org/html/rfc5280#section-5.2.3 - $crlNumber = $crlNumber !== \false ? $crlNumber->add(new BigInteger(1)) : null; + $crlNumber = $crlNumber !== false ? $crlNumber->add(new BigInteger(1)) : null; } + $this->removeExtension('id-ce-authorityKeyIdentifier'); $this->removeExtension('id-ce-issuerAltName'); + // Be sure version >= v2 if some extension found. $version = isset($tbsCertList['version']) ? $tbsCertList['version'] : 0; if (!$version) { if (!empty($tbsCertList['crlExtensions'])) { - $version = 'v2'; - // v2. + $version = 'v2'; // v2. } elseif (!empty($tbsCertList['revokedCertificates'])) { foreach ($tbsCertList['revokedCertificates'] as $cert) { if (!empty($cert['crlEntryExtensions'])) { - $version = 'v2'; - // v2. + $version = 'v2'; // v2. } } } + if ($version) { $tbsCertList['version'] = $version; } } + // Store additional extensions. - if (!empty($tbsCertList['version'])) { - // At least v2. + if (!empty($tbsCertList['version'])) { // At least v2. if (!empty($crlNumber)) { $this->setExtension('id-ce-cRLNumber', $crlNumber); } + if (isset($issuer->currentKeyIdentifier)) { $this->setExtension('id-ce-authorityKeyIdentifier', [ - //'authorityCertIssuer' => array( - // ] - // 'directoryName' => $issuer->dn - // ] - //), - 'keyIdentifier' => $issuer->currentKeyIdentifier, - ]); + //'authorityCertIssuer' => array( + // ] + // 'directoryName' => $issuer->dn + // ] + //), + 'keyIdentifier' => $issuer->currentKeyIdentifier + ]); //$extensions = &$tbsCertList['crlExtensions']; //if (isset($issuer->serialNumber)) { // $extensions[count($extensions) - 1]['authorityCertSerialNumber'] = $issuer->serialNumber; //} //unset($extensions); } + $issuerAltName = $this->getExtension('id-ce-subjectAltName', $issuer->currentCert); - if ($issuerAltName !== \false) { + + if ($issuerAltName !== false) { $this->setExtension('id-ce-issuerAltName', $issuerAltName); } } + if (empty($tbsCertList['revokedCertificates'])) { unset($tbsCertList['revokedCertificates']); } + unset($tbsCertList); + // resync $this->signatureSubject // save $tbsCertList in case there are any \phpseclib3\File\ASN1\Element objects in it $tbsCertList = $this->currentCert['tbsCertList']; $this->loadCRL($this->saveCRL($this->currentCert)); + $result = $this->currentCert; - $this->currentCert['signature'] = $result['signature'] = "\x00" . $issuer->privateKey->sign($this->signatureSubject); + $this->currentCert['signature'] = $result['signature'] = "\0" . $issuer->privateKey->sign($this->signatureSubject); $result['tbsCertList'] = $tbsCertList; + $this->currentCert = $currentCert; $this->signatureSubject = $signatureSubject; + return $result; } + /** * Identify signature algorithm from key settings * @@ -2600,7 +2978,10 @@ private static function identifySignatureAlgorithm(PrivateKey $key) if ($key instanceof RSA) { if ($key->getPadding() & RSA::SIGNATURE_PSS) { $r = PSS::load($key->withPassword()->toString('PSS')); - return ['algorithm' => 'id-RSASSA-PSS', 'parameters' => PSS::savePSSParams($r)]; + return [ + 'algorithm' => 'id-RSASSA-PSS', + 'parameters' => PSS::savePSSParams($r) + ]; } switch ($key->getHash()) { case 'md2': @@ -2610,10 +2991,14 @@ private static function identifySignatureAlgorithm(PrivateKey $key) case 'sha256': case 'sha384': case 'sha512': - return ['algorithm' => $key->getHash() . 'WithRSAEncryption', 'parameters' => null]; + return [ + 'algorithm' => $key->getHash() . 'WithRSAEncryption', + 'parameters' => null + ]; } throw new UnsupportedAlgorithmException('The only supported hash algorithms for RSA are: md2, md5, sha1, sha224, sha256, sha384, sha512'); } + if ($key instanceof DSA) { switch ($key->getHash()) { case 'sha1': @@ -2623,6 +3008,7 @@ private static function identifySignatureAlgorithm(PrivateKey $key) } throw new UnsupportedAlgorithmException('The only supported hash algorithms for DSA are: sha1, sha224, sha256'); } + if ($key instanceof EC) { switch ($key->getCurve()) { case 'Ed25519': @@ -2635,12 +3021,14 @@ private static function identifySignatureAlgorithm(PrivateKey $key) case 'sha256': case 'sha384': case 'sha512': - return ['algorithm' => 'ecdsa-with-' . \strtoupper($key->getHash())]; + return ['algorithm' => 'ecdsa-with-' . strtoupper($key->getHash())]; } throw new UnsupportedAlgorithmException('The only supported hash algorithms for EC are: sha1, sha224, sha256, sha384, sha512'); } + throw new UnsupportedAlgorithmException('The only supported public key classes are: RSA, DSA, EC'); } + /** * Set certificate start date * @@ -2648,11 +3036,13 @@ private static function identifySignatureAlgorithm(PrivateKey $key) */ public function setStartDate($date) { - if (!\is_object($date) || !$date instanceof \DateTimeInterface) { - $date = new \DateTimeImmutable($date, new \DateTimeZone(@\date_default_timezone_get())); + if (!is_object($date) || !($date instanceof \DateTimeInterface)) { + $date = new \DateTimeImmutable($date, new \DateTimeZone(@date_default_timezone_get())); } + $this->startDate = $date->format('D, d M Y H:i:s O'); } + /** * Set certificate end date * @@ -2664,20 +3054,22 @@ public function setEndDate($date) To indicate that a certificate has no well-defined expiration date, the notAfter SHOULD be assigned the GeneralizedTime value of 99991231235959Z. - + -- http://tools.ietf.org/html/rfc5280#section-4.1.2.5 */ - if (\is_string($date) && \strtolower($date) === 'lifetime') { + if (is_string($date) && strtolower($date) === 'lifetime') { $temp = '99991231235959Z'; - $temp = \chr(ASN1::TYPE_GENERALIZED_TIME) . ASN1::encodeLength(\strlen($temp)) . $temp; + $temp = chr(ASN1::TYPE_GENERALIZED_TIME) . ASN1::encodeLength(strlen($temp)) . $temp; $this->endDate = new Element($temp); } else { - if (!\is_object($date) || !$date instanceof \DateTimeInterface) { - $date = new \DateTimeImmutable($date, new \DateTimeZone(@\date_default_timezone_get())); + if (!is_object($date) || !($date instanceof \DateTimeInterface)) { + $date = new \DateTimeImmutable($date, new \DateTimeZone(@date_default_timezone_get())); } + $this->endDate = $date->format('D, d M Y H:i:s O'); } } + /** * Set Serial Number * @@ -2688,14 +3080,16 @@ public function setSerialNumber($serial, $base = -256) { $this->serialNumber = new BigInteger($serial, $base); } + /** * Turns the certificate into a certificate authority * */ public function makeCA() { - $this->caFlag = \true; + $this->caFlag = true; } + /** * Check for validity of subarray * @@ -2709,20 +3103,25 @@ public function makeCA() */ private function isSubArrayValid(array $root, $path) { - if (!\is_array($root)) { - return \false; + if (!is_array($root)) { + return false; } - foreach (\explode('/', $path) as $i) { - if (!\is_array($root)) { - return \false; + + foreach (explode('/', $path) as $i) { + if (!is_array($root)) { + return false; } + if (!isset($root[$i])) { - return \true; + return true; } + $root = $root[$i]; } - return \true; + + return true; } + /** * Get a reference to a subarray * @@ -2738,20 +3137,25 @@ private function isSubArrayValid(array $root, $path) * @param bool $create optional * @return array|false */ - private function &subArrayUnchecked(array &$root, $path, $create = \false) + private function &subArrayUnchecked(array &$root, $path, $create = false) { - $false = \false; - foreach (\explode('/', $path) as $i) { + $false = false; + + foreach (explode('/', $path) as $i) { if (!isset($root[$i])) { if (!$create) { return $false; } + $root[$i] = []; } - $root =& $root[$i]; + + $root = &$root[$i]; } + return $root; } + /** * Get a reference to a subarray * @@ -2760,26 +3164,33 @@ private function &subArrayUnchecked(array &$root, $path, $create = \false) * @param bool $create optional * @return array|false */ - private function &subArray(&$root, $path, $create = \false) + private function &subArray(&$root, $path, $create = false) { - $false = \false; - if (!\is_array($root)) { + $false = false; + + if (!is_array($root)) { return $false; } - foreach (\explode('/', $path) as $i) { - if (!\is_array($root)) { + + foreach (explode('/', $path) as $i) { + if (!is_array($root)) { return $false; } + if (!isset($root[$i])) { if (!$create) { return $false; } + $root[$i] = []; } - $root =& $root[$i]; + + $root = &$root[$i]; } + return $root; } + /** * Get a reference to an extension subarray * @@ -2788,14 +3199,15 @@ private function &subArray(&$root, $path, $create = \false) * @param bool $create optional * @return array|false */ - private function &extensions(&$root, $path = null, $create = \false) + private function &extensions(&$root, $path = null, $create = false) { if (!isset($root)) { $root = $this->currentCert; } - switch (\true) { + + switch (true) { case !empty($path): - case !\is_array($root): + case !is_array($root): break; case isset($root['tbsCertificate']): $path = 'tbsCertificate/extensions'; @@ -2805,29 +3217,34 @@ private function &extensions(&$root, $path = null, $create = \false) break; case isset($root['certificationRequestInfo']): $pth = 'certificationRequestInfo/attributes'; - $attributes =& $this->subArray($root, $pth, $create); - if (\is_array($attributes)) { + $attributes = &$this->subArray($root, $pth, $create); + + if (is_array($attributes)) { foreach ($attributes as $key => $value) { if ($value['type'] == 'pkcs-9-at-extensionRequest') { - $path = "{$pth}/{$key}/value/0"; + $path = "$pth/$key/value/0"; break 2; } } if ($create) { - $key = \count($attributes); + $key = count($attributes); $attributes[] = ['type' => 'pkcs-9-at-extensionRequest', 'value' => []]; - $path = "{$pth}/{$key}/value/0"; + $path = "$pth/$key/value/0"; } } break; } - $extensions =& $this->subArray($root, $path, $create); - if (!\is_array($extensions)) { - $false = \false; + + $extensions = &$this->subArray($root, $path, $create); + + if (!is_array($extensions)) { + $false = false; return $false; } + return $extensions; } + /** * Remove an Extension * @@ -2837,24 +3254,28 @@ private function &extensions(&$root, $path = null, $create = \false) */ private function removeExtensionHelper($id, $path = null) { - $extensions =& $this->extensions($this->currentCert, $path); - if (!\is_array($extensions)) { - return \false; + $extensions = &$this->extensions($this->currentCert, $path); + + if (!is_array($extensions)) { + return false; } - $result = \false; + + $result = false; foreach ($extensions as $key => $value) { if ($value['extnId'] == $id) { unset($extensions[$key]); - $result = \true; + $result = true; } } - $extensions = \array_values($extensions); + + $extensions = array_values($extensions); // fix for https://bugs.php.net/75433 affecting PHP 7.2 if (!isset($extensions[0])) { - $extensions = \array_splice($extensions, 0, 0); + $extensions = array_splice($extensions, 0, 0); } return $result; } + /** * Get an Extension * @@ -2868,16 +3289,20 @@ private function removeExtensionHelper($id, $path = null) private function getExtensionHelper($id, $cert = null, $path = null) { $extensions = $this->extensions($cert, $path); - if (!\is_array($extensions)) { - return \false; + + if (!is_array($extensions)) { + return false; } + foreach ($extensions as $key => $value) { if ($value['extnId'] == $id) { return $value['extnValue']; } } - return \false; + + return false; } + /** * Returns a list of all extensions in use * @@ -2889,13 +3314,16 @@ private function getExtensionsHelper($cert = null, $path = null) { $exts = $this->extensions($cert, $path); $extensions = []; - if (\is_array($exts)) { + + if (is_array($exts)) { foreach ($exts as $extension) { $extensions[] = $extension['extnId']; } } + return $extensions; } + /** * Set an Extension * @@ -2906,25 +3334,31 @@ private function getExtensionsHelper($cert = null, $path = null) * @param string $path optional * @return bool */ - private function setExtensionHelper($id, $value, $critical = \false, $replace = \true, $path = null) + private function setExtensionHelper($id, $value, $critical = false, $replace = true, $path = null) { - $extensions =& $this->extensions($this->currentCert, $path, \true); - if (!\is_array($extensions)) { - return \false; + $extensions = &$this->extensions($this->currentCert, $path, true); + + if (!is_array($extensions)) { + return false; } - $newext = ['extnId' => $id, 'critical' => $critical, 'extnValue' => $value]; + + $newext = ['extnId' => $id, 'critical' => $critical, 'extnValue' => $value]; + foreach ($extensions as $key => $value) { if ($value['extnId'] == $id) { if (!$replace) { - return \false; + return false; } + $extensions[$key] = $newext; - return \true; + return true; } } + $extensions[] = $newext; - return \true; + return true; } + /** * Remove a certificate, CSR or CRL Extension * @@ -2935,6 +3369,7 @@ public function removeExtension($id) { return $this->removeExtensionHelper($id); } + /** * Get a certificate, CSR or CRL Extension * @@ -2949,6 +3384,7 @@ public function getExtension($id, $cert = null, $path = null) { return $this->getExtensionHelper($id, $cert, $path); } + /** * Returns a list of all extensions in use in certificate, CSR or CRL * @@ -2960,6 +3396,7 @@ public function getExtensions($cert = null, $path = null) { return $this->getExtensionsHelper($cert, $path); } + /** * Set a certificate, CSR or CRL Extension * @@ -2969,10 +3406,11 @@ public function getExtensions($cert = null, $path = null) * @param bool $replace optional * @return bool */ - public function setExtension($id, $value, $critical = \false, $replace = \true) + public function setExtension($id, $value, $critical = false, $replace = true) { return $this->setExtensionHelper($id, $value, $critical, $replace); } + /** * Remove a CSR attribute. * @@ -2982,30 +3420,32 @@ public function setExtension($id, $value, $critical = \false, $replace = \true) */ public function removeAttribute($id, $disposition = self::ATTR_ALL) { - $attributes =& $this->subArray($this->currentCert, 'certificationRequestInfo/attributes'); - if (!\is_array($attributes)) { - return \false; + $attributes = &$this->subArray($this->currentCert, 'certificationRequestInfo/attributes'); + + if (!is_array($attributes)) { + return false; } - $result = \false; + + $result = false; foreach ($attributes as $key => $attribute) { if ($attribute['type'] == $id) { - $n = \count($attribute['value']); - switch (\true) { + $n = count($attribute['value']); + switch (true) { case $disposition == self::ATTR_APPEND: case $disposition == self::ATTR_REPLACE: - return \false; + return false; case $disposition >= $n: $disposition -= $n; break; case $disposition == self::ATTR_ALL: case $n == 1: unset($attributes[$key]); - $result = \true; + $result = true; break; default: unset($attributes[$key]['value'][$disposition]); - $attributes[$key]['value'] = \array_values($attributes[$key]['value']); - $result = \true; + $attributes[$key]['value'] = array_values($attributes[$key]['value']); + $result = true; break; } if ($result && $disposition != self::ATTR_ALL) { @@ -3013,9 +3453,11 @@ public function removeAttribute($id, $disposition = self::ATTR_ALL) } } } - $attributes = \array_values($attributes); + + $attributes = array_values($attributes); return $result; } + /** * Get a CSR attribute * @@ -3031,17 +3473,20 @@ public function getAttribute($id, $disposition = self::ATTR_ALL, $csr = null) if (empty($csr)) { $csr = $this->currentCert; } + $attributes = $this->subArray($csr, 'certificationRequestInfo/attributes'); - if (!\is_array($attributes)) { - return \false; + + if (!is_array($attributes)) { + return false; } + foreach ($attributes as $key => $attribute) { if ($attribute['type'] == $id) { - $n = \count($attribute['value']); - switch (\true) { + $n = count($attribute['value']); + switch (true) { case $disposition == self::ATTR_APPEND: case $disposition == self::ATTR_REPLACE: - return \false; + return false; case $disposition == self::ATTR_ALL: return $attribute['value']; case $disposition >= $n: @@ -3052,8 +3497,10 @@ public function getAttribute($id, $disposition = self::ATTR_ALL, $csr = null) } } } - return \false; + + return false; } + /** * Get all requested CSR extensions * @@ -3067,12 +3514,15 @@ public function getRequestedCertificateExtensions($csr = null) if (empty($csr)) { $csr = $this->currentCert; } + $requestedExtensions = $this->getAttribute('pkcs-9-at-extensionRequest'); - if ($requestedExtensions === \false) { - return \false; + if ($requestedExtensions === false) { + return false; } + return $this->getAttribute('pkcs-9-at-extensionRequest')[0]; } + /** * Returns a list of all CSR attributes in use * @@ -3084,15 +3534,19 @@ public function getAttributes($csr = null) if (empty($csr)) { $csr = $this->currentCert; } + $attributes = $this->subArray($csr, 'certificationRequestInfo/attributes'); $attrs = []; - if (\is_array($attributes)) { + + if (is_array($attributes)) { foreach ($attributes as $attribute) { $attrs[] = $attribute['type']; } } + return $attrs; } + /** * Set a CSR attribute * @@ -3103,22 +3557,25 @@ public function getAttributes($csr = null) */ public function setAttribute($id, $value, $disposition = self::ATTR_ALL) { - $attributes =& $this->subArray($this->currentCert, 'certificationRequestInfo/attributes', \true); - if (!\is_array($attributes)) { - return \false; + $attributes = &$this->subArray($this->currentCert, 'certificationRequestInfo/attributes', true); + + if (!is_array($attributes)) { + return false; } + switch ($disposition) { case self::ATTR_REPLACE: $disposition = self::ATTR_APPEND; - // fall-through + // fall-through case self::ATTR_ALL: $this->removeAttribute($id); break; } + foreach ($attributes as $key => $attribute) { if ($attribute['type'] == $id) { - $n = \count($attribute['value']); - switch (\true) { + $n = count($attribute['value']); + switch (true) { case $disposition == self::ATTR_APPEND: $last = $key; break; @@ -3127,13 +3584,14 @@ public function setAttribute($id, $value, $disposition = self::ATTR_ALL) break; default: $attributes[$key]['value'][$disposition] = $value; - return \true; + return true; } } } - switch (\true) { + + switch (true) { case $disposition >= 0: - return \false; + return false; case isset($last): $attributes[$last]['value'][] = $value; break; @@ -3141,8 +3599,10 @@ public function setAttribute($id, $value, $disposition = self::ATTR_ALL) $attributes[] = ['type' => $id, 'value' => $disposition == self::ATTR_ALL ? $value : [$value]]; break; } - return \true; + + return true; } + /** * Sets the subject key identifier * @@ -3158,6 +3618,7 @@ public function setKeyIdentifier($value) $this->currentKeyIdentifier = $value; } } + /** * Compute a public key identifier. * @@ -3177,36 +3638,35 @@ public function setKeyIdentifier($value) */ public function computeKeyIdentifier($key = null, $method = 1) { - if (\is_null($key)) { + if (is_null($key)) { $key = $this; } - switch (\true) { - case \is_string($key): + + switch (true) { + case is_string($key): break; - case \is_array($key) && isset($key['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey']): + case is_array($key) && isset($key['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey']): return $this->computeKeyIdentifier($key['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey'], $method); - case \is_array($key) && isset($key['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey']): + case is_array($key) && isset($key['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey']): return $this->computeKeyIdentifier($key['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey'], $method); - case !\is_object($key): - return \false; + case !is_object($key): + return false; case $key instanceof Element: // Assume the element is a bitstring-packed key. $decoded = ASN1::decodeBER($key->element); if (!$decoded) { - return \false; + return false; } $raw = ASN1::asn1map($decoded[0], ['type' => ASN1::TYPE_BIT_STRING]); if (empty($raw)) { - return \false; + return false; } // If the key is private, compute identifier from its corresponding public key. $key = PublicKeyLoader::load($raw); - if ($key instanceof PrivateKey) { - // If private. + if ($key instanceof PrivateKey) { // If private. return $this->computeKeyIdentifier($key, $method); } - $key = $raw; - // Is a public key. + $key = $raw; // Is a public key. break; case $key instanceof X509: if (isset($key->publicKey)) { @@ -3218,23 +3678,27 @@ public function computeKeyIdentifier($key = null, $method = 1) if (isset($key->currentCert['tbsCertificate']) || isset($key->currentCert['certificationRequestInfo'])) { return $this->computeKeyIdentifier($key->currentCert, $method); } - return \false; - default: - // Should be a key object (i.e.: \phpseclib3\Crypt\RSA). + return false; + default: // Should be a key object (i.e.: \phpseclib3\Crypt\RSA). $key = $key->getPublicKey(); break; } + // If in PEM format, convert to binary. $key = ASN1::extractBER($key); + // Now we have the key string: compute its sha-1 sum. $hash = new Hash('sha1'); $hash = $hash->hash($key); + if ($method == 2) { - $hash = \substr($hash, -8); - $hash[0] = \chr(\ord($hash[0]) & 0xf | 0x40); + $hash = substr($hash, -8); + $hash[0] = chr((ord($hash[0]) & 0x0F) | 0x40); } + return $hash; } + /** * Format a public key as appropriate * @@ -3242,19 +3706,26 @@ public function computeKeyIdentifier($key = null, $method = 1) */ private function formatSubjectPublicKey() { - $format = $this->publicKey instanceof RSA && $this->publicKey->getPadding() & RSA::SIGNATURE_PSS ? 'PSS' : 'PKCS8'; - $publicKey = \base64_decode(\preg_replace('#-.+-|[\\r\\n]#', '', $this->publicKey->toString($format))); + $format = $this->publicKey instanceof RSA && ($this->publicKey->getPadding() & RSA::SIGNATURE_PSS) ? + 'PSS' : + 'PKCS8'; + + $publicKey = base64_decode(preg_replace('#-.+-|[\r\n]#', '', $this->publicKey->toString($format))); + $decoded = ASN1::decodeBER($publicKey); if (!$decoded) { - return \false; + return false; } $mapped = ASN1::asn1map($decoded[0], Maps\SubjectPublicKeyInfo::MAP); - if (!\is_array($mapped)) { - return \false; + if (!is_array($mapped)) { + return false; } + $mapped['subjectPublicKey'] = $this->publicKey->toString($format); + return $mapped; } + /** * Set the domain name's which the cert is to be valid for * @@ -3267,6 +3738,7 @@ public function setDomain(...$domains) $this->removeDNProp('id-at-commonName'); $this->setDNProp('id-at-commonName', $this->domains[0]); } + /** * Set the IP Addresses's which the cert is to be valid for * @@ -3282,6 +3754,7 @@ public function setIPAddress(...$ipAddresses) } */ } + /** * Helper function to build domain array * @@ -3292,6 +3765,7 @@ private static function dnsName($domain) { return ['dNSName' => $domain]; } + /** * Helper function to build IP Address array * @@ -3304,6 +3778,7 @@ private function iPAddress($address) { return ['iPAddress' => $address]; } + /** * Get the index of a revoked certificate. * @@ -3312,22 +3787,27 @@ private function iPAddress($address) * @param bool $create optional * @return int|false */ - private function revokedCertificate(array &$rclist, $serial, $create = \false) + private function revokedCertificate(array &$rclist, $serial, $create = false) { $serial = new BigInteger($serial); + foreach ($rclist as $i => $rc) { - if (!$serial->compare($rc['userCertificate'])) { + if (!($serial->compare($rc['userCertificate']))) { return $i; } } + if (!$create) { - return \false; + return false; } - $i = \count($rclist); - $revocationDate = new \DateTimeImmutable('now', new \DateTimeZone(@\date_default_timezone_get())); - $rclist[] = ['userCertificate' => $serial, 'revocationDate' => $this->timeField($revocationDate->format('D, d M Y H:i:s O'))]; + + $i = count($rclist); + $revocationDate = new \DateTimeImmutable('now', new \DateTimeZone(@date_default_timezone_get())); + $rclist[] = ['userCertificate' => $serial, + 'revocationDate' => $this->timeField($revocationDate->format('D, d M Y H:i:s O'))]; return $i; } + /** * Revoke a certificate. * @@ -3338,20 +3818,22 @@ private function revokedCertificate(array &$rclist, $serial, $create = \false) public function revoke($serial, $date = null) { if (isset($this->currentCert['tbsCertList'])) { - if (\is_array($rclist =& $this->subArray($this->currentCert, 'tbsCertList/revokedCertificates', \true))) { - if ($this->revokedCertificate($rclist, $serial) === \false) { - // If not yet revoked - if (($i = $this->revokedCertificate($rclist, $serial, \true)) !== \false) { + if (is_array($rclist = &$this->subArray($this->currentCert, 'tbsCertList/revokedCertificates', true))) { + if ($this->revokedCertificate($rclist, $serial) === false) { // If not yet revoked + if (($i = $this->revokedCertificate($rclist, $serial, true)) !== false) { if (!empty($date)) { $rclist[$i]['revocationDate'] = $this->timeField($date); } - return \true; + + return true; } } } } - return \false; + + return false; } + /** * Unrevoke a certificate. * @@ -3360,15 +3842,17 @@ public function revoke($serial, $date = null) */ public function unrevoke($serial) { - if (\is_array($rclist =& $this->subArray($this->currentCert, 'tbsCertList/revokedCertificates'))) { - if (($i = $this->revokedCertificate($rclist, $serial)) !== \false) { + if (is_array($rclist = &$this->subArray($this->currentCert, 'tbsCertList/revokedCertificates'))) { + if (($i = $this->revokedCertificate($rclist, $serial)) !== false) { unset($rclist[$i]); - $rclist = \array_values($rclist); - return \true; + $rclist = array_values($rclist); + return true; } } - return \false; + + return false; } + /** * Get a revoked certificate. * @@ -3377,13 +3861,15 @@ public function unrevoke($serial) */ public function getRevoked($serial) { - if (\is_array($rclist = $this->subArray($this->currentCert, 'tbsCertList/revokedCertificates'))) { - if (($i = $this->revokedCertificate($rclist, $serial)) !== \false) { + if (is_array($rclist = $this->subArray($this->currentCert, 'tbsCertList/revokedCertificates'))) { + if (($i = $this->revokedCertificate($rclist, $serial)) !== false) { return $rclist[$i]; } } - return \false; + + return false; } + /** * List revoked certificates * @@ -3395,17 +3881,22 @@ public function listRevoked($crl = null) if (!isset($crl)) { $crl = $this->currentCert; } + if (!isset($crl['tbsCertList'])) { - return \false; + return false; } + $result = []; - if (\is_array($rclist = $this->subArray($crl, 'tbsCertList/revokedCertificates'))) { + + if (is_array($rclist = $this->subArray($crl, 'tbsCertList/revokedCertificates'))) { foreach ($rclist as $rc) { $result[] = $rc['userCertificate']->toString(); } } + return $result; } + /** * Remove a Revoked Certificate Extension * @@ -3415,13 +3906,15 @@ public function listRevoked($crl = null) */ public function removeRevokedCertificateExtension($serial, $id) { - if (\is_array($rclist =& $this->subArray($this->currentCert, 'tbsCertList/revokedCertificates'))) { - if (($i = $this->revokedCertificate($rclist, $serial)) !== \false) { - return $this->removeExtensionHelper($id, "tbsCertList/revokedCertificates/{$i}/crlEntryExtensions"); + if (is_array($rclist = &$this->subArray($this->currentCert, 'tbsCertList/revokedCertificates'))) { + if (($i = $this->revokedCertificate($rclist, $serial)) !== false) { + return $this->removeExtensionHelper($id, "tbsCertList/revokedCertificates/$i/crlEntryExtensions"); } } - return \false; + + return false; } + /** * Get a Revoked Certificate Extension * @@ -3437,13 +3930,16 @@ public function getRevokedCertificateExtension($serial, $id, $crl = null) if (!isset($crl)) { $crl = $this->currentCert; } - if (\is_array($rclist = $this->subArray($crl, 'tbsCertList/revokedCertificates'))) { - if (($i = $this->revokedCertificate($rclist, $serial)) !== \false) { - return $this->getExtension($id, $crl, "tbsCertList/revokedCertificates/{$i}/crlEntryExtensions"); + + if (is_array($rclist = $this->subArray($crl, 'tbsCertList/revokedCertificates'))) { + if (($i = $this->revokedCertificate($rclist, $serial)) !== false) { + return $this->getExtension($id, $crl, "tbsCertList/revokedCertificates/$i/crlEntryExtensions"); } } - return \false; + + return false; } + /** * Returns a list of all extensions in use for a given revoked certificate * @@ -3456,13 +3952,16 @@ public function getRevokedCertificateExtensions($serial, $crl = null) if (!isset($crl)) { $crl = $this->currentCert; } - if (\is_array($rclist = $this->subArray($crl, 'tbsCertList/revokedCertificates'))) { - if (($i = $this->revokedCertificate($rclist, $serial)) !== \false) { - return $this->getExtensions($crl, "tbsCertList/revokedCertificates/{$i}/crlEntryExtensions"); + + if (is_array($rclist = $this->subArray($crl, 'tbsCertList/revokedCertificates'))) { + if (($i = $this->revokedCertificate($rclist, $serial)) !== false) { + return $this->getExtensions($crl, "tbsCertList/revokedCertificates/$i/crlEntryExtensions"); } } - return \false; + + return false; } + /** * Set a Revoked Certificate Extension * @@ -3473,17 +3972,19 @@ public function getRevokedCertificateExtensions($serial, $crl = null) * @param bool $replace optional * @return bool */ - public function setRevokedCertificateExtension($serial, $id, $value, $critical = \false, $replace = \true) + public function setRevokedCertificateExtension($serial, $id, $value, $critical = false, $replace = true) { if (isset($this->currentCert['tbsCertList'])) { - if (\is_array($rclist =& $this->subArray($this->currentCert, 'tbsCertList/revokedCertificates', \true))) { - if (($i = $this->revokedCertificate($rclist, $serial, \true)) !== \false) { - return $this->setExtensionHelper($id, $value, $critical, $replace, "tbsCertList/revokedCertificates/{$i}/crlEntryExtensions"); + if (is_array($rclist = &$this->subArray($this->currentCert, 'tbsCertList/revokedCertificates', true))) { + if (($i = $this->revokedCertificate($rclist, $serial, true)) !== false) { + return $this->setExtensionHelper($id, $value, $critical, $replace, "tbsCertList/revokedCertificates/$i/crlEntryExtensions"); } } } - return \false; + + return false; } + /** * Register the mapping for a custom/unsupported extension. * @@ -3493,10 +3994,14 @@ public function setRevokedCertificateExtension($serial, $id, $value, $critical = public static function registerExtension($id, array $mapping) { if (isset(self::$extensions[$id]) && self::$extensions[$id] !== $mapping) { - throw new \RuntimeException('Extension ' . $id . ' has already been defined with a different mapping.'); + throw new \RuntimeException( + 'Extension ' . $id . ' has already been defined with a different mapping.' + ); } + self::$extensions[$id] = $mapping; } + /** * Register the mapping for a custom/unsupported extension. * @@ -3508,6 +4013,7 @@ public static function getRegisteredExtension($id) { return isset(self::$extensions[$id]) ? self::$extensions[$id] : null; } + /** * Register the mapping for a custom/unsupported extension. * @@ -3516,8 +4022,8 @@ public static function getRegisteredExtension($id) * @param bool $critical * @param bool $replace */ - public function setExtensionValue($id, $value, $critical = \false, $replace = \false) + public function setExtensionValue($id, $value, $critical = false, $replace = false) { - $this->extensionValues[$id] = \compact('critical', 'replace', 'value'); + $this->extensionValues[$id] = compact('critical', 'replace', 'value'); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger.php index 354cc67..9438ce3 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger.php +++ b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger.php @@ -24,16 +24,17 @@ * @copyright 2017 Jim Wigginton * @license http://www.opensource.org/licenses/mit-license.html MIT License */ + namespace OCA\Libresign\Vendor\phpseclib3\Math; use OCA\Libresign\Vendor\phpseclib3\Exception\BadConfigurationException; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\Engine; + /** * Pure-PHP arbitrary precision integer arithmetic library. Supports base-2, base-10, base-16, and base-256 * numbers. * * @author Jim Wigginton - * @internal */ class BigInteger implements \JsonSerializable { @@ -43,18 +44,21 @@ class BigInteger implements \JsonSerializable * @var class-string */ private static $mainEngine; + /** * Selected Engines * * @var list */ private static $engines; + /** * The actual BigInteger object * * @var object */ private $value; + /** * Mode independent value used for serialization. * @@ -63,6 +67,7 @@ class BigInteger implements \JsonSerializable * @var string */ private $hex; + /** * Precision (used only for serialization) * @@ -71,6 +76,7 @@ class BigInteger implements \JsonSerializable * @var int */ private $precision; + /** * Sets engine type. * @@ -83,29 +89,34 @@ class BigInteger implements \JsonSerializable public static function setEngine($main, array $modexps = ['DefaultEngine']) { self::$engines = []; + $fqmain = '\\OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\' . $main; - if (!\class_exists($fqmain) || !\method_exists($fqmain, 'isValidEngine')) { - throw new \InvalidArgumentException("{$main} is not a valid engine"); + if (!class_exists($fqmain) || !method_exists($fqmain, 'isValidEngine')) { + throw new \InvalidArgumentException("$main is not a valid engine"); } if (!$fqmain::isValidEngine()) { - throw new BadConfigurationException("{$main} is not setup correctly on this system"); + throw new BadConfigurationException("$main is not setup correctly on this system"); } /** @var class-string $fqmain */ self::$mainEngine = $fqmain; - $found = \false; + + $found = false; foreach ($modexps as $modexp) { try { $fqmain::setModExpEngine($modexp); - $found = \true; + $found = true; break; } catch (\Exception $e) { } } + if (!$found) { - throw new BadConfigurationException("No valid modular exponentiation engine found for {$main}"); + throw new BadConfigurationException("No valid modular exponentiation engine found for $main"); } + self::$engines = [$main, $modexp]; } + /** * Returns the engine type * @@ -114,20 +125,30 @@ public static function setEngine($main, array $modexps = ['DefaultEngine']) public static function getEngine() { self::initialize_static_variables(); + return self::$engines; } + /** * Initialize static variables */ private static function initialize_static_variables() { if (!isset(self::$mainEngine)) { - $engines = [['GMP', ['DefaultEngine']], ['PHP64', ['OpenSSL']], ['BCMath', ['OpenSSL']], ['PHP32', ['OpenSSL']], ['PHP64', ['DefaultEngine']], ['PHP32', ['DefaultEngine']]]; + $engines = [ + ['GMP', ['DefaultEngine']], + ['PHP64', ['OpenSSL']], + ['BCMath', ['OpenSSL']], + ['PHP32', ['OpenSSL']], + ['PHP64', ['DefaultEngine']], + ['PHP32', ['DefaultEngine']] + ]; // per https://phpseclib.com/docs/speed PHP 8.4.0+ _significantly_ sped up BCMath - if (\version_compare(\PHP_VERSION, '8.4.0') >= 0) { + if (version_compare(PHP_VERSION, '8.4.0') >= 0) { $engines[1][0] = 'BCMath'; $engines[2][0] = 'PHP64'; } + foreach ($engines as $engine) { try { self::setEngine($engine[0], $engine[1]); @@ -135,9 +156,11 @@ private static function initialize_static_variables() } catch (\Exception $e) { } } + throw new \UnexpectedValueException('No valid BigInteger found. This is only possible when JIT is enabled on Windows and neither the GMP or BCMath extensions are available so either disable JIT or install GMP / BCMath'); } } + /** * Converts base-2, base-10, base-16, and binary strings (base-256) to BigIntegers. * @@ -150,15 +173,17 @@ private static function initialize_static_variables() public function __construct($x = 0, $base = 10) { self::initialize_static_variables(); + if ($x instanceof self::$mainEngine) { $this->value = clone $x; } elseif ($x instanceof Engine) { - $this->value = new static("{$x}"); + $this->value = new static("$x"); $this->value->setPrecision($x->getPrecision()); } else { $this->value = new self::$mainEngine($x, $base); } } + /** * Converts a BigInteger to a base-10 number. * @@ -168,13 +193,15 @@ public function toString() { return $this->value->toString(); } + /** * __toString() magic method */ public function __toString() { - return (string) $this->value; + return (string)$this->value; } + /** * __debugInfo() magic method * @@ -184,26 +211,29 @@ public function __debugInfo() { return $this->value->__debugInfo(); } + /** * Converts a BigInteger to a byte string (eg. base-256). * * @param bool $twos_compliment * @return string */ - public function toBytes($twos_compliment = \false) + public function toBytes($twos_compliment = false) { return $this->value->toBytes($twos_compliment); } + /** * Converts a BigInteger to a hex string (eg. base-16). * * @param bool $twos_compliment * @return string */ - public function toHex($twos_compliment = \false) + public function toHex($twos_compliment = false) { return $this->value->toHex($twos_compliment); } + /** * Converts a BigInteger to a bit string (eg. base-2). * @@ -213,10 +243,11 @@ public function toHex($twos_compliment = \false) * @param bool $twos_compliment * @return string */ - public function toBits($twos_compliment = \false) + public function toBits($twos_compliment = false) { return $this->value->toBits($twos_compliment); } + /** * Adds two BigIntegers. * @@ -227,6 +258,7 @@ public function add(BigInteger $y) { return new static($this->value->add($y->value)); } + /** * Subtracts two BigIntegers. * @@ -237,6 +269,7 @@ public function subtract(BigInteger $y) { return new static($this->value->subtract($y->value)); } + /** * Multiplies two BigIntegers * @@ -247,6 +280,7 @@ public function multiply(BigInteger $x) { return new static($this->value->multiply($x->value)); } + /** * Divides two BigIntegers. * @@ -275,8 +309,12 @@ public function multiply(BigInteger $x) public function divide(BigInteger $y) { list($q, $r) = $this->value->divide($y->value); - return [new static($q), new static($r)]; + return [ + new static($q), + new static($r) + ]; } + /** * Calculates modular inverses. * @@ -289,6 +327,7 @@ public function modInverse(BigInteger $n) { return new static($this->value->modInverse($n->value)); } + /** * Calculates modular inverses. * @@ -303,8 +342,13 @@ public function extendedGCD(BigInteger $n) $gcd = $extended['gcd']; $x = $extended['x']; $y = $extended['y']; - return ['gcd' => new static($gcd), 'x' => new static($x), 'y' => new static($y)]; + return [ + 'gcd' => new static($gcd), + 'x' => new static($x), + 'y' => new static($y) + ]; } + /** * Calculates the greatest common divisor * @@ -317,6 +361,7 @@ public function gcd(BigInteger $n) { return new static($this->value->gcd($n->value)); } + /** * Absolute value. * @@ -326,6 +371,7 @@ public function abs() { return new static($this->value->abs()); } + /** * Set Precision * @@ -338,6 +384,7 @@ public function setPrecision($bits) { $this->value->setPrecision($bits); } + /** * Get Precision * @@ -349,6 +396,7 @@ public function getPrecision() { return $this->value->getPrecision(); } + /** * Serialize * @@ -366,13 +414,14 @@ public function getPrecision() */ public function __sleep() { - $this->hex = $this->toHex(\true); + $this->hex = $this->toHex(true); $vars = ['hex']; if ($this->getPrecision() > 0) { $vars[] = 'precision'; } return $vars; } + /** * Serialize * @@ -387,6 +436,7 @@ public function __wakeup() $this->setPrecision($this->precision); } } + /** * __serialize() magic method * @@ -396,12 +446,13 @@ public function __wakeup() */ public function __serialize() { - $result = ['hex' => $this->toHex(\true)]; + $result = ['hex' => $this->toHex(true)]; if ($this->getPrecision() > 0) { $result['precision'] = $this->getPrecision(); } return $result; } + /** * __unserialize() magic method * @@ -417,6 +468,7 @@ public function __unserialize(array $data) $this->setPrecision($data['precision']); } } + /** * JSON Serialize * @@ -427,12 +479,13 @@ public function __unserialize(array $data) #[\ReturnTypeWillChange] public function jsonSerialize() { - $result = ['hex' => $this->toHex(\true)]; + $result = ['hex' => $this->toHex(true)]; if ($this->precision > 0) { $result['precision'] = $this->getPrecision(); } return $result; } + /** * Performs modular exponentiation. * @@ -444,6 +497,7 @@ public function powMod(BigInteger $e, BigInteger $n) { return new static($this->value->powMod($e->value, $n->value)); } + /** * Performs modular exponentiation. * @@ -455,6 +509,7 @@ public function modPow(BigInteger $e, BigInteger $n) { return new static($this->value->modPow($e->value, $n->value)); } + /** * Compares two numbers. * @@ -477,6 +532,7 @@ public function compare(BigInteger $y) { return $this->value->compare($y->value); } + /** * Tests the equality of two numbers. * @@ -489,6 +545,7 @@ public function equals(BigInteger $x) { return $this->value->equals($x->value); } + /** * Logical Not * @@ -498,6 +555,7 @@ public function bitwise_not() { return new static($this->value->bitwise_not()); } + /** * Logical And * @@ -508,6 +566,7 @@ public function bitwise_and(BigInteger $x) { return new static($this->value->bitwise_and($x->value)); } + /** * Logical Or * @@ -518,6 +577,7 @@ public function bitwise_or(BigInteger $x) { return new static($this->value->bitwise_or($x->value)); } + /** * Logical Exclusive Or * @@ -528,6 +588,7 @@ public function bitwise_xor(BigInteger $x) { return new static($this->value->bitwise_xor($x->value)); } + /** * Logical Right Shift * @@ -540,6 +601,7 @@ public function bitwise_rightShift($shift) { return new static($this->value->bitwise_rightShift($shift)); } + /** * Logical Left Shift * @@ -552,6 +614,7 @@ public function bitwise_leftShift($shift) { return new static($this->value->bitwise_leftShift($shift)); } + /** * Logical Left Rotate * @@ -564,6 +627,7 @@ public function bitwise_leftRotate($shift) { return new static($this->value->bitwise_leftRotate($shift)); } + /** * Logical Right Rotate * @@ -576,6 +640,7 @@ public function bitwise_rightRotate($shift) { return new static($this->value->bitwise_rightRotate($shift)); } + /** * Returns the smallest and largest n-bit number * @@ -585,12 +650,17 @@ public function bitwise_rightRotate($shift) public static function minMaxBits($bits) { self::initialize_static_variables(); + $class = self::$mainEngine; $minMax = $class::minMaxBits($bits); $min = $minMax['min']; $max = $minMax['max']; - return ['min' => new static($min), 'max' => new static($max)]; + return [ + 'min' => new static($min), + 'max' => new static($max) + ]; } + /** * Return the size of a BigInteger in bits * @@ -600,6 +670,7 @@ public function getLength() { return $this->value->getLength(); } + /** * Return the size of a BigInteger in bytes * @@ -609,6 +680,7 @@ public function getLengthInBytes() { return $this->value->getLengthInBytes(); } + /** * Generates a random number of a certain size * @@ -620,9 +692,11 @@ public function getLengthInBytes() public static function random($size) { self::initialize_static_variables(); + $class = self::$mainEngine; return new static($class::random($size)); } + /** * Generates a random prime number of a certain size * @@ -634,9 +708,11 @@ public static function random($size) public static function randomPrime($size) { self::initialize_static_variables(); + $class = self::$mainEngine; return new static($class::randomPrime($size)); } + /** * Generate a random prime number between a range * @@ -651,6 +727,7 @@ public static function randomRangePrime(BigInteger $min, BigInteger $max) $class = self::$mainEngine; return new static($class::randomRangePrime($min->value, $max->value)); } + /** * Generate a random number between a range * @@ -669,6 +746,7 @@ public static function randomRange(BigInteger $min, BigInteger $max) $class = self::$mainEngine; return new static($class::randomRange($min->value, $max->value)); } + /** * Checks a numer to see if it's prime * @@ -679,10 +757,11 @@ public static function randomRange(BigInteger $min, BigInteger $max) * @param int|bool $t * @return bool */ - public function isPrime($t = \false) + public function isPrime($t = false) { return $this->value->isPrime($t); } + /** * Calculates the nth root of a biginteger. * @@ -695,6 +774,7 @@ public function root($n = 2) { return new static($this->value->root($n)); } + /** * Performs exponentiation. * @@ -705,6 +785,7 @@ public function pow(BigInteger $n) { return new static($this->value->pow($n->value)); } + /** * Return the minimum BigInteger between an arbitrary number of BigIntegers. * @@ -714,11 +795,12 @@ public function pow(BigInteger $n) public static function min(BigInteger ...$nums) { $class = self::$mainEngine; - $nums = \array_map(function ($num) { + $nums = array_map(function ($num) { return $num->value; }, $nums); return new static($class::min(...$nums)); } + /** * Return the maximum BigInteger between an arbitrary number of BigIntegers. * @@ -728,11 +810,12 @@ public static function min(BigInteger ...$nums) public static function max(BigInteger ...$nums) { $class = self::$mainEngine; - $nums = \array_map(function ($num) { + $nums = array_map(function ($num) { return $num->value; }, $nums); return new static($class::max(...$nums)); } + /** * Tests BigInteger to see if it is between two integers, inclusive * @@ -744,6 +827,7 @@ public function between(BigInteger $min, BigInteger $max) { return $this->value->between($min->value, $max->value); } + /** * Clone */ @@ -751,6 +835,7 @@ public function __clone() { $this->value = clone $this->value; } + /** * Is Odd? * @@ -760,6 +845,7 @@ public function isOdd() { return $this->value->isOdd(); } + /** * Tests if a bit is set * @@ -770,6 +856,7 @@ public function testBit($x) { return $this->value->testBit($x); } + /** * Is Negative? * @@ -779,6 +866,7 @@ public function isNegative() { return $this->value->isNegative(); } + /** * Negate * @@ -790,6 +878,7 @@ public function negate() { return new static($this->value->negate()); } + /** * Scan for 1 and right shift by that amount * @@ -803,6 +892,7 @@ public static function scan1divide(BigInteger $r) $class = self::$mainEngine; return $class::scan1divide($r->value); } + /** * Create Recurring Modulo Function * @@ -814,10 +904,11 @@ public static function scan1divide(BigInteger $r) public function createRecurringModuloFunction() { $func = $this->value->createRecurringModuloFunction(); - return function (BigInteger $x) use($func) { + return function (BigInteger $x) use ($func) { return new static($func($x->value)); }; } + /** * Bitwise Split * @@ -828,7 +919,7 @@ public function createRecurringModuloFunction() */ public function bitwise_split($split) { - return \array_map(function ($val) { + return array_map(function ($val) { return new static($val); }, $this->value->bitwise_split($split)); } diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath.php index 3383a19..c3d6708 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath.php +++ b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath.php @@ -10,15 +10,16 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines; use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; use OCA\Libresign\Vendor\phpseclib3\Exception\BadConfigurationException; + /** * BCMath Engine. * * @author Jim Wigginton - * @internal */ class BCMath extends Engine { @@ -28,17 +29,20 @@ class BCMath extends Engine * @see parent::bitwise_leftRotate() * @see parent::bitwise_rightRotate() */ - const FAST_BITWISE = \false; + const FAST_BITWISE = false; + /** * Engine Directory * * @see parent::setModExpEngine */ const ENGINE_DIR = 'BCMath'; + /** * Test to see if bcmod() accepts 2 or 3 parameters */ - const BCMOD_THREE_PARAMS = \PHP_VERSION_ID >= 72000; + const BCMOD_THREE_PARAMS = PHP_VERSION_ID >= 72000; + /** * Test for engine validity * @@ -47,8 +51,9 @@ class BCMath extends Engine */ public static function isValidEngine() { - return \extension_loaded('bcmath'); + return extension_loaded('bcmath'); } + /** * Default constructor * @@ -64,9 +69,12 @@ public function __construct($x = 0, $base = 10) if (!static::$isValidEngine[static::class]) { throw new BadConfigurationException('BCMath is not setup correctly on this system'); } + $this->value = '0'; + parent::__construct($x, $base); } + /** * Initialize a BCMath BigInteger Engine instance * @@ -75,33 +83,42 @@ public function __construct($x = 0, $base = 10) */ protected function initialize($base) { - switch (\abs($base)) { + switch (abs($base)) { case 256: // round $len to the nearest 4 - $len = \strlen($this->value) + 3 & ~3; - $x = \str_pad($this->value, $len, \chr(0), \STR_PAD_LEFT); + $len = (strlen($this->value) + 3) & ~3; + + $x = str_pad($this->value, $len, chr(0), STR_PAD_LEFT); + $this->value = '0'; for ($i = 0; $i < $len; $i += 4) { - $this->value = \bcmul($this->value, '4294967296', 0); - // 4294967296 == 2**32 - $this->value = \bcadd($this->value, 0x1000000 * \ord($x[$i]) + (\ord($x[$i + 1]) << 16 | \ord($x[$i + 2]) << 8 | \ord($x[$i + 3])), 0); + $this->value = bcmul($this->value, '4294967296', 0); // 4294967296 == 2**32 + $this->value = bcadd( + $this->value, + 0x1000000 * ord($x[$i]) + ((ord($x[$i + 1]) << 16) | (ord( + $x[$i + 2] + ) << 8) | ord($x[$i + 3])), + 0 + ); } + if ($this->is_negative) { $this->value = '-' . $this->value; } break; case 16: - $x = \strlen($this->value) & 1 ? '0' . $this->value : $this->value; + $x = (strlen($this->value) & 1) ? '0' . $this->value : $this->value; $temp = new self(Strings::hex2bin($x), 256); $this->value = $this->is_negative ? '-' . $temp->value : $temp->value; - $this->is_negative = \false; + $this->is_negative = false; break; case 10: // explicitly casting $x to a string is necessary, here, since doing $x[0] on -1 yields different // results then doing it on '-1' does (modInverse does $x[0]) - $this->value = $this->value === '-' ? '0' : (string) $this->value; + $this->value = $this->value === '-' ? '0' : (string)$this->value; } } + /** * Converts a BigInteger to a base-10 number. * @@ -112,31 +129,40 @@ public function toString() if ($this->value === '0') { return '0'; } - return \ltrim($this->value, '0'); + + return ltrim($this->value, '0'); } + /** * Converts a BigInteger to a byte string (eg. base-256). * * @param bool $twos_compliment * @return string */ - public function toBytes($twos_compliment = \false) + public function toBytes($twos_compliment = false) { if ($twos_compliment) { return $this->toBytesHelper(); } + $value = ''; $current = $this->value; + if ($current[0] == '-') { - $current = \substr($current, 1); + $current = substr($current, 1); } - while (\bccomp($current, '0', 0) > 0) { - $temp = self::BCMOD_THREE_PARAMS ? \bcmod($current, '16777216', 0) : \bcmod($current, '16777216'); - $value = \chr($temp >> 16) . \chr($temp >> 8) . \chr($temp) . $value; - $current = \bcdiv($current, '16777216', 0); + + while (bccomp($current, '0', 0) > 0) { + $temp = self::BCMOD_THREE_PARAMS ? bcmod($current, '16777216', 0) : bcmod($current, '16777216'); + $value = chr($temp >> 16) . chr($temp >> 8) . chr($temp) . $value; + $current = bcdiv($current, '16777216', 0); } - return $this->precision > 0 ? \substr(\str_pad($value, $this->precision >> 3, \chr(0), \STR_PAD_LEFT), -($this->precision >> 3)) : \ltrim($value, \chr(0)); + + return $this->precision > 0 ? + substr(str_pad($value, $this->precision >> 3, chr(0), STR_PAD_LEFT), -($this->precision >> 3)) : + ltrim($value, chr(0)); } + /** * Adds two BigIntegers. * @@ -146,9 +172,11 @@ public function toBytes($twos_compliment = \false) public function add(BCMath $y) { $temp = new self(); - $temp->value = \bcadd($this->value, $y->value, 0); + $temp->value = bcadd($this->value, $y->value, 0); + return $this->normalize($temp); } + /** * Subtracts two BigIntegers. * @@ -158,9 +186,11 @@ public function add(BCMath $y) public function subtract(BCMath $y) { $temp = new self(); - $temp->value = \bcsub($this->value, $y->value, 0); + $temp->value = bcsub($this->value, $y->value, 0); + return $this->normalize($temp); } + /** * Multiplies two BigIntegers. * @@ -170,9 +200,11 @@ public function subtract(BCMath $y) public function multiply(BCMath $x) { $temp = new self(); - $temp->value = \bcmul($this->value, $x->value, 0); + $temp->value = bcmul($this->value, $x->value, 0); + return $this->normalize($temp); } + /** * Divides two BigIntegers. * @@ -188,13 +220,17 @@ public function divide(BCMath $y) { $quotient = new self(); $remainder = new self(); - $quotient->value = \bcdiv($this->value, $y->value, 0); - $remainder->value = self::BCMOD_THREE_PARAMS ? \bcmod($this->value, $y->value, 0) : \bcmod($this->value, $y->value); + + $quotient->value = bcdiv($this->value, $y->value, 0); + $remainder->value = self::BCMOD_THREE_PARAMS ? bcmod($this->value, $y->value, 0) : bcmod($this->value, $y->value); + if ($remainder->value[0] == '-') { - $remainder->value = \bcadd($remainder->value, $y->value[0] == '-' ? \substr($y->value, 1) : $y->value, 0); + $remainder->value = bcadd($remainder->value, $y->value[0] == '-' ? substr($y->value, 1) : $y->value, 0); } + return [$this->normalize($quotient), $this->normalize($remainder)]; } + /** * Calculates modular inverses. * @@ -207,6 +243,7 @@ public function modInverse(BCMath $n) { return $this->modInverseHelper($n); } + /** * Calculates the greatest common divisor and Bezout's identity. * @@ -223,26 +260,38 @@ public function extendedGCD(BCMath $n) // it might be faster to use the binary xGCD algorithim here, as well, but (1) that algorithim works // best when the base is a power of 2 and (2) i don't think it'd make much difference, anyway. as is, // the basic extended euclidean algorithim is what we're using. + $u = $this->value; $v = $n->value; + $a = '1'; $b = '0'; $c = '0'; $d = '1'; - while (\bccomp($v, '0', 0) != 0) { - $q = \bcdiv($u, $v, 0); + + while (bccomp($v, '0', 0) != 0) { + $q = bcdiv($u, $v, 0); + $temp = $u; $u = $v; - $v = \bcsub($temp, \bcmul($v, $q, 0), 0); + $v = bcsub($temp, bcmul($v, $q, 0), 0); + $temp = $a; $a = $c; - $c = \bcsub($temp, \bcmul($a, $q, 0), 0); + $c = bcsub($temp, bcmul($a, $q, 0), 0); + $temp = $b; $b = $d; - $d = \bcsub($temp, \bcmul($b, $q, 0), 0); + $d = bcsub($temp, bcmul($b, $q, 0), 0); } - return ['gcd' => $this->normalize(new static($u)), 'x' => $this->normalize(new static($a)), 'y' => $this->normalize(new static($b))]; + + return [ + 'gcd' => $this->normalize(new static($u)), + 'x' => $this->normalize(new static($a)), + 'y' => $this->normalize(new static($b)) + ]; } + /** * Calculates the greatest common divisor * @@ -256,6 +305,7 @@ public function gcd(BCMath $n) $gcd = $this->extendedGCD($n)['gcd']; return $gcd; } + /** * Absolute value. * @@ -264,9 +314,13 @@ public function gcd(BCMath $n) public function abs() { $temp = new static(); - $temp->value = \strlen($this->value) && $this->value[0] == '-' ? \substr($this->value, 1) : $this->value; + $temp->value = strlen($this->value) && $this->value[0] == '-' ? + substr($this->value, 1) : + $this->value; + return $temp; } + /** * Logical And * @@ -277,6 +331,7 @@ public function bitwise_and(BCMath $x) { return $this->bitwiseAndHelper($x); } + /** * Logical Or * @@ -287,6 +342,7 @@ public function bitwise_or(BCMath $x) { return $this->bitwiseOrHelper($x); } + /** * Logical Exclusive Or * @@ -297,6 +353,7 @@ public function bitwise_xor(BCMath $x) { return $this->bitwiseXorHelper($x); } + /** * Logical Right Shift * @@ -308,9 +365,11 @@ public function bitwise_xor(BCMath $x) public function bitwise_rightShift($shift) { $temp = new static(); - $temp->value = \bcdiv($this->value, \bcpow('2', $shift, 0), 0); + $temp->value = bcdiv($this->value, bcpow('2', $shift, 0), 0); + return $this->normalize($temp); } + /** * Logical Left Shift * @@ -322,9 +381,11 @@ public function bitwise_rightShift($shift) public function bitwise_leftShift($shift) { $temp = new static(); - $temp->value = \bcmul($this->value, \bcpow('2', $shift, 0), 0); + $temp->value = bcmul($this->value, bcpow('2', $shift, 0), 0); + return $this->normalize($temp); } + /** * Compares two numbers. * @@ -345,8 +406,9 @@ public function bitwise_leftShift($shift) */ public function compare(BCMath $y) { - return \bccomp($this->value, $y->value, 0); + return bccomp($this->value, $y->value, 0); } + /** * Tests the equality of two numbers. * @@ -359,6 +421,7 @@ public function equals(BCMath $x) { return $this->value == $x->value; } + /** * Performs modular exponentiation. * @@ -370,6 +433,7 @@ public function modPow(BCMath $e, BCMath $n) { return $this->powModOuter($e, $n); } + /** * Performs modular exponentiation. * @@ -383,6 +447,7 @@ public function powMod(BCMath $e, BCMath $n) { return $this->powModOuter($e, $n); } + /** * Performs modular exponentiation. * @@ -399,6 +464,7 @@ protected function powModInner(BCMath $e, BCMath $n) return BCMath\DefaultEngine::powModHelper($this, $e, $n, static::class); } } + /** * Normalize * @@ -411,11 +477,14 @@ protected function normalize(BCMath $result) { $result->precision = $this->precision; $result->bitmask = $this->bitmask; - if ($result->bitmask !== \false) { - $result->value = self::BCMOD_THREE_PARAMS ? \bcmod($result->value, $result->bitmask->value, 0) : \bcmod($result->value, $result->bitmask->value); + + if ($result->bitmask !== false) { + $result->value = self::BCMOD_THREE_PARAMS ? bcmod($result->value, $result->bitmask->value, 0) : bcmod($result->value, $result->bitmask->value); } + return $result; } + /** * Generate a random prime number between a range * @@ -429,6 +498,7 @@ public static function randomRangePrime(BCMath $min, BCMath $max) { return self::randomRangePrimeOuter($min, $max); } + /** * Generate a random number between a range * @@ -446,6 +516,7 @@ public static function randomRange(BCMath $min, BCMath $max) { return self::randomRangeHelper($min, $max); } + /** * Make the current number odd * @@ -456,9 +527,10 @@ public static function randomRange(BCMath $min, BCMath $max) protected function make_odd() { if (!$this->isOdd()) { - $this->value = \bcadd($this->value, '1', 0); + $this->value = bcadd($this->value, '1', 0); } } + /** * Test the number against small primes. * @@ -467,23 +539,27 @@ protected function make_odd() protected function testSmallPrimes() { if ($this->value === '1') { - return \false; + return false; } if ($this->value === '2') { - return \true; + return true; } - if ($this->value[\strlen($this->value) - 1] % 2 == 0) { - return \false; + if ($this->value[strlen($this->value) - 1] % 2 == 0) { + return false; } + $value = $this->value; + foreach (self::PRIMES as $prime) { - $r = self::BCMOD_THREE_PARAMS ? \bcmod($this->value, $prime, 0) : \bcmod($this->value, $prime); + $r = self::BCMOD_THREE_PARAMS ? bcmod($this->value, $prime, 0) : bcmod($this->value, $prime); if ($r == '0') { return $this->value == $prime; } } - return \true; + + return true; } + /** * Scan for 1 and right shift by that amount * @@ -495,15 +571,17 @@ protected function testSmallPrimes() */ public static function scan1divide(BCMath $r) { - $r_value =& $r->value; + $r_value = &$r->value; $s = 0; // if $n was 1, $r would be 0 and this would be an infinite loop, hence our $this->equals(static::$one[static::class]) check earlier - while ($r_value[\strlen($r_value) - 1] % 2 == 0) { - $r_value = \bcdiv($r_value, '2', 0); + while ($r_value[strlen($r_value) - 1] % 2 == 0) { + $r_value = bcdiv($r_value, '2', 0); ++$s; } + return $s; } + /** * Performs exponentiation. * @@ -513,9 +591,11 @@ public static function scan1divide(BCMath $r) public function pow(BCMath $n) { $temp = new self(); - $temp->value = \bcpow($this->value, $n->value, 0); + $temp->value = bcpow($this->value, $n->value, 0); + return $this->normalize($temp); } + /** * Return the minimum BigInteger between an arbitrary number of BigIntegers. * @@ -526,6 +606,7 @@ public static function min(BCMath ...$nums) { return self::minHelper($nums); } + /** * Return the maximum BigInteger between an arbitrary number of BigIntegers. * @@ -536,6 +617,7 @@ public static function max(BCMath ...$nums) { return self::maxHelper($nums); } + /** * Tests BigInteger to see if it is between two integers, inclusive * @@ -547,6 +629,7 @@ public function between(BCMath $min, BCMath $max) { return $this->compare($min) >= 0 && $this->compare($max) <= 0; } + /** * Set Bitmask * @@ -559,6 +642,7 @@ protected static function setBitmask($bits) $temp = parent::setBitmask($bits); return $temp->add(static::$one[static::class]); } + /** * Is Odd? * @@ -566,8 +650,9 @@ protected static function setBitmask($bits) */ public function isOdd() { - return $this->value[\strlen($this->value) - 1] % 2 == 1; + return $this->value[strlen($this->value) - 1] % 2 == 1; } + /** * Tests if a bit is set * @@ -575,9 +660,14 @@ public function isOdd() */ public function testBit($x) { - $divisor = \bcpow('2', $x + 1, 0); - return \bccomp(self::BCMOD_THREE_PARAMS ? \bcmod($this->value, $divisor, 0) : \bcmod($this->value, $divisor), \bcpow('2', $x, 0), 0) >= 0; + $divisor = bcpow('2', $x + 1, 0); + return bccomp( + self::BCMOD_THREE_PARAMS ? bcmod($this->value, $divisor, 0) : bcmod($this->value, $divisor), + bcpow('2', $x, 0), + 0 + ) >= 0; } + /** * Is Negative? * @@ -585,8 +675,9 @@ public function testBit($x) */ public function isNegative() { - return \strlen($this->value) && $this->value[0] == '-'; + return strlen($this->value) && $this->value[0] == '-'; } + /** * Negate * @@ -597,10 +688,15 @@ public function isNegative() public function negate() { $temp = clone $this; - if (!\strlen($temp->value)) { + + if (!strlen($temp->value)) { return $temp; } - $temp->value = $temp->value[0] == '-' ? \substr($this->value, 1) : '-' . $this->value; + + $temp->value = $temp->value[0] == '-' ? + substr($this->value, 1) : + '-' . $this->value; + return $temp; } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Base.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Base.php index b981208..9c5c71a 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Base.php +++ b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Base.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\BCMath; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\BCMath; + /** * Sliding Window Exponentiation Engine * * @author Jim Wigginton - * @internal */ abstract class Base extends BCMath { @@ -33,6 +34,7 @@ abstract class Base extends BCMath * */ const DATA = 1; + /** * Test for engine validity * @@ -42,6 +44,7 @@ public static function isValidEngine() { return static::class != __CLASS__; } + /** * Performs modular exponentiation. * @@ -58,8 +61,10 @@ protected static function powModHelper(BCMath $x, BCMath $e, BCMath $n, $class) $temp->value = '1'; return $x->normalize($temp); } + return $x->normalize(static::slidingWindow($x, $e, $n, $class)); } + /** * Modular reduction preparation * @@ -73,6 +78,7 @@ protected static function prepareReduce($x, $n, $class) { return static::reduce($x, $n); } + /** * Modular multiply * @@ -85,8 +91,9 @@ protected static function prepareReduce($x, $n, $class) */ protected static function multiplyReduce($x, $y, $n, $class) { - return static::reduce(\bcmul($x, $y, 0), $n); + return static::reduce(bcmul($x, $y, 0), $n); } + /** * Modular square * @@ -98,6 +105,6 @@ protected static function multiplyReduce($x, $y, $n, $class) */ protected static function squareReduce($x, $n, $class) { - return static::reduce(\bcmul($x, $x, 0), $n); + return static::reduce(bcmul($x, $x, 0), $n); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/BuiltIn.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/BuiltIn.php index 4a1fd62..3f76459 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/BuiltIn.php +++ b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/BuiltIn.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\BCMath; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\BCMath; + /** * Built-In BCMath Modular Exponentiation Engine * * @author Jim Wigginton - * @internal */ abstract class BuiltIn extends BCMath { @@ -32,7 +33,8 @@ abstract class BuiltIn extends BCMath protected static function powModHelper(BCMath $x, BCMath $e, BCMath $n) { $temp = new BCMath(); - $temp->value = \bcpowmod($x->value, $e->value, $n->value, 0); + $temp->value = bcpowmod($x->value, $e->value, $n->value, 0); + return $x->normalize($temp); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/DefaultEngine.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/DefaultEngine.php index 2e65cef..aefc134 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/DefaultEngine.php +++ b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/DefaultEngine.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\BCMath; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\BCMath\Reductions\Barrett; + /** * PHP Default Modular Exponentiation Engine * * @author Jim Wigginton - * @internal */ abstract class DefaultEngine extends Barrett { diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/OpenSSL.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/OpenSSL.php index 96f1c53..92a94f5 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/OpenSSL.php +++ b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/OpenSSL.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\BCMath; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\OpenSSL as Progenitor; + /** * OpenSSL Modular Exponentiation Engine * * @author Jim Wigginton - * @internal */ abstract class OpenSSL extends Progenitor { diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Reductions/Barrett.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Reductions/Barrett.php index 7928585..2898ef5 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Reductions/Barrett.php +++ b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Reductions/Barrett.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\BCMath\Reductions; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\BCMath\Base; + /** * PHP Barrett Modular Exponentiation Engine * * @author Jim Wigginton - * @internal */ abstract class Barrett extends Base { @@ -33,6 +34,7 @@ abstract class Barrett extends Base * */ const DATA = 1; + /** * Barrett Modular Reduction * @@ -57,74 +59,90 @@ abstract class Barrett extends Base */ protected static function reduce($n, $m) { - static $cache = [self::VARIABLE => [], self::DATA => []]; - $m_length = \strlen($m); - if (\strlen($n) > 2 * $m_length) { - return self::BCMOD_THREE_PARAMS ? \bcmod($n, $m, 0) : \bcmod($n, $m); + static $cache = [ + self::VARIABLE => [], + self::DATA => [] + ]; + + $m_length = strlen($m); + + if (strlen($n) > 2 * $m_length) { + return self::BCMOD_THREE_PARAMS ? bcmod($n, $m, 0) : bcmod($n, $m); } + // if (m.length >> 1) + 2 <= m.length then m is too small and n can't be reduced if ($m_length < 5) { return self::regularBarrett($n, $m); } // n = 2 * m.length - $correctionNeeded = \false; + $correctionNeeded = false; if ($m_length & 1) { - $correctionNeeded = \true; + $correctionNeeded = true; $n .= '0'; $m .= '0'; $m_length++; } - if (($key = \array_search($m, $cache[self::VARIABLE])) === \false) { - $key = \count($cache[self::VARIABLE]); + + if (($key = array_search($m, $cache[self::VARIABLE])) === false) { + $key = count($cache[self::VARIABLE]); $cache[self::VARIABLE][] = $m; - $lhs = '1' . \str_repeat('0', $m_length + ($m_length >> 1)); - $u = \bcdiv($lhs, $m, 0); - $m1 = \bcsub($lhs, \bcmul($u, $m, 0), 0); + + $lhs = '1' . str_repeat('0', $m_length + ($m_length >> 1)); + $u = bcdiv($lhs, $m, 0); + $m1 = bcsub($lhs, bcmul($u, $m, 0), 0); + $cache[self::DATA][] = [ - 'u' => $u, - // m.length >> 1 (technically (m.length >> 1) + 1) - 'm1' => $m1, + 'u' => $u, // m.length >> 1 (technically (m.length >> 1) + 1) + 'm1' => $m1 // m.length ]; } else { $cacheValues = $cache[self::DATA][$key]; $u = $cacheValues['u']; $m1 = $cacheValues['m1']; } + $cutoff = $m_length + ($m_length >> 1); - $lsd = \substr($n, -$cutoff); - $msd = \substr($n, 0, -$cutoff); - $temp = \bcmul($msd, $m1, 0); - // m.length + (m.length >> 1) - $n = \bcadd($lsd, $temp, 0); - // m.length + (m.length >> 1) + 1 (so basically we're adding two same length numbers) + + $lsd = substr($n, -$cutoff); + $msd = substr($n, 0, -$cutoff); + + $temp = bcmul($msd, $m1, 0); // m.length + (m.length >> 1) + $n = bcadd($lsd, $temp, 0); // m.length + (m.length >> 1) + 1 (so basically we're adding two same length numbers) //if ($m_length & 1) { // return self::regularBarrett($n, $m); //} + // (m.length + (m.length >> 1) + 1) - (m.length - 1) == (m.length >> 1) + 2 - $temp = \substr($n, 0, -$m_length + 1); + $temp = substr($n, 0, -$m_length + 1); // if even: ((m.length >> 1) + 2) + (m.length >> 1) == m.length + 2 // if odd: ((m.length >> 1) + 2) + (m.length >> 1) == (m.length - 1) + 2 == m.length + 1 - $temp = \bcmul($temp, $u, 0); + $temp = bcmul($temp, $u, 0); // if even: (m.length + 2) - ((m.length >> 1) + 1) = m.length - (m.length >> 1) + 1 // if odd: (m.length + 1) - ((m.length >> 1) + 1) = m.length - (m.length >> 1) - $temp = \substr($temp, 0, -($m_length >> 1) - 1); + $temp = substr($temp, 0, -($m_length >> 1) - 1); // if even: (m.length - (m.length >> 1) + 1) + m.length = 2 * m.length - (m.length >> 1) + 1 // if odd: (m.length - (m.length >> 1)) + m.length = 2 * m.length - (m.length >> 1) - $temp = \bcmul($temp, $m, 0); + $temp = bcmul($temp, $m, 0); + // at this point, if m had an odd number of digits, we'd be subtracting a 2 * m.length - (m.length >> 1) digit // number from a m.length + (m.length >> 1) + 1 digit number. ie. there'd be an extra digit and the while loop // following this comment would loop a lot (hence our calling _regularBarrett() in that situation). - $result = \bcsub($n, $temp, 0); + + $result = bcsub($n, $temp, 0); + //if (bccomp($result, '0') < 0) { if ($result[0] == '-') { - $temp = '1' . \str_repeat('0', $m_length + 1); - $result = \bcadd($result, $temp, 0); + $temp = '1' . str_repeat('0', $m_length + 1); + $result = bcadd($result, $temp, 0); } - while (\bccomp($result, $m, 0) >= 0) { - $result = \bcsub($result, $m, 0); + + while (bccomp($result, $m, 0) >= 0) { + $result = bcsub($result, $m, 0); } - return $correctionNeeded && $result != '0' ? \substr($result, 0, -1) : $result; + + return $correctionNeeded && $result != '0' ? substr($result, 0, -1) : $result; } + /** * (Regular) Barrett Modular Reduction * @@ -137,31 +155,42 @@ protected static function reduce($n, $m) */ private static function regularBarrett($x, $n) { - static $cache = [self::VARIABLE => [], self::DATA => []]; - $n_length = \strlen($n); - if (\strlen($x) > 2 * $n_length) { - return self::BCMOD_THREE_PARAMS ? \bcmod($x, $n, 0) : \bcmod($x, $n); + static $cache = [ + self::VARIABLE => [], + self::DATA => [] + ]; + + $n_length = strlen($n); + + if (strlen($x) > 2 * $n_length) { + return self::BCMOD_THREE_PARAMS ? bcmod($x, $n, 0) : bcmod($x, $n); } - if (($key = \array_search($n, $cache[self::VARIABLE])) === \false) { - $key = \count($cache[self::VARIABLE]); + + if (($key = array_search($n, $cache[self::VARIABLE])) === false) { + $key = count($cache[self::VARIABLE]); $cache[self::VARIABLE][] = $n; - $lhs = '1' . \str_repeat('0', 2 * $n_length); - $cache[self::DATA][] = \bcdiv($lhs, $n, 0); + $lhs = '1' . str_repeat('0', 2 * $n_length); + $cache[self::DATA][] = bcdiv($lhs, $n, 0); } - $temp = \substr($x, 0, -$n_length + 1); - $temp = \bcmul($temp, $cache[self::DATA][$key], 0); - $temp = \substr($temp, 0, -$n_length - 1); - $r1 = \substr($x, -$n_length - 1); - $r2 = \substr(\bcmul($temp, $n, 0), -$n_length - 1); - $result = \bcsub($r1, $r2); + + $temp = substr($x, 0, -$n_length + 1); + $temp = bcmul($temp, $cache[self::DATA][$key], 0); + $temp = substr($temp, 0, -$n_length - 1); + + $r1 = substr($x, -$n_length - 1); + $r2 = substr(bcmul($temp, $n, 0), -$n_length - 1); + $result = bcsub($r1, $r2); + //if (bccomp($result, '0') < 0) { if ($result[0] == '-') { - $q = '1' . \str_repeat('0', $n_length + 1); - $result = \bcadd($result, $q, 0); + $q = '1' . str_repeat('0', $n_length + 1); + $result = bcadd($result, $q, 0); } - while (\bccomp($result, $n, 0) >= 0) { - $result = \bcsub($result, $n, 0); + + while (bccomp($result, $n, 0) >= 0) { + $result = bcsub($result, $n, 0); } + return $result; } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Reductions/EvalBarrett.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Reductions/EvalBarrett.php index d129697..7ec3678 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Reductions/EvalBarrett.php +++ b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Reductions/EvalBarrett.php @@ -10,15 +10,16 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\BCMath\Reductions; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\BCMath; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\BCMath\Base; + /** * PHP Barrett Modular Exponentiation Engine * * @author Jim Wigginton - * @internal */ abstract class EvalBarrett extends Base { @@ -28,6 +29,7 @@ abstract class EvalBarrett extends Base * @see self::generateCustomReduction */ private static $custom_reduction; + /** * Barrett Modular Reduction * @@ -43,6 +45,7 @@ protected static function reduce($n, $m) $inline = self::$custom_reduction; return $inline($n); } + /** * Generate Custom Reduction * @@ -52,20 +55,25 @@ protected static function reduce($n, $m) */ protected static function generateCustomReduction(BCMath $m, $class) { - $m_length = \strlen($m); + $m_length = strlen($m); + if ($m_length < 5) { $code = 'return self::BCMOD_THREE_PARAMS ? bcmod($x, $n, 0) : bcmod($x, $n);'; eval('$func = function ($n) { ' . $code . '};'); self::$custom_reduction = $func; return; } - $lhs = '1' . \str_repeat('0', $m_length + ($m_length >> 1)); - $u = \bcdiv($lhs, $m, 0); - $m1 = \bcsub($lhs, \bcmul($u, $m, 0), 0); + + $lhs = '1' . str_repeat('0', $m_length + ($m_length >> 1)); + $u = bcdiv($lhs, $m, 0); + $m1 = bcsub($lhs, bcmul($u, $m, 0), 0); + $cutoff = $m_length + ($m_length >> 1); - $m = "'{$m}'"; - $u = "'{$u}'"; - $m1 = "'{$m1}'"; + + $m = "'$m'"; + $u = "'$u'"; + $m1 = "'$m1'"; + $code = ' $lsd = substr($n, -' . $cutoff . '); $msd = substr($n, 0, -' . $cutoff . '); @@ -81,7 +89,7 @@ protected static function generateCustomReduction(BCMath $m, $class) $result = bcsub($n, $temp, 0); if ($result[0] == \'-\') { - $temp = \'1' . \str_repeat('0', $m_length + 1) . '\'; + $temp = \'1' . str_repeat('0', $m_length + 1) . '\'; $result = bcadd($result, $temp, 0); } @@ -90,8 +98,11 @@ protected static function generateCustomReduction(BCMath $m, $class) } return $result;'; + eval('$func = function ($n) { ' . $code . '};'); + self::$custom_reduction = $func; + return $func; } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/Engine.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/Engine.php index 2ba44d6..9122e34 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/Engine.php +++ b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/Engine.php @@ -10,64 +10,84 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines; use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; use OCA\Libresign\Vendor\phpseclib3\Crypt\Random; use OCA\Libresign\Vendor\phpseclib3\Exception\BadConfigurationException; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * Base Engine. * * @author Jim Wigginton - * @internal */ abstract class Engine implements \JsonSerializable { - /* final protected */ - const PRIMES = [3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997]; + /* final protected */ const PRIMES = [ + 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, + 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, + 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, + 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, + 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, + 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, + 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, + 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, + 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, + 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, + 953, 967, 971, 977, 983, 991, 997, + ]; + /** * BigInteger(0) * * @var array, static> */ protected static $zero = []; + /** * BigInteger(1) * * @var array, static> */ - protected static $one = []; + protected static $one = []; + /** * BigInteger(2) * * @var array, static> */ protected static $two = []; + /** * Modular Exponentiation Engine * * @var array, class-string> */ protected static $modexpEngine; + /** * Engine Validity Flag * * @var array, bool> */ protected static $isValidEngine; + /** * Holds the BigInteger's value * * @var \GMP|string|array|int */ protected $value; + /** * Holds the BigInteger's sign * * @var bool */ protected $is_negative; + /** * Precision * @@ -75,19 +95,22 @@ abstract class Engine implements \JsonSerializable * @var int */ protected $precision = -1; + /** * Precision Bitmask * * @see static::setPrecision() * @var static|false */ - protected $bitmask = \false; + protected $bitmask = false; + /** * Recurring Modulo Function * * @var callable */ protected $reduce; + /** * Mode independent value used for serialization. * @@ -96,6 +119,7 @@ abstract class Engine implements \JsonSerializable * @var string */ protected $hex; + /** * Default constructor * @@ -104,29 +128,32 @@ abstract class Engine implements \JsonSerializable */ public function __construct($x = 0, $base = 10) { - if (!\array_key_exists(static::class, static::$zero)) { - static::$zero[static::class] = null; - // Placeholder to prevent infinite loop. + if (!array_key_exists(static::class, static::$zero)) { + static::$zero[static::class] = null; // Placeholder to prevent infinite loop. static::$zero[static::class] = new static(0); static::$one[static::class] = new static(1); static::$two[static::class] = new static(2); } + // '0' counts as empty() but when the base is 256 '0' is equal to ord('0') or 48 // '0' is the only value like this per http://php.net/empty - if (empty($x) && (\abs($base) != 256 || $x !== '0')) { + if (empty($x) && (abs($base) != 256 || $x !== '0')) { return; } + switch ($base) { case -256: case 256: - if ($base == -256 && \ord($x[0]) & 0x80) { + if ($base == -256 && (ord($x[0]) & 0x80)) { $this->value = ~$x; - $this->is_negative = \true; + $this->is_negative = true; } else { $this->value = $x; - $this->is_negative = \false; + $this->is_negative = false; } + $this->initialize($base); + if ($this->is_negative) { $temp = $this->add(new static('-1')); $this->value = $temp->value; @@ -135,17 +162,21 @@ public function __construct($x = 0, $base = 10) case -16: case 16: if ($base > 0 && $x[0] == '-') { - $this->is_negative = \true; - $x = \substr($x, 1); + $this->is_negative = true; + $x = substr($x, 1); } - $x = \preg_replace('#^(?:0x)?([A-Fa-f0-9]*).*#s', '$1', $x); - $is_negative = \false; - if ($base < 0 && \hexdec($x[0]) >= 8) { - $this->is_negative = $is_negative = \true; + + $x = preg_replace('#^(?:0x)?([A-Fa-f0-9]*).*#s', '$1', $x); + + $is_negative = false; + if ($base < 0 && hexdec($x[0]) >= 8) { + $this->is_negative = $is_negative = true; $x = Strings::bin2hex(~Strings::hex2bin($x)); } + $this->value = $x; $this->initialize($base); + if ($is_negative) { $temp = $this->add(new static('-1')); $this->value = $temp->value; @@ -156,8 +187,8 @@ public function __construct($x = 0, $base = 10) // (?value = \preg_replace('#(?value) || $this->value == '-') { + $this->value = preg_replace('#(?value) || $this->value == '-') { $this->value = '0'; } $this->initialize($base); @@ -165,20 +196,24 @@ public function __construct($x = 0, $base = 10) case -2: case 2: if ($base > 0 && $x[0] == '-') { - $this->is_negative = \true; - $x = \substr($x, 1); + $this->is_negative = true; + $x = substr($x, 1); } - $x = \preg_replace('#^([01]*).*#s', '$1', $x); - $temp = new static(Strings::bits2bin($x), 128 * $base); - // ie. either -16 or +16 + + $x = preg_replace('#^([01]*).*#s', '$1', $x); + + $temp = new static(Strings::bits2bin($x), 128 * $base); // ie. either -16 or +16 $this->value = $temp->value; if ($temp->is_negative) { - $this->is_negative = \true; + $this->is_negative = true; } + break; default: + // base not supported, so we'll let $this == 0 } } + /** * Sets engine type. * @@ -189,14 +224,15 @@ public function __construct($x = 0, $base = 10) public static function setModExpEngine($engine) { $fqengine = '\\OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\' . static::ENGINE_DIR . '\\' . $engine; - if (!\class_exists($fqengine) || !\method_exists($fqengine, 'isValidEngine')) { - throw new \InvalidArgumentException("{$engine} is not a valid engine"); + if (!class_exists($fqengine) || !method_exists($fqengine, 'isValidEngine')) { + throw new \InvalidArgumentException("$engine is not a valid engine"); } if (!$fqengine::isValidEngine()) { - throw new BadConfigurationException("{$engine} is not setup correctly on this system"); + throw new BadConfigurationException("$engine is not setup correctly on this system"); } static::$modexpEngine[static::class] = $fqengine; } + /** * Converts a BigInteger to a byte string (eg. base-256). * @@ -208,29 +244,34 @@ protected function toBytesHelper() { $comparison = $this->compare(new static()); if ($comparison == 0) { - return $this->precision > 0 ? \str_repeat(\chr(0), $this->precision + 1 >> 3) : ''; + return $this->precision > 0 ? str_repeat(chr(0), ($this->precision + 1) >> 3) : ''; } + $temp = $comparison < 0 ? $this->add(new static(1)) : $this; $bytes = $temp->toBytes(); - if (!\strlen($bytes)) { - // eg. if the number we're trying to convert is -1 - $bytes = \chr(0); + + if (!strlen($bytes)) { // eg. if the number we're trying to convert is -1 + $bytes = chr(0); } - if (\ord($bytes[0]) & 0x80) { - $bytes = \chr(0) . $bytes; + + if (ord($bytes[0]) & 0x80) { + $bytes = chr(0) . $bytes; } + return $comparison < 0 ? ~$bytes : $bytes; } + /** * Converts a BigInteger to a hex string (eg. base-16). * * @param bool $twos_compliment * @return string */ - public function toHex($twos_compliment = \false) + public function toHex($twos_compliment = false) { return Strings::bin2hex($this->toBytes($twos_compliment)); } + /** * Converts a BigInteger to a bit string (eg. base-2). * @@ -240,16 +281,20 @@ public function toHex($twos_compliment = \false) * @param bool $twos_compliment * @return string */ - public function toBits($twos_compliment = \false) + public function toBits($twos_compliment = false) { $hex = $this->toBytes($twos_compliment); $bits = Strings::bin2bits($hex); - $result = $this->precision > 0 ? \substr($bits, -$this->precision) : \ltrim($bits, '0'); + + $result = $this->precision > 0 ? substr($bits, -$this->precision) : ltrim($bits, '0'); + if ($twos_compliment && $this->compare(new static()) > 0 && $this->precision <= 0) { return '0' . $result; } + return $result; } + /** * Calculates modular inverses. * @@ -264,20 +309,26 @@ protected function modInverseHelper(Engine $n) { // $x mod -$n == $x mod $n. $n = $n->abs(); + if ($this->compare(static::$zero[static::class]) < 0) { $temp = $this->abs(); $temp = $temp->modInverse($n); return $this->normalize($n->subtract($temp)); } + $extended = $this->extendedGCD($n); $gcd = $extended['gcd']; $x = $extended['x']; + if (!$gcd->equals(static::$one[static::class])) { - return \false; + return false; } + $x = $x->compare(static::$zero[static::class]) < 0 ? $x->add($n) : $x; + return $this->compare(static::$zero[static::class]) < 0 ? $this->normalize($n->subtract($x)) : $this->normalize($x); } + /** * Serialize * @@ -287,13 +338,14 @@ protected function modInverseHelper(Engine $n) */ public function __sleep() { - $this->hex = $this->toHex(\true); + $this->hex = $this->toHex(true); $vars = ['hex']; if ($this->precision > 0) { $vars[] = 'precision'; } return $vars; } + /** * Serialize * @@ -311,6 +363,7 @@ public function __wakeup() $this->setPrecision($this->precision); } } + /** * __serialize() magic method * @@ -322,12 +375,13 @@ public function __wakeup() */ public function __serialize() { - $result = ['hex' => $this->toHex(\true)]; + $result = ['hex' => $this->toHex(true)]; if ($this->precision > 0) { $result['precision'] = $this->precision; } return $result; } + /** * __unserialize() magic method * @@ -347,6 +401,7 @@ public function __unserialize(array $data) $this->setPrecision($data['precision']); } } + /** * JSON Serialize * @@ -357,12 +412,13 @@ public function __unserialize(array $data) #[\ReturnTypeWillChange] public function jsonSerialize() { - $result = ['hex' => $this->toHex(\true)]; + $result = ['hex' => $this->toHex(true)]; if ($this->precision > 0) { $result['precision'] = $this->precision; } return $result; } + /** * Converts a BigInteger to a base-10 number. * @@ -372,6 +428,7 @@ public function __toString() { return $this->toString(); } + /** * __debugInfo() magic method * @@ -381,9 +438,13 @@ public function __toString() */ public function __debugInfo() { - $result = ['value' => '0x' . $this->toHex(\true), 'engine' => \basename(static::class)]; + $result = [ + 'value' => '0x' . $this->toHex(true), + 'engine' => basename(static::class) + ]; return $this->precision > 0 ? $result + ['precision' => $this->precision] : $result; } + /** * Set Precision * @@ -396,14 +457,17 @@ public function setPrecision($bits) { if ($bits < 1) { $this->precision = -1; - $this->bitmask = \false; + $this->bitmask = false; + return; } $this->precision = $bits; $this->bitmask = static::setBitmask($bits); + $temp = $this->normalize($this); $this->value = $temp->value; } + /** * Get Precision * @@ -415,6 +479,7 @@ public function getPrecision() { return $this->precision; } + /** * Set Bitmask * @return static @@ -423,8 +488,9 @@ public function getPrecision() */ protected static function setBitmask($bits) { - return new static(\chr((1 << ($bits & 0x7)) - 1) . \str_repeat(\chr(0xff), $bits >> 3), 256); + return new static(chr((1 << ($bits & 0x7)) - 1) . str_repeat(chr(0xFF), $bits >> 3), 256); } + /** * Logical Not * @@ -438,25 +504,31 @@ public function bitwise_not() if ($temp == '') { return $this->normalize(static::$zero[static::class]); } - $pre_msb = \decbin(\ord($temp[0])); + $pre_msb = decbin(ord($temp[0])); $temp = ~$temp; - $msb = \decbin(\ord($temp[0])); - if (\strlen($msb) == 8) { - $msb = \substr($msb, \strpos($msb, '0')); + $msb = decbin(ord($temp[0])); + if (strlen($msb) == 8) { + $msb = substr($msb, strpos($msb, '0')); } - $temp[0] = \chr(\bindec($msb)); + $temp[0] = chr(bindec($msb)); + // see if we need to add extra leading 1's - $current_bits = \strlen($pre_msb) + 8 * \strlen($temp) - 8; + $current_bits = strlen($pre_msb) + 8 * strlen($temp) - 8; $new_bits = $this->precision - $current_bits; if ($new_bits <= 0) { return $this->normalize(new static($temp, 256)); } + // generate as many leading 1's as we need to. - $leading_ones = \chr((1 << ($new_bits & 0x7)) - 1) . \str_repeat(\chr(0xff), $new_bits >> 3); + $leading_ones = chr((1 << ($new_bits & 0x7)) - 1) . str_repeat(chr(0xFF), $new_bits >> 3); + self::base256_lshift($leading_ones, $current_bits); - $temp = \str_pad($temp, \strlen($leading_ones), \chr(0), \STR_PAD_LEFT); + + $temp = str_pad($temp, strlen($leading_ones), chr(0), STR_PAD_LEFT); + return $this->normalize(new static($leading_ones | $temp, 256)); } + /** * Logical Left Shift * @@ -471,19 +543,20 @@ protected static function base256_lshift(&$x, $shift) if ($shift == 0) { return; } - $num_bytes = $shift >> 3; - // eg. floor($shift/8) - $shift &= 7; - // eg. $shift % 8 + + $num_bytes = $shift >> 3; // eg. floor($shift/8) + $shift &= 7; // eg. $shift % 8 + $carry = 0; - for ($i = \strlen($x) - 1; $i >= 0; --$i) { - $temp = \ord($x[$i]) << $shift | $carry; - $x[$i] = \chr($temp); + for ($i = strlen($x) - 1; $i >= 0; --$i) { + $temp = ord($x[$i]) << $shift | $carry; + $x[$i] = chr($temp); $carry = $temp >> 8; } - $carry = $carry != 0 ? \chr($carry) : ''; - $x = $carry . $x . \str_repeat(\chr(0), $num_bytes); + $carry = ($carry != 0) ? chr($carry) : ''; + $x = $carry . $x . str_repeat(chr(0), $num_bytes); } + /** * Logical Left Rotate * @@ -495,6 +568,7 @@ protected static function base256_lshift(&$x, $shift) public function bitwise_leftRotate($shift) { $bits = $this->toBytes(); + if ($this->precision > 0) { $precision = $this->precision; if (static::FAST_BITWISE) { @@ -504,25 +578,29 @@ public function bitwise_leftRotate($shift) $mask = $mask->toBytes(); } } else { - $temp = \ord($bits[0]); + $temp = ord($bits[0]); for ($i = 0; $temp >> $i; ++$i) { } - $precision = 8 * \strlen($bits) - 8 + $i; - $mask = \chr((1 << ($precision & 0x7)) - 1) . \str_repeat(\chr(0xff), $precision >> 3); + $precision = 8 * strlen($bits) - 8 + $i; + $mask = chr((1 << ($precision & 0x7)) - 1) . str_repeat(chr(0xFF), $precision >> 3); } + if ($shift < 0) { $shift += $precision; } $shift %= $precision; + if (!$shift) { return clone $this; } + $left = $this->bitwise_leftShift($shift); $left = $left->bitwise_and(new static($mask, 256)); $right = $this->bitwise_rightShift($precision - $shift); $result = static::FAST_BITWISE ? $left->bitwise_or($right) : $left->add($right); return $this->normalize($result); } + /** * Logical Right Rotate * @@ -535,6 +613,7 @@ public function bitwise_rightRotate($shift) { return $this->bitwise_leftRotate(-$shift); } + /** * Returns the smallest and largest n-bit number * @@ -544,17 +623,21 @@ public function bitwise_rightRotate($shift) public static function minMaxBits($bits) { $bytes = $bits >> 3; - $min = \str_repeat(\chr(0), $bytes); - $max = \str_repeat(\chr(0xff), $bytes); + $min = str_repeat(chr(0), $bytes); + $max = str_repeat(chr(0xFF), $bytes); $msb = $bits & 7; if ($msb) { - $min = \chr(1 << $msb - 1) . $min; - $max = \chr((1 << $msb) - 1) . $max; + $min = chr(1 << ($msb - 1)) . $min; + $max = chr((1 << $msb) - 1) . $max; } else { - $min[0] = \chr(0x80); + $min[0] = chr(0x80); } - return ['min' => new static($min, 256), 'max' => new static($max, 256)]; + return [ + 'min' => new static($min, 256), + 'max' => new static($max, 256) + ]; } + /** * Return the size of a BigInteger in bits * @@ -562,8 +645,9 @@ public static function minMaxBits($bits) */ public function getLength() { - return \strlen($this->toBits()); + return strlen($this->toBits()); } + /** * Return the size of a BigInteger in bytes * @@ -571,8 +655,9 @@ public function getLength() */ public function getLengthInBytes() { - return (int) \ceil($this->getLength() / 8); + return (int) ceil($this->getLength() / 8); } + /** * Performs some pre-processing for powMod * @@ -582,21 +667,27 @@ public function getLengthInBytes() */ protected function powModOuter(Engine $e, Engine $n) { - $n = $this->bitmask !== \false && $this->bitmask->compare($n) < 0 ? $this->bitmask : $n->abs(); + $n = $this->bitmask !== false && $this->bitmask->compare($n) < 0 ? $this->bitmask : $n->abs(); + if ($e->compare(new static()) < 0) { $e = $e->abs(); + $temp = $this->modInverse($n); - if ($temp === \false) { - return \false; + if ($temp === false) { + return false; } + return $this->normalize($temp->powModInner($e, $n)); } + if ($this->compare($n) > 0 || $this->isNegative()) { list(, $temp) = $this->divide($n); return $temp->powModInner($e, $n); } + return $this->powModInner($e, $n); } + /** * Sliding Window k-ary Modular Exponentiation * @@ -614,32 +705,39 @@ protected function powModOuter(Engine $e, Engine $n) */ protected static function slidingWindow(Engine $x, Engine $e, Engine $n, $class) { - static $window_ranges = [7, 25, 81, 241, 673, 1793]; - // from BigInteger.java's oddModPow function + static $window_ranges = [7, 25, 81, 241, 673, 1793]; // from BigInteger.java's oddModPow function //static $window_ranges = [0, 7, 36, 140, 450, 1303, 3529]; // from MPM 7.3.1 + $e_bits = $e->toBits(); - $e_length = \strlen($e_bits); + $e_length = strlen($e_bits); + // calculate the appropriate window size. // $window_size == 3 if $window_ranges is between 25 and 81, for example. - for ($i = 0, $window_size = 1; $i < \count($window_ranges) && $e_length > $window_ranges[$i]; ++$window_size, ++$i) { + for ($i = 0, $window_size = 1; $i < count($window_ranges) && $e_length > $window_ranges[$i]; ++$window_size, ++$i) { } + $n_value = $n->value; - if (\method_exists(static::class, 'generateCustomReduction')) { + + if (method_exists(static::class, 'generateCustomReduction')) { static::generateCustomReduction($n, $class); } + // precompute $this^0 through $this^$window_size $powers = []; $powers[1] = static::prepareReduce($x->value, $n_value, $class); $powers[2] = static::squareReduce($powers[1], $n_value, $class); + // we do every other number since substr($e_bits, $i, $j+1) (see below) is supposed to end // in a 1. ie. it's supposed to be odd. - $temp = 1 << $window_size - 1; + $temp = 1 << ($window_size - 1); for ($i = 1; $i < $temp; ++$i) { $i2 = $i << 1; $powers[$i2 + 1] = static::multiplyReduce($powers[$i2 - 1], $powers[2], $n_value, $class); } + $result = new $class(1); $result = static::prepareReduce($result->value, $n_value, $class); + for ($i = 0; $i < $e_length;) { if (!$e_bits[$i]) { $result = static::squareReduce($result, $n_value, $class); @@ -650,18 +748,24 @@ protected static function slidingWindow(Engine $x, Engine $e, Engine $n, $class) break; } } + // eg. the length of substr($e_bits, $i, $j + 1) for ($k = 0; $k <= $j; ++$k) { $result = static::squareReduce($result, $n_value, $class); } - $result = static::multiplyReduce($result, $powers[\bindec(\substr($e_bits, $i, $j + 1))], $n_value, $class); + + $result = static::multiplyReduce($result, $powers[bindec(substr($e_bits, $i, $j + 1))], $n_value, $class); + $i += $j + 1; } } + $temp = new $class(); $temp->value = static::reduce($result, $n_value, $class); + return $temp; } + /** * Generates a random number of a certain size * @@ -677,6 +781,7 @@ public static function random($size) $max = $minMax['max']; return static::randomRange($min, $max); } + /** * Generates a random prime number of a certain size * @@ -692,6 +797,7 @@ public static function randomPrime($size) $max = $minMax['max']; return static::randomRangePrime($min, $max); } + /** * Performs some pre-processing for randomRangePrime * @@ -702,21 +808,26 @@ public static function randomPrime($size) protected static function randomRangePrimeOuter(Engine $min, Engine $max) { $compare = $max->compare($min); + if (!$compare) { - return $min->isPrime() ? $min : \false; + return $min->isPrime() ? $min : false; } elseif ($compare < 0) { // if $min is bigger then $max, swap $min and $max $temp = $max; $max = $min; $min = $temp; } + $length = $max->getLength(); if ($length > 8196) { - throw new \RuntimeException("Generation of random prime numbers larger than 8196 has been disabled ({$length})"); + throw new \RuntimeException("Generation of random prime numbers larger than 8196 has been disabled ($length)"); } + $x = static::randomRange($min, $max); + return static::randomRangePrimeInner($x, $min, $max); } + /** * Generate a random number between a range * @@ -733,6 +844,7 @@ protected static function randomRangePrimeOuter(Engine $min, Engine $max) protected static function randomRangeHelper(Engine $min, Engine $max) { $compare = $max->compare($min); + if (!$compare) { return $min; } elseif ($compare < 0) { @@ -741,30 +853,36 @@ protected static function randomRangeHelper(Engine $min, Engine $max) $max = $min; $min = $temp; } + if (!isset(static::$one[static::class])) { static::$one[static::class] = new static(1); } + $max = $max->subtract($min->subtract(static::$one[static::class])); - $size = \strlen(\ltrim($max->toBytes(), \chr(0))); + + $size = strlen(ltrim($max->toBytes(), chr(0))); + /* doing $random % $max doesn't work because some numbers will be more likely to occur than others. eg. if $max is 140 and $random's max is 255 then that'd mean both $random = 5 and $random = 145 would produce 5 whereas the only value of random that could produce 139 would be 139. ie. not all numbers would be equally likely. some would be more likely than others. - + creating a whole new random number until you find one that is within the range doesn't work because, for sufficiently small ranges, the likelihood that you'd get a number within that range would be pretty small. eg. with $random's max being 255 and if your $max being 1 the probability would be pretty high that $random would be greater than $max. - + phpseclib works around this using the technique described here: - + http://crypto.stackexchange.com/questions/5708/creating-a-small-number-from-a-cryptographically-secure-random-string */ - $random_max = new static(\chr(1) . \str_repeat("\x00", $size), 256); + $random_max = new static(chr(1) . str_repeat("\0", $size), 256); $random = new static(Random::string($size), 256); + list($max_multiple) = $random_max->divide($max); $max_multiple = $max_multiple->multiply($max); + while ($random->compare($max_multiple) >= 0) { $random = $random->subtract($max_multiple); $random_max = $random_max->subtract($max_multiple); @@ -775,8 +893,10 @@ protected static function randomRangeHelper(Engine $min, Engine $max) $max_multiple = $max_multiple->multiply($max); } list(, $random) = $random->divide($max); + return $random->add($min); } + /** * Performs some post-processing for randomRangePrime * @@ -790,21 +910,26 @@ protected static function randomRangePrimeInner(Engine $x, Engine $min, Engine $ if (!isset(static::$two[static::class])) { static::$two[static::class] = new static('2'); } + $x->make_odd(); if ($x->compare($max) > 0) { // if $x > $max then $max is even and if $min == $max then no prime number exists between the specified range if ($min->equals($max)) { - return \false; + return false; } $x = clone $min; $x->make_odd(); } + $initial_x = clone $x; - while (\true) { + + while (true) { if ($x->isPrime()) { return $x; } + $x = $x->add(static::$two[static::class]); + if ($x->compare($max) > 0) { $x = clone $min; if ($x->equals(static::$two[static::class])) { @@ -812,11 +937,13 @@ protected static function randomRangePrimeInner(Engine $x, Engine $min, Engine $ } $x->make_odd(); } + if ($x->equals($initial_x)) { - return \false; + return false; } } } + /** * Sets the $t parameter for primality testing * @@ -825,56 +952,26 @@ protected static function randomRangePrimeInner(Engine $x, Engine $min, Engine $ protected function setupIsPrime() { $length = $this->getLengthInBytes(); + // see HAC 4.49 "Note (controlling the error probability)" // @codingStandardsIgnoreStart - if ($length >= 163) { - $t = 2; - } else { - if ($length >= 106) { - $t = 3; - } else { - if ($length >= 81) { - $t = 4; - } else { - if ($length >= 68) { - $t = 5; - } else { - if ($length >= 56) { - $t = 6; - } else { - if ($length >= 50) { - $t = 7; - } else { - if ($length >= 43) { - $t = 8; - } else { - if ($length >= 37) { - $t = 9; - } else { - if ($length >= 31) { - $t = 12; - } else { - if ($length >= 25) { - $t = 15; - } else { - if ($length >= 18) { - $t = 18; - } else { - $t = 27; - } - } - } - } - } - } - } - } - } - } - } + if ($length >= 163) { $t = 2; } // floor(1300 / 8) + else if ($length >= 106) { $t = 3; } // floor( 850 / 8) + else if ($length >= 81 ) { $t = 4; } // floor( 650 / 8) + else if ($length >= 68 ) { $t = 5; } // floor( 550 / 8) + else if ($length >= 56 ) { $t = 6; } // floor( 450 / 8) + else if ($length >= 50 ) { $t = 7; } // floor( 400 / 8) + else if ($length >= 43 ) { $t = 8; } // floor( 350 / 8) + else if ($length >= 37 ) { $t = 9; } // floor( 300 / 8) + else if ($length >= 31 ) { $t = 12; } // floor( 250 / 8) + else if ($length >= 25 ) { $t = 15; } // floor( 200 / 8) + else if ($length >= 18 ) { $t = 18; } // floor( 150 / 8) + else { $t = 27; } // @codingStandardsIgnoreEnd + return $t; } + /** * Tests Primality * @@ -887,30 +984,37 @@ protected function setupIsPrime() protected function testPrimality($t) { if (!$this->testSmallPrimes()) { - return \false; + return false; } - $n = clone $this; + + $n = clone $this; $n_1 = $n->subtract(static::$one[static::class]); $n_2 = $n->subtract(static::$two[static::class]); + $r = clone $n_1; $s = static::scan1divide($r); + for ($i = 0; $i < $t; ++$i) { $a = static::randomRange(static::$two[static::class], $n_2); $y = $a->modPow($r, $n); + if (!$y->equals(static::$one[static::class]) && !$y->equals($n_1)) { for ($j = 1; $j < $s && !$y->equals($n_1); ++$j) { $y = $y->modPow(static::$two[static::class], $n); if ($y->equals(static::$one[static::class])) { - return \false; + return false; } } + if (!$y->equals($n_1)) { - return \false; + return false; } } } - return \true; + + return true; } + /** * Checks a numer to see if it's prime * @@ -921,7 +1025,7 @@ protected function testPrimality($t) * @param int|bool $t * @return bool */ - public function isPrime($t = \false) + public function isPrime($t = false) { // OpenSSL limits RSA keys to 16384 bits. The length of an RSA key is equal to the length of the modulo, which is // produced by multiplying the primes p and q by one another. The largest number two 8196 bit primes can produce is @@ -929,13 +1033,15 @@ public function isPrime($t = \false) // that it'll generate it also stands to reason that that's the largest you'll be able to test primality on $length = $this->getLength(); if ($length > 8196) { - throw new \RuntimeException("Primality testing is not supported for numbers larger than 8196 bits ({$length})"); + throw new \RuntimeException("Primality testing is not supported for numbers larger than 8196 bits ($length)"); } + if (!$t) { $t = $this->setupIsPrime(); } return $this->testPrimality($t); } + /** * Performs a few preliminary checks on root * @@ -946,18 +1052,17 @@ protected function rootHelper($n) { if ($n < 1) { return clone static::$zero[static::class]; - } - // we want positive exponents + } // we want positive exponents if ($this->compare(static::$one[static::class]) < 0) { return clone static::$zero[static::class]; - } - // we want positive numbers + } // we want positive numbers if ($this->compare(static::$two[static::class]) < 0) { return clone static::$one[static::class]; - } - // n-th root of 1 or 2 is 1 + } // n-th root of 1 or 2 is 1 + return $this->rootInner($n); } + /** * Calculates the nth root of a biginteger. * @@ -971,6 +1076,7 @@ protected function rootHelper($n) protected function rootInner($n) { $n = new static($n); + // g is our guess number $g = static::$two[static::class]; // while (g^n < num) g=g*2 @@ -983,43 +1089,42 @@ protected function rootInner($n) $root = $g; return $this->normalize($root); } + // if we're here num wasn't a power of 2 :( - $og = $g; - // og means original guess and here is our upper bound - $g = $g->divide(static::$two[static::class])[0]; - // g is set to be our lower bound - $step = $og->subtract($g)->divide(static::$two[static::class])[0]; - // step is the half of upper bound - lower bound - $g = $g->add($step); - // we start at lower bound + step , basically in the middle of our interval + $og = $g; // og means original guess and here is our upper bound + $g = $g->divide(static::$two[static::class])[0]; // g is set to be our lower bound + $step = $og->subtract($g)->divide(static::$two[static::class])[0]; // step is the half of upper bound - lower bound + $g = $g->add($step); // we start at lower bound + step , basically in the middle of our interval + // while step>1 + while ($step->compare(static::$one[static::class]) == 1) { $guess = $g->pow($n); $step = $step->divide(static::$two[static::class])[0]; - $comp = $guess->compare($this); - // compare our guess with real number + $comp = $guess->compare($this); // compare our guess with real number switch ($comp) { - case -1: - // if guess is lower we add the new step + case -1: // if guess is lower we add the new step $g = $g->add($step); break; - case 1: - // if guess is higher we sub the new step + case 1: // if guess is higher we sub the new step $g = $g->subtract($step); break; - case 0: - // if guess is exactly the num we're done, we return the value + case 0: // if guess is exactly the num we're done, we return the value $root = $g; break 2; } } + if ($comp == 1) { $g = $g->subtract($step); } + // whatever happened, g is the closest guess we can make so return it $root = $g; + return $this->normalize($root); } + /** * Calculates the nth root of a biginteger. * @@ -1030,6 +1135,7 @@ public function root($n = 2) { return $this->rootHelper($n); } + /** * Return the minimum BigInteger between an arbitrary number of BigIntegers. * @@ -1038,15 +1144,16 @@ public function root($n = 2) */ protected static function minHelper(array $nums) { - if (\count($nums) == 1) { + if (count($nums) == 1) { return $nums[0]; } $min = $nums[0]; - for ($i = 1; $i < \count($nums); $i++) { + for ($i = 1; $i < count($nums); $i++) { $min = $min->compare($nums[$i]) > 0 ? $nums[$i] : $min; } return $min; } + /** * Return the minimum BigInteger between an arbitrary number of BigIntegers. * @@ -1055,15 +1162,16 @@ protected static function minHelper(array $nums) */ protected static function maxHelper(array $nums) { - if (\count($nums) == 1) { + if (count($nums) == 1) { return $nums[0]; } $max = $nums[0]; - for ($i = 1; $i < \count($nums); $i++) { + for ($i = 1; $i < count($nums); $i++) { $max = $max->compare($nums[$i]) < 0 ? $nums[$i] : $max; } return $max; } + /** * Create Recurring Modulo Function * @@ -1075,8 +1183,11 @@ protected static function maxHelper(array $nums) public function createRecurringModuloFunction() { $class = static::class; - $fqengine = !\method_exists(static::$modexpEngine[static::class], 'reduce') ? '\\OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\' . static::ENGINE_DIR . '\\DefaultEngine' : static::$modexpEngine[static::class]; - if (\method_exists($fqengine, 'generateCustomReduction')) { + + $fqengine = !method_exists(static::$modexpEngine[static::class], 'reduce') ? + '\\OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\' . static::ENGINE_DIR . '\\DefaultEngine' : + static::$modexpEngine[static::class]; + if (method_exists($fqengine, 'generateCustomReduction')) { $func = $fqengine::generateCustomReduction($this, static::class); return eval('return function(' . static::class . ' $x) use ($func, $class) { $r = new $class(); @@ -1091,6 +1202,7 @@ public function createRecurringModuloFunction() return $r; };'); } + /** * Calculates the greatest common divisor and Bezout's identity. * @@ -1101,26 +1213,38 @@ protected function extendedGCDHelper(Engine $n) { $u = clone $this; $v = clone $n; + $one = new static(1); $zero = new static(); + $a = clone $one; $b = clone $zero; $c = clone $zero; $d = clone $one; + while (!$v->equals($zero)) { list($q) = $u->divide($v); + $temp = $u; $u = $v; $v = $temp->subtract($v->multiply($q)); + $temp = $a; $a = $c; $c = $temp->subtract($a->multiply($q)); + $temp = $b; $b = $d; $d = $temp->subtract($b->multiply($q)); } - return ['gcd' => $u, 'x' => $a, 'y' => $b]; + + return [ + 'gcd' => $u, + 'x' => $a, + 'y' => $b + ]; } + /** * Bitwise Split * @@ -1134,15 +1258,20 @@ public function bitwise_split($split) if ($split < 1) { throw new \RuntimeException('Offset must be greater than 1'); } + $mask = static::$one[static::class]->bitwise_leftShift($split)->subtract(static::$one[static::class]); + $num = clone $this; + $vals = []; while (!$num->equals(static::$zero[static::class])) { $vals[] = $num->bitwise_and($mask); $num = $num->bitwise_rightShift($split); } - return \array_reverse($vals); + + return array_reverse($vals); } + /** * Logical And * @@ -1151,13 +1280,17 @@ public function bitwise_split($split) */ protected function bitwiseAndHelper(Engine $x) { - $left = $this->toBytes(\true); - $right = $x->toBytes(\true); - $length = \max(\strlen($left), \strlen($right)); - $left = \str_pad($left, $length, \chr(0), \STR_PAD_LEFT); - $right = \str_pad($right, $length, \chr(0), \STR_PAD_LEFT); + $left = $this->toBytes(true); + $right = $x->toBytes(true); + + $length = max(strlen($left), strlen($right)); + + $left = str_pad($left, $length, chr(0), STR_PAD_LEFT); + $right = str_pad($right, $length, chr(0), STR_PAD_LEFT); + return $this->normalize(new static($left & $right, -256)); } + /** * Logical Or * @@ -1166,13 +1299,17 @@ protected function bitwiseAndHelper(Engine $x) */ protected function bitwiseOrHelper(Engine $x) { - $left = $this->toBytes(\true); - $right = $x->toBytes(\true); - $length = \max(\strlen($left), \strlen($right)); - $left = \str_pad($left, $length, \chr(0), \STR_PAD_LEFT); - $right = \str_pad($right, $length, \chr(0), \STR_PAD_LEFT); + $left = $this->toBytes(true); + $right = $x->toBytes(true); + + $length = max(strlen($left), strlen($right)); + + $left = str_pad($left, $length, chr(0), STR_PAD_LEFT); + $right = str_pad($right, $length, chr(0), STR_PAD_LEFT); + return $this->normalize(new static($left | $right, -256)); } + /** * Logical Exclusive Or * @@ -1181,11 +1318,14 @@ protected function bitwiseOrHelper(Engine $x) */ protected function bitwiseXorHelper(Engine $x) { - $left = $this->toBytes(\true); - $right = $x->toBytes(\true); - $length = \max(\strlen($left), \strlen($right)); - $left = \str_pad($left, $length, \chr(0), \STR_PAD_LEFT); - $right = \str_pad($right, $length, \chr(0), \STR_PAD_LEFT); + $left = $this->toBytes(true); + $right = $x->toBytes(true); + + $length = max(strlen($left), strlen($right)); + + + $left = str_pad($left, $length, chr(0), STR_PAD_LEFT); + $right = str_pad($right, $length, chr(0), STR_PAD_LEFT); return $this->normalize(new static($left ^ $right, -256)); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/GMP.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/GMP.php index 007e413..e9c185c 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/GMP.php +++ b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/GMP.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines; use OCA\Libresign\Vendor\phpseclib3\Exception\BadConfigurationException; + /** * GMP Engine. * * @author Jim Wigginton - * @internal */ class GMP extends Engine { @@ -27,13 +28,15 @@ class GMP extends Engine * @see parent::bitwise_leftRotate() * @see parent::bitwise_rightRotate() */ - const FAST_BITWISE = \true; + const FAST_BITWISE = true; + /** * Engine Directory * * @see parent::setModExpEngine */ const ENGINE_DIR = 'GMP'; + /** * Test for engine validity * @@ -42,8 +45,9 @@ class GMP extends Engine */ public static function isValidEngine() { - return \extension_loaded('gmp'); + return extension_loaded('gmp'); } + /** * Default constructor * @@ -59,13 +63,17 @@ public function __construct($x = 0, $base = 10) if (!static::$isValidEngine[static::class]) { throw new BadConfigurationException('GMP is not setup correctly on this system'); } + if ($x instanceof \GMP) { $this->value = $x; return; } - $this->value = \gmp_init(0); + + $this->value = gmp_init(0); + parent::__construct($x, $base); } + /** * Initialize a GMP BigInteger Engine instance * @@ -74,21 +82,22 @@ public function __construct($x = 0, $base = 10) */ protected function initialize($base) { - switch (\abs($base)) { + switch (abs($base)) { case 256: - $this->value = \gmp_import($this->value); + $this->value = gmp_import($this->value); if ($this->is_negative) { $this->value = -$this->value; } break; case 16: $temp = $this->is_negative ? '-0x' . $this->value : '0x' . $this->value; - $this->value = \gmp_init($temp); + $this->value = gmp_init($temp); break; case 10: - $this->value = \gmp_init(isset($this->value) ? $this->value : '0'); + $this->value = gmp_init(isset($this->value) ? $this->value : '0'); } } + /** * Converts a BigInteger to a base-10 number. * @@ -96,8 +105,9 @@ protected function initialize($base) */ public function toString() { - return (string) $this->value; + return (string)$this->value; } + /** * Converts a BigInteger to a bit string (eg. base-2). * @@ -107,35 +117,46 @@ public function toString() * @param bool $twos_compliment * @return string */ - public function toBits($twos_compliment = \false) + public function toBits($twos_compliment = false) { $hex = $this->toHex($twos_compliment); - $bits = \gmp_strval(\gmp_init($hex, 16), 2); + + $bits = gmp_strval(gmp_init($hex, 16), 2); + if ($this->precision > 0) { - $bits = \substr($bits, -$this->precision); + $bits = substr($bits, -$this->precision); } + if ($twos_compliment && $this->compare(new static()) > 0 && $this->precision <= 0) { return '0' . $bits; } + return $bits; } + /** * Converts a BigInteger to a byte string (eg. base-256). * * @param bool $twos_compliment * @return string */ - public function toBytes($twos_compliment = \false) + public function toBytes($twos_compliment = false) { if ($twos_compliment) { return $this->toBytesHelper(); } - if (\gmp_cmp($this->value, \gmp_init(0)) == 0) { - return $this->precision > 0 ? \str_repeat(\chr(0), $this->precision + 1 >> 3) : ''; + + if (gmp_cmp($this->value, gmp_init(0)) == 0) { + return $this->precision > 0 ? str_repeat(chr(0), ($this->precision + 1) >> 3) : ''; } - $temp = \gmp_export($this->value); - return $this->precision > 0 ? \substr(\str_pad($temp, $this->precision >> 3, \chr(0), \STR_PAD_LEFT), -($this->precision >> 3)) : \ltrim($temp, \chr(0)); + + $temp = gmp_export($this->value); + + return $this->precision > 0 ? + substr(str_pad($temp, $this->precision >> 3, chr(0), STR_PAD_LEFT), -($this->precision >> 3)) : + ltrim($temp, chr(0)); } + /** * Adds two BigIntegers. * @@ -146,8 +167,10 @@ public function add(GMP $y) { $temp = new self(); $temp->value = $this->value + $y->value; + return $this->normalize($temp); } + /** * Subtracts two BigIntegers. * @@ -158,8 +181,10 @@ public function subtract(GMP $y) { $temp = new self(); $temp->value = $this->value - $y->value; + return $this->normalize($temp); } + /** * Multiplies two BigIntegers. * @@ -170,8 +195,10 @@ public function multiply(GMP $x) { $temp = new self(); $temp->value = $this->value * $x->value; + return $this->normalize($temp); } + /** * Divides two BigIntegers. * @@ -187,12 +214,16 @@ public function divide(GMP $y) { $quotient = new self(); $remainder = new self(); - list($quotient->value, $remainder->value) = \gmp_div_qr($this->value, $y->value); - if (\gmp_sign($remainder->value) < 0) { - $remainder->value = $remainder->value + \gmp_abs($y->value); + + list($quotient->value, $remainder->value) = gmp_div_qr($this->value, $y->value); + + if (gmp_sign($remainder->value) < 0) { + $remainder->value = $remainder->value + gmp_abs($y->value); } + return [$this->normalize($quotient), $this->normalize($remainder)]; } + /** * Compares two numbers. * @@ -213,7 +244,7 @@ public function divide(GMP $y) */ public function compare(GMP $y) { - $r = \gmp_cmp($this->value, $y->value); + $r = gmp_cmp($this->value, $y->value); if ($r < -1) { $r = -1; } @@ -222,6 +253,7 @@ public function compare(GMP $y) } return $r; } + /** * Tests the equality of two numbers. * @@ -234,6 +266,7 @@ public function equals(GMP $x) { return $this->value == $x->value; } + /** * Calculates modular inverses. * @@ -245,9 +278,11 @@ public function equals(GMP $x) public function modInverse(GMP $n) { $temp = new self(); - $temp->value = \gmp_invert($this->value, $n->value); - return $temp->value === \false ? \false : $this->normalize($temp); + $temp->value = gmp_invert($this->value, $n->value); + + return $temp->value === false ? false : $this->normalize($temp); } + /** * Calculates the greatest common divisor and Bezout's identity. * @@ -261,12 +296,18 @@ public function modInverse(GMP $n) */ public function extendedGCD(GMP $n) { - $extended = \gmp_gcdext($this->value, $n->value); + $extended = gmp_gcdext($this->value, $n->value); $g = $extended['g']; $s = $extended['s']; $t = $extended['t']; - return ['gcd' => $this->normalize(new self($g)), 'x' => $this->normalize(new self($s)), 'y' => $this->normalize(new self($t))]; + + return [ + 'gcd' => $this->normalize(new self($g)), + 'x' => $this->normalize(new self($s)), + 'y' => $this->normalize(new self($t)) + ]; } + /** * Calculates the greatest common divisor * @@ -277,9 +318,10 @@ public function extendedGCD(GMP $n) */ public function gcd(GMP $n) { - $r = \gmp_gcd($this->value, $n->value); + $r = gmp_gcd($this->value, $n->value); return $this->normalize(new self($r)); } + /** * Absolute value. * @@ -288,9 +330,11 @@ public function gcd(GMP $n) public function abs() { $temp = new self(); - $temp->value = \gmp_abs($this->value); + $temp->value = gmp_abs($this->value); + return $temp; } + /** * Logical And * @@ -301,8 +345,10 @@ public function bitwise_and(GMP $x) { $temp = new self(); $temp->value = $this->value & $x->value; + return $this->normalize($temp); } + /** * Logical Or * @@ -313,8 +359,10 @@ public function bitwise_or(GMP $x) { $temp = new self(); $temp->value = $this->value | $x->value; + return $this->normalize($temp); } + /** * Logical Exclusive Or * @@ -325,8 +373,10 @@ public function bitwise_xor(GMP $x) { $temp = new self(); $temp->value = $this->value ^ $x->value; + return $this->normalize($temp); } + /** * Logical Right Shift * @@ -339,10 +389,13 @@ public function bitwise_rightShift($shift) { // 0xFFFFFFFF >> 2 == -1 (on 32-bit systems) // gmp_init('0xFFFFFFFF') >> 2 == gmp_init('0x3FFFFFFF') + $temp = new self(); $temp->value = $this->value >> $shift; + return $this->normalize($temp); } + /** * Logical Left Shift * @@ -355,8 +408,10 @@ public function bitwise_leftShift($shift) { $temp = new self(); $temp->value = $this->value << $shift; + return $this->normalize($temp); } + /** * Performs modular exponentiation. * @@ -368,6 +423,7 @@ public function modPow(GMP $e, GMP $n) { return $this->powModOuter($e, $n); } + /** * Performs modular exponentiation. * @@ -381,6 +437,7 @@ public function powMod(GMP $e, GMP $n) { return $this->powModOuter($e, $n); } + /** * Performs modular exponentiation. * @@ -393,6 +450,7 @@ protected function powModInner(GMP $e, GMP $n) $class = static::$modexpEngine[static::class]; return $class::powModHelper($this, $e, $n); } + /** * Normalize * @@ -405,7 +463,8 @@ protected function normalize(GMP $result) { $result->precision = $this->precision; $result->bitmask = $this->bitmask; - if ($result->bitmask !== \false) { + + if ($result->bitmask !== false) { $flip = $result->value < 0; if ($flip) { $result->value = -$result->value; @@ -415,8 +474,10 @@ protected function normalize(GMP $result) $result->value = -$result->value; } } + return $result; } + /** * Performs some post-processing for randomRangePrime * @@ -427,15 +488,19 @@ protected function normalize(GMP $result) */ protected static function randomRangePrimeInner(Engine $x, Engine $min, Engine $max) { - $p = \gmp_nextprime($x->value); + $p = gmp_nextprime($x->value); + if ($p <= $max->value) { return new self($p); } + if ($min->value != $x->value) { $x = new self($x->value - 1); } + return self::randomRangePrime($min, $x); } + /** * Generate a random prime number between a range * @@ -449,6 +514,7 @@ public static function randomRangePrime(GMP $min, GMP $max) { return self::randomRangePrimeOuter($min, $max); } + /** * Generate a random number between a range * @@ -466,6 +532,7 @@ public static function randomRange(GMP $min, GMP $max) { return self::randomRangeHelper($min, $max); } + /** * Make the current number odd * @@ -475,8 +542,9 @@ public static function randomRange(GMP $min, GMP $max) */ protected function make_odd() { - \gmp_setbit($this->value, 0); + gmp_setbit($this->value, 0); } + /** * Tests Primality * @@ -485,8 +553,9 @@ protected function make_odd() */ protected function testPrimality($t) { - return \gmp_prob_prime($this->value, $t) != 0; + return gmp_prob_prime($this->value, $t) != 0; } + /** * Calculates the nth root of a biginteger. * @@ -498,9 +567,10 @@ protected function testPrimality($t) protected function rootInner($n) { $root = new self(); - $root->value = \gmp_root($this->value, $n); + $root->value = gmp_root($this->value, $n); return $this->normalize($root); } + /** * Performs exponentiation. * @@ -511,8 +581,10 @@ public function pow(GMP $n) { $temp = new self(); $temp->value = $this->value ** $n->value; + return $this->normalize($temp); } + /** * Return the minimum BigInteger between an arbitrary number of BigIntegers. * @@ -523,6 +595,7 @@ public static function min(GMP ...$nums) { return self::minHelper($nums); } + /** * Return the maximum BigInteger between an arbitrary number of BigIntegers. * @@ -533,6 +606,7 @@ public static function max(GMP ...$nums) { return self::maxHelper($nums); } + /** * Tests BigInteger to see if it is between two integers, inclusive * @@ -544,6 +618,7 @@ public function between(GMP $min, GMP $max) { return $this->compare($min) >= 0 && $this->compare($max) <= 0; } + /** * Create Recurring Modulo Function * @@ -555,10 +630,11 @@ public function between(GMP $min, GMP $max) public function createRecurringModuloFunction() { $temp = $this->value; - return function (GMP $x) use($temp) { + return function (GMP $x) use ($temp) { return new GMP($x->value % $temp); }; } + /** * Scan for 1 and right shift by that amount * @@ -569,10 +645,11 @@ public function createRecurringModuloFunction() */ public static function scan1divide(GMP $r) { - $s = \gmp_scan1($r->value, 0); + $s = gmp_scan1($r->value, 0); $r->value >>= $s; return $s; } + /** * Is Odd? * @@ -580,8 +657,9 @@ public static function scan1divide(GMP $r) */ public function isOdd() { - return \gmp_testbit($this->value, 0); + return gmp_testbit($this->value, 0); } + /** * Tests if a bit is set * @@ -589,8 +667,9 @@ public function isOdd() */ public function testBit($x) { - return \gmp_testbit($this->value, $x); + return gmp_testbit($this->value, $x); } + /** * Is Negative? * @@ -598,8 +677,9 @@ public function testBit($x) */ public function isNegative() { - return \gmp_sign($this->value) == -1; + return gmp_sign($this->value) == -1; } + /** * Negate * @@ -611,6 +691,7 @@ public function negate() { $temp = clone $this; $temp->value = -$this->value; + return $temp; } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/GMP/DefaultEngine.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/GMP/DefaultEngine.php index b1f345b..597cb79 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/GMP/DefaultEngine.php +++ b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/GMP/DefaultEngine.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\GMP; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\GMP; + /** * GMP Modular Exponentiation Engine * * @author Jim Wigginton - * @internal */ abstract class DefaultEngine extends GMP { @@ -32,7 +33,8 @@ abstract class DefaultEngine extends GMP protected static function powModHelper(GMP $x, GMP $e, GMP $n) { $temp = new GMP(); - $temp->value = \gmp_powm($x->value, $e->value, $n->value); + $temp->value = gmp_powm($x->value, $e->value, $n->value); + return $x->normalize($temp); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/OpenSSL.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/OpenSSL.php index c9784f5..ccee361 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/OpenSSL.php +++ b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/OpenSSL.php @@ -10,15 +10,16 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines; use OCA\Libresign\Vendor\phpseclib3\Crypt\RSA\Formats\Keys\PKCS8; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; + /** * OpenSSL Modular Exponentiation Engine * * @author Jim Wigginton - * @internal */ abstract class OpenSSL { @@ -29,8 +30,9 @@ abstract class OpenSSL */ public static function isValidEngine() { - return \extension_loaded('openssl') && static::class != __CLASS__; + return extension_loaded('openssl') && static::class != __CLASS__; } + /** * Performs modular exponentiation. * @@ -44,16 +46,23 @@ public static function powModHelper(Engine $x, Engine $e, Engine $n) if ($n->getLengthInBytes() < 31 || $n->getLengthInBytes() > 16384) { throw new \OutOfRangeException('Only modulo between 31 and 16384 bits are accepted'); } - $key = PKCS8::savePublicKey(new BigInteger($n), new BigInteger($e)); - $plaintext = \str_pad($x->toBytes(), $n->getLengthInBytes(), "\x00", \STR_PAD_LEFT); + + $key = PKCS8::savePublicKey( + new BigInteger($n), + new BigInteger($e) + ); + + $plaintext = str_pad($x->toBytes(), $n->getLengthInBytes(), "\0", STR_PAD_LEFT); + // this is easily prone to failure. if the modulo is a multiple of 2 or 3 or whatever it // won't work and you'll get a "failure: error:0906D06C:PEM routines:PEM_read_bio:no start line" // error. i suppose, for even numbers, we could do what PHP\Montgomery.php does, but then what // about odd numbers divisible by 3, by 5, etc? - if (!\openssl_public_encrypt($plaintext, $result, $key, \OPENSSL_NO_PADDING)) { - throw new \UnexpectedValueException(\openssl_error_string()); + if (!openssl_public_encrypt($plaintext, $result, $key, OPENSSL_NO_PADDING)) { + throw new \UnexpectedValueException(openssl_error_string()); } - $class = \get_class($x); + + $class = get_class($x); return new $class($result, 256); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP.php index ef8feda..4007e18 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP.php +++ b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP.php @@ -10,15 +10,16 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines; use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; use OCA\Libresign\Vendor\phpseclib3\Exception\BadConfigurationException; + /** * Pure-PHP Engine. * * @author Jim Wigginton - * @internal */ abstract class PHP extends Engine { @@ -38,6 +39,7 @@ abstract class PHP extends Engine */ const SIGN = 1; /**#@-*/ + /** * Karatsuba Cutoff * @@ -45,19 +47,22 @@ abstract class PHP extends Engine * */ const KARATSUBA_CUTOFF = 25; + /** * Can Bitwise operations be done fast? * * @see parent::bitwise_leftRotate() * @see parent::bitwise_rightRotate() */ - const FAST_BITWISE = \true; + const FAST_BITWISE = true; + /** * Engine Directory * * @see parent::setModExpEngine */ const ENGINE_DIR = 'PHP'; + /** * Default constructor * @@ -74,9 +79,11 @@ public function __construct($x = 0, $base = 10) if (!static::$isValidEngine[static::class]) { throw new BadConfigurationException(static::class . ' is not setup correctly on this system'); } + $this->value = []; parent::__construct($x, $base); } + /** * Initialize a PHP BigInteger Engine instance * @@ -85,30 +92,41 @@ public function __construct($x = 0, $base = 10) */ protected function initialize($base) { - switch (\abs($base)) { + switch (abs($base)) { case 16: - $x = \strlen($this->value) & 1 ? '0' . $this->value : $this->value; + $x = (strlen($this->value) & 1) ? '0' . $this->value : $this->value; $temp = new static(Strings::hex2bin($x), 256); $this->value = $temp->value; break; case 10: $temp = new static(); + $multiplier = new static(); $multiplier->value = [static::MAX10]; + $x = $this->value; + if ($x[0] == '-') { - $this->is_negative = \true; - $x = \substr($x, 1); + $this->is_negative = true; + $x = substr($x, 1); } - $x = \str_pad($x, \strlen($x) + (static::MAX10LEN - 1) * \strlen($x) % static::MAX10LEN, 0, \STR_PAD_LEFT); - while (\strlen($x)) { + + $x = str_pad( + $x, + strlen($x) + ((static::MAX10LEN - 1) * strlen($x)) % static::MAX10LEN, + 0, + STR_PAD_LEFT + ); + while (strlen($x)) { $temp = $temp->multiply($multiplier); - $temp = $temp->add(new static($this->int2bytes(\substr($x, 0, static::MAX10LEN)), 256)); - $x = \substr($x, static::MAX10LEN); + $temp = $temp->add(new static($this->int2bytes(substr($x, 0, static::MAX10LEN)), 256)); + $x = substr($x, static::MAX10LEN); } + $this->value = $temp->value; } } + /** * Pads strings so that unpack may be used on them * @@ -117,10 +135,13 @@ protected function initialize($base) */ protected function pad($str) { - $length = \strlen($str); - $pad = 4 - \strlen($str) % 4; - return \str_pad($str, $length + $pad, "\x00", \STR_PAD_LEFT); + $length = strlen($str); + + $pad = 4 - (strlen($str) % 4); + + return str_pad($str, $length + $pad, "\0", STR_PAD_LEFT); } + /** * Converts a BigInteger to a base-10 number. * @@ -128,46 +149,67 @@ protected function pad($str) */ public function toString() { - if (!\count($this->value)) { + if (!count($this->value)) { return '0'; } + $temp = clone $this; - $temp->bitmask = \false; - $temp->is_negative = \false; + $temp->bitmask = false; + $temp->is_negative = false; + $divisor = new static(); $divisor->value = [static::MAX10]; $result = ''; - while (\count($temp->value)) { + while (count($temp->value)) { list($temp, $mod) = $temp->divide($divisor); - $result = \str_pad(isset($mod->value[0]) ? $mod->value[0] : '', static::MAX10LEN, '0', \STR_PAD_LEFT) . $result; - } - $result = \ltrim($result, '0'); + $result = str_pad( + isset($mod->value[0]) ? $mod->value[0] : '', + static::MAX10LEN, + '0', + STR_PAD_LEFT + ) . $result; + } + $result = ltrim($result, '0'); if (empty($result)) { $result = '0'; } + if ($this->is_negative) { $result = '-' . $result; } + return $result; } + /** * Converts a BigInteger to a byte string (eg. base-256). * * @param bool $twos_compliment * @return string */ - public function toBytes($twos_compliment = \false) + public function toBytes($twos_compliment = false) { if ($twos_compliment) { return $this->toBytesHelper(); } - if (!\count($this->value)) { - return $this->precision > 0 ? \str_repeat(\chr(0), $this->precision + 1 >> 3) : ''; + + if (!count($this->value)) { + return $this->precision > 0 ? str_repeat(chr(0), ($this->precision + 1) >> 3) : ''; } + $result = $this->bitwise_small_split(8); - $result = \implode('', \array_map('chr', $result)); - return $this->precision > 0 ? \str_pad(\substr($result, -($this->precision + 7 >> 3)), $this->precision + 7 >> 3, \chr(0), \STR_PAD_LEFT) : $result; + $result = implode('', array_map('chr', $result)); + + return $this->precision > 0 ? + str_pad( + substr($result, -(($this->precision + 7) >> 3)), + ($this->precision + 7) >> 3, + chr(0), + STR_PAD_LEFT + ) : + $result; } + /** * Performs addition. * @@ -179,22 +221,37 @@ public function toBytes($twos_compliment = \false) */ protected static function addHelper(array $x_value, $x_negative, array $y_value, $y_negative) { - $x_size = \count($x_value); - $y_size = \count($y_value); + $x_size = count($x_value); + $y_size = count($y_value); + if ($x_size == 0) { - return [self::VALUE => $y_value, self::SIGN => $y_negative]; + return [ + self::VALUE => $y_value, + self::SIGN => $y_negative + ]; } elseif ($y_size == 0) { - return [self::VALUE => $x_value, self::SIGN => $x_negative]; + return [ + self::VALUE => $x_value, + self::SIGN => $x_negative + ]; } + // subtract, if appropriate if ($x_negative != $y_negative) { if ($x_value == $y_value) { - return [self::VALUE => [], self::SIGN => \false]; + return [ + self::VALUE => [], + self::SIGN => false + ]; } - $temp = self::subtractHelper($x_value, \false, $y_value, \false); - $temp[self::SIGN] = self::compareHelper($x_value, \false, $y_value, \false) > 0 ? $x_negative : $y_negative; + + $temp = self::subtractHelper($x_value, false, $y_value, false); + $temp[self::SIGN] = self::compareHelper($x_value, false, $y_value, false) > 0 ? + $x_negative : $y_negative; + return $temp; } + if ($x_size < $y_size) { $size = $x_size; $value = $y_value; @@ -202,36 +259,42 @@ protected static function addHelper(array $x_value, $x_negative, array $y_value, $size = $y_size; $value = $x_value; } - $value[\count($value)] = 0; - // just in case the carry adds an extra digit + + $value[count($value)] = 0; // just in case the carry adds an extra digit + $carry = 0; for ($i = 0, $j = 1; $j < $size; $i += 2, $j += 2) { //$sum = $x_value[$j] * static::BASE_FULL + $x_value[$i] + $y_value[$j] * static::BASE_FULL + $y_value[$i] + $carry; $sum = ($x_value[$j] + $y_value[$j]) * static::BASE_FULL + $x_value[$i] + $y_value[$i] + $carry; - $carry = $sum >= static::MAX_DIGIT2; - // eg. floor($sum / 2**52); only possible values (in any base) are 0 and 1 + $carry = $sum >= static::MAX_DIGIT2; // eg. floor($sum / 2**52); only possible values (in any base) are 0 and 1 $sum = $carry ? $sum - static::MAX_DIGIT2 : $sum; - $temp = static::BASE === 26 ? \intval($sum / 0x4000000) : $sum >> 31; - $value[$i] = (int) ($sum - static::BASE_FULL * $temp); - // eg. a faster alternative to fmod($sum, 0x4000000) + + $temp = static::BASE === 26 ? intval($sum / 0x4000000) : ($sum >> 31); + + $value[$i] = (int)($sum - static::BASE_FULL * $temp); // eg. a faster alternative to fmod($sum, 0x4000000) $value[$j] = $temp; } - if ($j == $size) { - // ie. if $y_size is odd + + if ($j == $size) { // ie. if $y_size is odd $sum = $x_value[$i] + $y_value[$i] + $carry; $carry = $sum >= static::BASE_FULL; $value[$i] = $carry ? $sum - static::BASE_FULL : $sum; - ++$i; - // ie. let $i = $j since we've just done $value[$i] + ++$i; // ie. let $i = $j since we've just done $value[$i] } + if ($carry) { for (; $value[$i] == static::MAX_DIGIT; ++$i) { $value[$i] = 0; } ++$value[$i]; } - return [self::VALUE => self::trim($value), self::SIGN => $x_negative]; + + return [ + self::VALUE => self::trim($value), + self::SIGN => $x_negative + ]; } + /** * Performs subtraction. * @@ -243,58 +306,85 @@ protected static function addHelper(array $x_value, $x_negative, array $y_value, */ public static function subtractHelper(array $x_value, $x_negative, array $y_value, $y_negative) { - $x_size = \count($x_value); - $y_size = \count($y_value); + $x_size = count($x_value); + $y_size = count($y_value); + if ($x_size == 0) { - return [self::VALUE => $y_value, self::SIGN => !$y_negative]; + return [ + self::VALUE => $y_value, + self::SIGN => !$y_negative + ]; } elseif ($y_size == 0) { - return [self::VALUE => $x_value, self::SIGN => $x_negative]; + return [ + self::VALUE => $x_value, + self::SIGN => $x_negative + ]; } + // add, if appropriate (ie. -$x - +$y or +$x - -$y) if ($x_negative != $y_negative) { - $temp = self::addHelper($x_value, \false, $y_value, \false); + $temp = self::addHelper($x_value, false, $y_value, false); $temp[self::SIGN] = $x_negative; + return $temp; } + $diff = self::compareHelper($x_value, $x_negative, $y_value, $y_negative); + if (!$diff) { - return [self::VALUE => [], self::SIGN => \false]; + return [ + self::VALUE => [], + self::SIGN => false + ]; } + // switch $x and $y around, if appropriate. - if (!$x_negative && $diff < 0 || $x_negative && $diff > 0) { + if ((!$x_negative && $diff < 0) || ($x_negative && $diff > 0)) { $temp = $x_value; $x_value = $y_value; $y_value = $temp; + $x_negative = !$x_negative; - $x_size = \count($x_value); - $y_size = \count($y_value); + + $x_size = count($x_value); + $y_size = count($y_value); } + // at this point, $x_value should be at least as big as - if not bigger than - $y_value + $carry = 0; for ($i = 0, $j = 1; $j < $y_size; $i += 2, $j += 2) { $sum = ($x_value[$j] - $y_value[$j]) * static::BASE_FULL + $x_value[$i] - $y_value[$i] - $carry; - $carry = $sum < 0; - // eg. floor($sum / 2**52); only possible values (in any base) are 0 and 1 + + $carry = $sum < 0; // eg. floor($sum / 2**52); only possible values (in any base) are 0 and 1 $sum = $carry ? $sum + static::MAX_DIGIT2 : $sum; - $temp = static::BASE === 26 ? \intval($sum / 0x4000000) : $sum >> 31; - $x_value[$i] = (int) ($sum - static::BASE_FULL * $temp); + + $temp = static::BASE === 26 ? intval($sum / 0x4000000) : ($sum >> 31); + + $x_value[$i] = (int)($sum - static::BASE_FULL * $temp); $x_value[$j] = $temp; } - if ($j == $y_size) { - // ie. if $y_size is odd + + if ($j == $y_size) { // ie. if $y_size is odd $sum = $x_value[$i] - $y_value[$i] - $carry; $carry = $sum < 0; $x_value[$i] = $carry ? $sum + static::BASE_FULL : $sum; ++$i; } + if ($carry) { for (; !$x_value[$i]; ++$i) { $x_value[$i] = static::MAX_DIGIT; } --$x_value[$i]; } - return [self::VALUE => self::trim($x_value), self::SIGN => $x_negative]; + + return [ + self::VALUE => self::trim($x_value), + self::SIGN => $x_negative + ]; } + /** * Performs multiplication. * @@ -312,14 +402,25 @@ protected static function multiplyHelper(array $x_value, $x_negative, array $y_v // self::SIGN => $x_sign != $y_value // ]; //} - $x_length = \count($x_value); - $y_length = \count($y_value); - if (!$x_length || !$y_length) { - // a 0 is being multiplied - return [self::VALUE => [], self::SIGN => \false]; + + $x_length = count($x_value); + $y_length = count($y_value); + + if (!$x_length || !$y_length) { // a 0 is being multiplied + return [ + self::VALUE => [], + self::SIGN => false + ]; } - return [self::VALUE => \min($x_length, $y_length) < 2 * self::KARATSUBA_CUTOFF ? self::trim(self::regularMultiply($x_value, $y_value)) : self::trim(self::karatsuba($x_value, $y_value)), self::SIGN => $x_negative != $y_negative]; + + return [ + self::VALUE => min($x_length, $y_length) < 2 * self::KARATSUBA_CUTOFF ? + self::trim(self::regularMultiply($x_value, $y_value)) : + self::trim(self::karatsuba($x_value, $y_value)), + self::SIGN => $x_negative != $y_negative + ]; } + /** * Performs Karatsuba multiplication on two BigIntegers * @@ -332,27 +433,35 @@ protected static function multiplyHelper(array $x_value, $x_negative, array $y_v */ private static function karatsuba(array $x_value, array $y_value) { - $m = \min(\count($x_value) >> 1, \count($y_value) >> 1); + $m = min(count($x_value) >> 1, count($y_value) >> 1); + if ($m < self::KARATSUBA_CUTOFF) { return self::regularMultiply($x_value, $y_value); } - $x1 = \array_slice($x_value, $m); - $x0 = \array_slice($x_value, 0, $m); - $y1 = \array_slice($y_value, $m); - $y0 = \array_slice($y_value, 0, $m); + + $x1 = array_slice($x_value, $m); + $x0 = array_slice($x_value, 0, $m); + $y1 = array_slice($y_value, $m); + $y0 = array_slice($y_value, 0, $m); + $z2 = self::karatsuba($x1, $y1); $z0 = self::karatsuba($x0, $y0); - $z1 = self::addHelper($x1, \false, $x0, \false); - $temp = self::addHelper($y1, \false, $y0, \false); + + $z1 = self::addHelper($x1, false, $x0, false); + $temp = self::addHelper($y1, false, $y0, false); $z1 = self::karatsuba($z1[self::VALUE], $temp[self::VALUE]); - $temp = self::addHelper($z2, \false, $z0, \false); - $z1 = self::subtractHelper($z1, \false, $temp[self::VALUE], \false); - $z2 = \array_merge(\array_fill(0, 2 * $m, 0), $z2); - $z1[self::VALUE] = \array_merge(\array_fill(0, $m, 0), $z1[self::VALUE]); - $xy = self::addHelper($z2, \false, $z1[self::VALUE], $z1[self::SIGN]); - $xy = self::addHelper($xy[self::VALUE], $xy[self::SIGN], $z0, \false); + $temp = self::addHelper($z2, false, $z0, false); + $z1 = self::subtractHelper($z1, false, $temp[self::VALUE], false); + + $z2 = array_merge(array_fill(0, 2 * $m, 0), $z2); + $z1[self::VALUE] = array_merge(array_fill(0, $m, 0), $z1[self::VALUE]); + + $xy = self::addHelper($z2, false, $z1[self::VALUE], $z1[self::SIGN]); + $xy = self::addHelper($xy[self::VALUE], $xy[self::SIGN], $z0, false); + return $xy[self::VALUE]; } + /** * Performs long multiplication on two BigIntegers * @@ -364,40 +473,47 @@ private static function karatsuba(array $x_value, array $y_value) */ protected static function regularMultiply(array $x_value, array $y_value) { - $x_length = \count($x_value); - $y_length = \count($y_value); - if (!$x_length || !$y_length) { - // a 0 is being multiplied + $x_length = count($x_value); + $y_length = count($y_value); + + if (!$x_length || !$y_length) { // a 0 is being multiplied return []; } + $product_value = self::array_repeat(0, $x_length + $y_length); + // the following for loop could be removed if the for loop following it // (the one with nested for loops) initially set $i to 0, but // doing so would also make the result in one set of unnecessary adds, // since on the outermost loops first pass, $product->value[$k] is going // to always be 0 + $carry = 0; - for ($j = 0; $j < $x_length; ++$j) { - // ie. $i = 0 - $temp = $x_value[$j] * $y_value[0] + $carry; - // $product_value[$k] == 0 - $carry = static::BASE === 26 ? \intval($temp / 0x4000000) : $temp >> 31; - $product_value[$j] = (int) ($temp - static::BASE_FULL * $carry); + for ($j = 0; $j < $x_length; ++$j) { // ie. $i = 0 + $temp = $x_value[$j] * $y_value[0] + $carry; // $product_value[$k] == 0 + $carry = static::BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); + $product_value[$j] = (int)($temp - static::BASE_FULL * $carry); } + $product_value[$j] = $carry; + // the above for loop is what the previous comment was talking about. the // following for loop is the "one with nested for loops" for ($i = 1; $i < $y_length; ++$i) { $carry = 0; + for ($j = 0, $k = $i; $j < $x_length; ++$j, ++$k) { $temp = $product_value[$k] + $x_value[$j] * $y_value[$i] + $carry; - $carry = static::BASE === 26 ? \intval($temp / 0x4000000) : $temp >> 31; - $product_value[$k] = (int) ($temp - static::BASE_FULL * $carry); + $carry = static::BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); + $product_value[$k] = (int)($temp - static::BASE_FULL * $carry); } + $product_value[$k] = $carry; } + return $product_value; } + /** * Divides two BigIntegers. * @@ -412,7 +528,7 @@ protected static function regularMultiply(array $x_value, array $y_value) */ protected function divideHelper(PHP $y) { - if (\count($y->value) == 1) { + if (count($y->value) == 1) { list($q, $r) = $this->divide_digit($this->value, $y->value[0]); $quotient = new static(); $remainder = new static(); @@ -424,18 +540,24 @@ protected function divideHelper(PHP $y) $quotient->is_negative = $this->is_negative != $y->is_negative; return [$this->normalize($quotient), $this->normalize($remainder)]; } + $x = clone $this; $y = clone $y; + $x_sign = $x->is_negative; $y_sign = $y->is_negative; - $x->is_negative = $y->is_negative = \false; + + $x->is_negative = $y->is_negative = false; + $diff = $x->compare($y); + if (!$diff) { $temp = new static(); $temp->value = [1]; $temp->is_negative = $x_sign != $y_sign; return [$this->normalize($temp), $this->normalize(static::$zero[static::class])]; } + if ($diff < 0) { // if $x is negative, "add" $y. if ($x_sign) { @@ -443,84 +565,117 @@ protected function divideHelper(PHP $y) } return [$this->normalize(static::$zero[static::class]), $this->normalize($x)]; } + // normalize $x and $y as described in HAC 14.23 / 14.24 - $msb = $y->value[\count($y->value) - 1]; + $msb = $y->value[count($y->value) - 1]; for ($shift = 0; !($msb & static::MSB); ++$shift) { $msb <<= 1; } $x->lshift($shift); $y->lshift($shift); - $y_value =& $y->value; - $x_max = \count($x->value) - 1; - $y_max = \count($y->value) - 1; + $y_value = &$y->value; + + $x_max = count($x->value) - 1; + $y_max = count($y->value) - 1; + $quotient = new static(); - $quotient_value =& $quotient->value; + $quotient_value = &$quotient->value; $quotient_value = self::array_repeat(0, $x_max - $y_max + 1); + static $temp, $lhs, $rhs; if (!isset($temp)) { $temp = new static(); $lhs = new static(); $rhs = new static(); } - if (static::class != \get_class($temp)) { + if (static::class != get_class($temp)) { $temp = new static(); $lhs = new static(); $rhs = new static(); } - $temp_value =& $temp->value; - $rhs_value =& $rhs->value; + $temp_value = &$temp->value; + $rhs_value = &$rhs->value; + // $temp = $y << ($x_max - $y_max-1) in base 2**26 - $temp_value = \array_merge(self::array_repeat(0, $x_max - $y_max), $y_value); + $temp_value = array_merge(self::array_repeat(0, $x_max - $y_max), $y_value); + while ($x->compare($temp) >= 0) { // calculate the "common residue" ++$quotient_value[$x_max - $y_max]; $x = $x->subtract($temp); - $x_max = \count($x->value) - 1; + $x_max = count($x->value) - 1; } + for ($i = $x_max; $i >= $y_max + 1; --$i) { - $x_value =& $x->value; - $x_window = [isset($x_value[$i]) ? $x_value[$i] : 0, isset($x_value[$i - 1]) ? $x_value[$i - 1] : 0, isset($x_value[$i - 2]) ? $x_value[$i - 2] : 0]; - $y_window = [$y_value[$y_max], $y_max > 0 ? $y_value[$y_max - 1] : 0]; + $x_value = &$x->value; + $x_window = [ + isset($x_value[$i]) ? $x_value[$i] : 0, + isset($x_value[$i - 1]) ? $x_value[$i - 1] : 0, + isset($x_value[$i - 2]) ? $x_value[$i - 2] : 0 + ]; + $y_window = [ + $y_value[$y_max], + ($y_max > 0) ? $y_value[$y_max - 1] : 0 + ]; + $q_index = $i - $y_max - 1; if ($x_window[0] == $y_window[0]) { $quotient_value[$q_index] = static::MAX_DIGIT; } else { - $quotient_value[$q_index] = self::safe_divide($x_window[0] * static::BASE_FULL + $x_window[1], $y_window[0]); + $quotient_value[$q_index] = self::safe_divide( + $x_window[0] * static::BASE_FULL + $x_window[1], + $y_window[0] + ); } + $temp_value = [$y_window[1], $y_window[0]]; + $lhs->value = [$quotient_value[$q_index]]; $lhs = $lhs->multiply($temp); + $rhs_value = [$x_window[2], $x_window[1], $x_window[0]]; + while ($lhs->compare($rhs) > 0) { --$quotient_value[$q_index]; + $lhs->value = [$quotient_value[$q_index]]; $lhs = $lhs->multiply($temp); } + $adjust = self::array_repeat(0, $q_index); $temp_value = [$quotient_value[$q_index]]; $temp = $temp->multiply($y); - $temp_value =& $temp->value; - if (\count($temp_value)) { - $temp_value = \array_merge($adjust, $temp_value); + $temp_value = &$temp->value; + if (count($temp_value)) { + $temp_value = array_merge($adjust, $temp_value); } + $x = $x->subtract($temp); + if ($x->compare(static::$zero[static::class]) < 0) { - $temp_value = \array_merge($adjust, $y_value); + $temp_value = array_merge($adjust, $y_value); $x = $x->add($temp); + --$quotient_value[$q_index]; } - $x_max = \count($x_value) - 1; + + $x_max = count($x_value) - 1; } + // unnormalize the remainder $x->rshift($shift); + $quotient->is_negative = $x_sign != $y_sign; + // calculate the "common residue", if appropriate if ($x_sign) { $y->rshift($shift); $x = $y->subtract($x); } + return [$this->normalize($quotient), $this->normalize($x)]; } + /** * Divides a BigInteger by a regular integer * @@ -534,13 +689,16 @@ private static function divide_digit(array $dividend, $divisor) { $carry = 0; $result = []; - for ($i = \count($dividend) - 1; $i >= 0; --$i) { + + for ($i = count($dividend) - 1; $i >= 0; --$i) { $temp = static::BASE_FULL * $carry + $dividend[$i]; $result[$i] = self::safe_divide($temp, $divisor); - $carry = (int) ($temp - $divisor * $result[$i]); + $carry = (int)($temp - $divisor * $result[$i]); } + return [$result, $carry]; } + /** * Single digit division * @@ -556,12 +714,14 @@ private static function divide_digit(array $dividend, $divisor) private static function safe_divide($x, $y) { if (static::BASE === 26) { - return (int) ($x / $y); + return (int)($x / $y); } + // static::BASE === 31 /** @var int */ - return ($x - $x % $y) / $y; + return ($x - ($x % $y)) / $y; } + /** * Convert an array / boolean to a PHP BigInteger object * @@ -573,8 +733,10 @@ protected function convertToObj(array $arr) $result = new static(); $result->value = $arr[self::VALUE]; $result->is_negative = $arr[self::SIGN]; + return $this->normalize($result); } + /** * Normalize * @@ -587,22 +749,30 @@ protected function normalize(PHP $result) { $result->precision = $this->precision; $result->bitmask = $this->bitmask; - $value =& $result->value; - if (!\count($value)) { - $result->is_negative = \false; + + $value = &$result->value; + + if (!count($value)) { + $result->is_negative = false; return $result; } + $value = static::trim($value); + if (!empty($result->bitmask->value)) { - $length = \min(\count($value), \count($result->bitmask->value)); - $value = \array_slice($value, 0, $length); + $length = min(count($value), count($result->bitmask->value)); + $value = array_slice($value, 0, $length); + for ($i = 0; $i < $length; ++$i) { $value[$i] = $value[$i] & $result->bitmask->value[$i]; } + $value = static::trim($value); } + return $result; } + /** * Compares two numbers. * @@ -616,22 +786,28 @@ protected function normalize(PHP $result) protected static function compareHelper(array $x_value, $x_negative, array $y_value, $y_negative) { if ($x_negative != $y_negative) { - return !$x_negative && $y_negative ? 1 : -1; + return (!$x_negative && $y_negative) ? 1 : -1; } + $result = $x_negative ? -1 : 1; - if (\count($x_value) != \count($y_value)) { - return \count($x_value) > \count($y_value) ? $result : -$result; + + if (count($x_value) != count($y_value)) { + return (count($x_value) > count($y_value)) ? $result : -$result; } - $size = \max(\count($x_value), \count($y_value)); - $x_value = \array_pad($x_value, $size, 0); - $y_value = \array_pad($y_value, $size, 0); - for ($i = \count($x_value) - 1; $i >= 0; --$i) { + $size = max(count($x_value), count($y_value)); + + $x_value = array_pad($x_value, $size, 0); + $y_value = array_pad($y_value, $size, 0); + + for ($i = count($x_value) - 1; $i >= 0; --$i) { if ($x_value[$i] != $y_value[$i]) { - return $x_value[$i] > $y_value[$i] ? $result : -$result; + return ($x_value[$i] > $y_value[$i]) ? $result : -$result; } } + return 0; } + /** * Absolute value. * @@ -641,8 +817,10 @@ public function abs() { $temp = new static(); $temp->value = $this->value; + return $temp; } + /** * Trim * @@ -653,14 +831,16 @@ public function abs() */ protected static function trim(array $value) { - for ($i = \count($value) - 1; $i >= 0; --$i) { + for ($i = count($value) - 1; $i >= 0; --$i) { if ($value[$i]) { break; } unset($value[$i]); } + return $value; } + /** * Logical Right Shift * @@ -672,12 +852,15 @@ protected static function trim(array $value) public function bitwise_rightShift($shift) { $temp = new static(); + // could just replace lshift with this, but then all lshift() calls would need to be rewritten // and I don't want to do that... $temp->value = $this->value; $temp->rshift($shift); + return $this->normalize($temp); } + /** * Logical Left Shift * @@ -693,8 +876,10 @@ public function bitwise_leftShift($shift) // and I don't want to do that... $temp->value = $this->value; $temp->lshift($shift); + return $this->normalize($temp); } + /** * Converts 32-bit integers to bytes. * @@ -703,8 +888,9 @@ public function bitwise_leftShift($shift) */ private static function int2bytes($x) { - return \ltrim(\pack('N', $x), \chr(0)); + return ltrim(pack('N', $x), chr(0)); } + /** * Array Repeat * @@ -714,8 +900,9 @@ private static function int2bytes($x) */ protected static function array_repeat($input, $multiplier) { - return $multiplier ? \array_fill(0, $multiplier, $input) : []; + return $multiplier ? array_fill(0, $multiplier, $input) : []; } + /** * Logical Left Shift * @@ -728,22 +915,28 @@ protected function lshift($shift) if ($shift == 0) { return; } - $num_digits = (int) ($shift / static::BASE); + + $num_digits = (int)($shift / static::BASE); $shift %= static::BASE; $shift = 1 << $shift; + $carry = 0; - for ($i = 0; $i < \count($this->value); ++$i) { + + for ($i = 0; $i < count($this->value); ++$i) { $temp = $this->value[$i] * $shift + $carry; - $carry = static::BASE === 26 ? \intval($temp / 0x4000000) : $temp >> 31; - $this->value[$i] = (int) ($temp - $carry * static::BASE_FULL); + $carry = static::BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); + $this->value[$i] = (int)($temp - $carry * static::BASE_FULL); } + if ($carry) { - $this->value[\count($this->value)] = $carry; + $this->value[count($this->value)] = $carry; } + while ($num_digits--) { - \array_unshift($this->value, 0); + array_unshift($this->value, 0); } } + /** * Logical Right Shift * @@ -756,21 +949,27 @@ protected function rshift($shift) if ($shift == 0) { return; } - $num_digits = (int) ($shift / static::BASE); + + $num_digits = (int)($shift / static::BASE); $shift %= static::BASE; $carry_shift = static::BASE - $shift; $carry_mask = (1 << $shift) - 1; + if ($num_digits) { - $this->value = \array_slice($this->value, $num_digits); + $this->value = array_slice($this->value, $num_digits); } + $carry = 0; - for ($i = \count($this->value) - 1; $i >= 0; --$i) { + + for ($i = count($this->value) - 1; $i >= 0; --$i) { $temp = $this->value[$i] >> $shift | $carry; $carry = ($this->value[$i] & $carry_mask) << $carry_shift; $this->value[$i] = $temp; } + $this->value = static::trim($this->value); } + /** * Performs modular exponentiation. * @@ -787,6 +986,7 @@ protected function powModInner(PHP $e, PHP $n) return PHP\DefaultEngine::powModHelper($this, $e, $n, static::class); } } + /** * Performs squaring * @@ -795,8 +995,11 @@ protected function powModInner(PHP $e, PHP $n) */ protected static function square(array $x) { - return \count($x) < 2 * self::KARATSUBA_CUTOFF ? self::trim(self::baseSquare($x)) : self::trim(self::karatsubaSquare($x)); + return count($x) < 2 * self::KARATSUBA_CUTOFF ? + self::trim(self::baseSquare($x)) : + self::trim(self::karatsubaSquare($x)); } + /** * Performs traditional squaring on two BigIntegers * @@ -812,24 +1015,30 @@ protected static function baseSquare(array $value) if (empty($value)) { return []; } - $square_value = self::array_repeat(0, 2 * \count($value)); - for ($i = 0, $max_index = \count($value) - 1; $i <= $max_index; ++$i) { + $square_value = self::array_repeat(0, 2 * count($value)); + + for ($i = 0, $max_index = count($value) - 1; $i <= $max_index; ++$i) { $i2 = $i << 1; + $temp = $square_value[$i2] + $value[$i] * $value[$i]; - $carry = static::BASE === 26 ? \intval($temp / 0x4000000) : $temp >> 31; - $square_value[$i2] = (int) ($temp - static::BASE_FULL * $carry); + $carry = static::BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); + $square_value[$i2] = (int)($temp - static::BASE_FULL * $carry); + // note how we start from $i+1 instead of 0 as we do in multiplication. for ($j = $i + 1, $k = $i2 + 1; $j <= $max_index; ++$j, ++$k) { $temp = $square_value[$k] + 2 * $value[$j] * $value[$i] + $carry; - $carry = static::BASE === 26 ? \intval($temp / 0x4000000) : $temp >> 31; - $square_value[$k] = (int) ($temp - static::BASE_FULL * $carry); + $carry = static::BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); + $square_value[$k] = (int)($temp - static::BASE_FULL * $carry); } + // the following line can yield values larger 2**15. at this point, PHP should switch // over to floats. $square_value[$i + $max_index + 1] = $carry; } + return $square_value; } + /** * Performs Karatsuba "squaring" on two BigIntegers * @@ -841,24 +1050,32 @@ protected static function baseSquare(array $value) */ protected static function karatsubaSquare(array $value) { - $m = \count($value) >> 1; + $m = count($value) >> 1; + if ($m < self::KARATSUBA_CUTOFF) { return self::baseSquare($value); } - $x1 = \array_slice($value, $m); - $x0 = \array_slice($value, 0, $m); + + $x1 = array_slice($value, $m); + $x0 = array_slice($value, 0, $m); + $z2 = self::karatsubaSquare($x1); $z0 = self::karatsubaSquare($x0); - $z1 = self::addHelper($x1, \false, $x0, \false); + + $z1 = self::addHelper($x1, false, $x0, false); $z1 = self::karatsubaSquare($z1[self::VALUE]); - $temp = self::addHelper($z2, \false, $z0, \false); - $z1 = self::subtractHelper($z1, \false, $temp[self::VALUE], \false); - $z2 = \array_merge(\array_fill(0, 2 * $m, 0), $z2); - $z1[self::VALUE] = \array_merge(\array_fill(0, $m, 0), $z1[self::VALUE]); - $xx = self::addHelper($z2, \false, $z1[self::VALUE], $z1[self::SIGN]); - $xx = self::addHelper($xx[self::VALUE], $xx[self::SIGN], $z0, \false); + $temp = self::addHelper($z2, false, $z0, false); + $z1 = self::subtractHelper($z1, false, $temp[self::VALUE], false); + + $z2 = array_merge(array_fill(0, 2 * $m, 0), $z2); + $z1[self::VALUE] = array_merge(array_fill(0, $m, 0), $z1[self::VALUE]); + + $xx = self::addHelper($z2, false, $z1[self::VALUE], $z1[self::SIGN]); + $xx = self::addHelper($xx[self::VALUE], $xx[self::SIGN], $z0, false); + return $xx[self::VALUE]; } + /** * Make the current number odd * @@ -870,6 +1087,7 @@ protected function make_odd() { $this->value[0] |= 1; } + /** * Test the number against small primes. * @@ -878,23 +1096,26 @@ protected function make_odd() protected function testSmallPrimes() { if ($this->value == [1]) { - return \false; + return false; } if ($this->value == [2]) { - return \true; + return true; } if (~$this->value[0] & 1) { - return \false; + return false; } + $value = $this->value; foreach (static::PRIMES as $prime) { list(, $r) = self::divide_digit($value, $prime); if (!$r) { - return \count($value) == 1 && $value[0] == $prime; + return count($value) == 1 && $value[0] == $prime; } } - return \true; + + return true; } + /** * Scan for 1 and right shift by that amount * @@ -906,10 +1127,10 @@ protected function testSmallPrimes() */ public static function scan1divide(PHP $r) { - $r_value =& $r->value; - for ($i = 0, $r_length = \count($r_value); $i < $r_length; ++$i) { + $r_value = &$r->value; + for ($i = 0, $r_length = count($r_value); $i < $r_length; ++$i) { $temp = ~$r_value[$i] & static::MAX_DIGIT; - for ($j = 1; $temp >> $j & 1; ++$j) { + for ($j = 1; ($temp >> $j) & 1; ++$j) { } if ($j <= static::BASE) { break; @@ -919,6 +1140,7 @@ public static function scan1divide(PHP $r) $r->rshift($s); return $s; } + /** * Performs exponentiation. * @@ -929,15 +1151,17 @@ protected function powHelper(PHP $n) { if ($n->compare(static::$zero[static::class]) == 0) { return new static(1); - } - // n^0 = 1 + } // n^0 = 1 + $temp = clone $this; while (!$n->equals(static::$one[static::class])) { $temp = $temp->multiply($this); $n = $n->subtract(static::$one[static::class]); } + return $temp; } + /** * Is Odd? * @@ -945,8 +1169,9 @@ protected function powHelper(PHP $n) */ public function isOdd() { - return (bool) ($this->value[0] & 1); + return (bool)($this->value[0] & 1); } + /** * Tests if a bit is set * @@ -954,13 +1179,16 @@ public function isOdd() */ public function testBit($x) { - $digit = (int) \floor($x / static::BASE); + $digit = (int) floor($x / static::BASE); $bit = $x % static::BASE; + if (!isset($this->value[$digit])) { - return \false; + return false; } - return (bool) ($this->value[$digit] & 1 << $bit); + + return (bool)($this->value[$digit] & (1 << $bit)); } + /** * Is Negative? * @@ -970,6 +1198,7 @@ public function isNegative() { return $this->is_negative; } + /** * Negate * @@ -981,8 +1210,10 @@ public function negate() { $temp = clone $this; $temp->is_negative = !$temp->is_negative; + return $temp; } + /** * Bitwise Split * @@ -996,23 +1227,26 @@ public function bitwise_split($split) if ($split < 1) { throw new \RuntimeException('Offset must be greater than 1'); } - $width = (int) ($split / static::BASE); + + $width = (int)($split / static::BASE); if (!$width) { $arr = $this->bitwise_small_split($split); - return \array_map(function ($digit) { + return array_map(function ($digit) { $temp = new static(); $temp->value = $digit != 0 ? [$digit] : []; return $temp; }, $arr); } + $vals = []; $val = $this->value; + $i = $overflow = 0; - $len = \count($val); + $len = count($val); while ($i < $len) { $digit = []; if (!$overflow) { - $digit = \array_slice($val, $i, $width); + $digit = array_slice($val, $i, $width); $i += $width; $overflow = $split % static::BASE; if ($overflow) { @@ -1023,8 +1257,8 @@ public function bitwise_split($split) } else { $remaining = static::BASE - $overflow; $tempsplit = $split - $remaining; - $tempwidth = (int) ($tempsplit / static::BASE + 1); - $digit = \array_slice($val, $i, $tempwidth); + $tempwidth = (int)($tempsplit / static::BASE + 1); + $digit = array_slice($val, $i, $tempwidth); $i += $tempwidth; $tempoverflow = $tempsplit % static::BASE; if ($tempoverflow) { @@ -1033,9 +1267,9 @@ public function bitwise_split($split) $digit[] = $temp & $tempmask; } $newbits = 0; - for ($j = \count($digit) - 1; $j >= 0; $j--) { + for ($j = count($digit) - 1; $j >= 0; $j--) { $temp = $digit[$j] & $mask; - $digit[$j] = $digit[$j] >> $overflow | $newbits << $remaining; + $digit[$j] = ($digit[$j] >> $overflow) | ($newbits << $remaining); $newbits = $temp; } $overflow = $tempoverflow; @@ -1045,8 +1279,10 @@ public function bitwise_split($split) $temp->value = static::trim($digit); $vals[] = $temp; } - return \array_reverse($vals); + + return array_reverse($vals); } + /** * Bitwise Split where $split < static::BASE * @@ -1057,9 +1293,11 @@ private function bitwise_small_split($split) { $vals = []; $val = $this->value; + $mask = (1 << $split) - 1; + $i = $overflow = 0; - $len = \count($val); + $len = count($val); $val[] = 0; $remaining = static::BASE; while ($i != $len) { @@ -1068,6 +1306,7 @@ private function bitwise_small_split($split) if (!$overflow) { $remaining -= $split; $overflow = $split <= $remaining ? 0 : $split - $remaining; + if (!$remaining) { $i++; $remaining = static::BASE; @@ -1080,27 +1319,32 @@ private function bitwise_small_split($split) $remaining = static::BASE - $overflow; $overflow = $split <= $remaining ? 0 : $split - $remaining; } + $vals[] = $digit; } - while ($vals[\count($vals) - 1] == 0) { - unset($vals[\count($vals) - 1]); + + while ($vals[count($vals) - 1] == 0) { + unset($vals[count($vals) - 1]); } - return \array_reverse($vals); + + return array_reverse($vals); } + /** * @return bool */ protected static function testJITOnWindows() { // see https://github.com/php/php-src/issues/11917 - if (\strtoupper(\substr(\PHP_OS, 0, 3)) === 'WIN' && \function_exists('opcache_get_status') && \PHP_VERSION_ID < 80213 && !\defined('PHPSECLIB_ALLOW_JIT')) { - $status = \opcache_get_status(); + if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN' && function_exists('opcache_get_status') && PHP_VERSION_ID < 80213 && !defined('PHPSECLIB_ALLOW_JIT')) { + $status = opcache_get_status(); if ($status && isset($status['jit']) && $status['jit']['enabled'] && $status['jit']['on']) { - return \true; + return true; } } - return \false; + return false; } + /** * Return the size of a BigInteger in bits * @@ -1108,7 +1352,9 @@ protected static function testJITOnWindows() */ public function getLength() { - $max = \count($this->value) - 1; - return $max != -1 ? $max * static::BASE + \intval(\ceil(\log($this->value[$max] + 1, 2))) : 0; + $max = count($this->value) - 1; + return $max != -1 ? + $max * static::BASE + intval(ceil(log($this->value[$max] + 1, 2))) : + 0; } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Base.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Base.php index 8cdf059..ffc7e45 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Base.php +++ b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Base.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\PHP; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\PHP; + /** * PHP Modular Exponentiation Engine * * @author Jim Wigginton - * @internal */ abstract class Base extends PHP { @@ -33,6 +34,7 @@ abstract class Base extends PHP * */ const DATA = 1; + /** * Test for engine validity * @@ -42,6 +44,7 @@ public static function isValidEngine() { return static::class != __CLASS__; } + /** * Performs modular exponentiation. * @@ -78,18 +81,22 @@ protected static function powModHelper(PHP $x, PHP $e, PHP $n, $class) $temp->value = [1]; return $x->normalize($temp); } + if ($e->value == [1]) { list(, $temp) = $x->divide($n); return $x->normalize($temp); } + if ($e->value == [2]) { $temp = new $class(); $temp->value = $class::square($x->value); list(, $temp) = $temp->divide($n); return $x->normalize($temp); } + return $x->normalize(static::slidingWindow($x, $e, $n, $class)); } + /** * Modular reduction preparation * @@ -103,6 +110,7 @@ protected static function prepareReduce(array $x, array $n, $class) { return static::reduce($x, $n, $class); } + /** * Modular multiply * @@ -115,9 +123,10 @@ protected static function prepareReduce(array $x, array $n, $class) */ protected static function multiplyReduce(array $x, array $y, array $n, $class) { - $temp = $class::multiplyHelper($x, \false, $y, \false); + $temp = $class::multiplyHelper($x, false, $y, false); return static::reduce($temp[self::VALUE], $n, $class); } + /** * Modular square * diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/DefaultEngine.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/DefaultEngine.php index 0958afa..c0c7f29 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/DefaultEngine.php +++ b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/DefaultEngine.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\PHP; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\PHP\Reductions\EvalBarrett; + /** * PHP Default Modular Exponentiation Engine * * @author Jim Wigginton - * @internal */ abstract class DefaultEngine extends EvalBarrett { diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Montgomery.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Montgomery.php index 3766a56..b352f58 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Montgomery.php +++ b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Montgomery.php @@ -10,16 +10,17 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\PHP; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\Engine; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\PHP; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\PHP\Reductions\PowerOfTwo; + /** * PHP Montgomery Modular Exponentiation Engine * * @author Jim Wigginton - * @internal */ abstract class Montgomery extends Base { @@ -32,6 +33,7 @@ public static function isValidEngine() { return static::class != __CLASS__; } + /** * Performs modular exponentiation. * @@ -49,31 +51,39 @@ protected static function slidingWindow(Engine $x, Engine $e, Engine $n, $class) return parent::slidingWindow($x, $e, $n, $class); } // if it's not, it's even + // find the lowest set bit (eg. the max pow of 2 that divides $n) - for ($i = 0; $i < \count($n->value); ++$i) { + for ($i = 0; $i < count($n->value); ++$i) { if ($n->value[$i]) { - $temp = \decbin($n->value[$i]); - $j = \strlen($temp) - \strrpos($temp, '1') - 1; + $temp = decbin($n->value[$i]); + $j = strlen($temp) - strrpos($temp, '1') - 1; $j += $class::BASE * $i; break; } } // at this point, 2^$j * $n/(2^$j) == $n + $mod1 = clone $n; $mod1->rshift($j); $mod2 = new $class(); $mod2->value = [1]; $mod2->lshift($j); + $part1 = $mod1->value != [1] ? parent::slidingWindow($x, $e, $mod1, $class) : new $class(); $part2 = PowerOfTwo::slidingWindow($x, $e, $mod2, $class); + $y1 = $mod2->modInverse($mod1); $y2 = $mod1->modInverse($mod2); + $result = $part1->multiply($mod2); $result = $result->multiply($y1); + $temp = $part2->multiply($mod1); $temp = $temp->multiply($y2); + $result = $result->add($temp); list(, $result) = $result->divide($n); + return $result; } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/OpenSSL.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/OpenSSL.php index 0924c60..1a0d6db 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/OpenSSL.php +++ b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/OpenSSL.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\PHP; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\OpenSSL as Progenitor; + /** * OpenSSL Modular Exponentiation Engine * * @author Jim Wigginton - * @internal */ abstract class OpenSSL extends Progenitor { diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Barrett.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Barrett.php index 3bdca94..6efff37 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Barrett.php +++ b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Barrett.php @@ -10,15 +10,16 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\PHP\Reductions; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\PHP; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\PHP\Base; + /** * PHP Barrett Modular Exponentiation Engine * * @author Jim Wigginton - * @internal */ abstract class Barrett extends Base { @@ -47,10 +48,15 @@ abstract class Barrett extends Base */ protected static function reduce(array $n, array $m, $class) { - static $cache = [self::VARIABLE => [], self::DATA => []]; - $m_length = \count($m); + static $cache = [ + self::VARIABLE => [], + self::DATA => [] + ]; + + $m_length = count($m); + // if (self::compareHelper($n, $static::square($m)) >= 0) { - if (\count($n) > 2 * $m_length) { + if (count($n) > 2 * $m_length) { $lhs = new $class(); $rhs = new $class(); $lhs->value = $n; @@ -58,80 +64,87 @@ protected static function reduce(array $n, array $m, $class) list(, $temp) = $lhs->divide($rhs); return $temp->value; } + // if (m.length >> 1) + 2 <= m.length then m is too small and n can't be reduced if ($m_length < 5) { return self::regularBarrett($n, $m, $class); } // n = 2 * m.length - $correctionNeeded = \false; + $correctionNeeded = false; if ($m_length & 1) { - $correctionNeeded = \true; - \array_unshift($n, 0); - \array_unshift($m, 0); + $correctionNeeded = true; + array_unshift($n, 0); + array_unshift($m, 0); $m_length++; } - if (($key = \array_search($m, $cache[self::VARIABLE])) === \false) { - $key = \count($cache[self::VARIABLE]); + + if (($key = array_search($m, $cache[self::VARIABLE])) === false) { + $key = count($cache[self::VARIABLE]); $cache[self::VARIABLE][] = $m; + $lhs = new $class(); - $lhs_value =& $lhs->value; + $lhs_value = &$lhs->value; $lhs_value = self::array_repeat(0, $m_length + ($m_length >> 1)); $lhs_value[] = 1; $rhs = new $class(); $rhs->value = $m; + list($u, $m1) = $lhs->divide($rhs); $u = $u->value; $m1 = $m1->value; + $cache[self::DATA][] = [ - 'u' => $u, - // m.length >> 1 (technically (m.length >> 1) + 1) - 'm1' => $m1, + 'u' => $u, // m.length >> 1 (technically (m.length >> 1) + 1) + 'm1' => $m1 // m.length ]; } else { $cacheValues = $cache[self::DATA][$key]; $u = $cacheValues['u']; $m1 = $cacheValues['m1']; } + $cutoff = $m_length + ($m_length >> 1); - $lsd = \array_slice($n, 0, $cutoff); - // m.length + (m.length >> 1) - $msd = \array_slice($n, $cutoff); - // m.length >> 1 + $lsd = array_slice($n, 0, $cutoff); // m.length + (m.length >> 1) + $msd = array_slice($n, $cutoff); // m.length >> 1 + $lsd = self::trim($lsd); - $temp = $class::multiplyHelper($msd, \false, $m1, \false); - // m.length + (m.length >> 1) - $n = $class::addHelper($lsd, \false, $temp[self::VALUE], \false); - // m.length + (m.length >> 1) + 1 (so basically we're adding two same length numbers) + $temp = $class::multiplyHelper($msd, false, $m1, false); // m.length + (m.length >> 1) + $n = $class::addHelper($lsd, false, $temp[self::VALUE], false); // m.length + (m.length >> 1) + 1 (so basically we're adding two same length numbers) //if ($m_length & 1) { // return self::regularBarrett($n[self::VALUE], $m, $class); //} + // (m.length + (m.length >> 1) + 1) - (m.length - 1) == (m.length >> 1) + 2 - $temp = \array_slice($n[self::VALUE], $m_length - 1); + $temp = array_slice($n[self::VALUE], $m_length - 1); // if even: ((m.length >> 1) + 2) + (m.length >> 1) == m.length + 2 // if odd: ((m.length >> 1) + 2) + (m.length >> 1) == (m.length - 1) + 2 == m.length + 1 // note that these are upper bounds. let's say m.length is 2. then you'd be multiplying a // 3 digit number by a 1 digit number. if you're doing 999 * 9 (in base 10) the result will // be a 4 digit number. but if you're multiplying 111 * 1 then the result will be a 3 digit // number. - $temp = $class::multiplyHelper($temp, \false, $u, \false); + $temp = $class::multiplyHelper($temp, false, $u, false); // if even: (m.length + 2) - ((m.length >> 1) + 1) = m.length - (m.length >> 1) + 1 // if odd: (m.length + 1) - ((m.length >> 1) + 1) = m.length - (m.length >> 1) - $temp = \array_slice($temp[self::VALUE], ($m_length >> 1) + 1); + $temp = array_slice($temp[self::VALUE], ($m_length >> 1) + 1); // if even: (m.length - (m.length >> 1) + 1) + m.length = 2 * m.length - (m.length >> 1) + 1 // if odd: (m.length - (m.length >> 1)) + m.length = 2 * m.length - (m.length >> 1) - $temp = $class::multiplyHelper($temp, \false, $m, \false); + $temp = $class::multiplyHelper($temp, false, $m, false); // at this point, if m had an odd number of digits, we'd (probably) be subtracting a 2 * m.length - (m.length >> 1) // digit number from a m.length + (m.length >> 1) + 1 digit number. ie. there'd be an extra digit and the while loop // following this comment would loop a lot (hence our calling _regularBarrett() in that situation). - $result = $class::subtractHelper($n[self::VALUE], \false, $temp[self::VALUE], \false); - while (self::compareHelper($result[self::VALUE], $result[self::SIGN], $m, \false) >= 0) { - $result = $class::subtractHelper($result[self::VALUE], $result[self::SIGN], $m, \false); + $result = $class::subtractHelper($n[self::VALUE], false, $temp[self::VALUE], false); + + while (self::compareHelper($result[self::VALUE], $result[self::SIGN], $m, false) >= 0) { + $result = $class::subtractHelper($result[self::VALUE], $result[self::SIGN], $m, false); } + if ($correctionNeeded) { - \array_shift($result[self::VALUE]); + array_shift($result[self::VALUE]); } + return $result[self::VALUE]; } + /** * (Regular) Barrett Modular Reduction * @@ -145,9 +158,14 @@ protected static function reduce(array $n, array $m, $class) */ private static function regularBarrett(array $x, array $n, $class) { - static $cache = [self::VARIABLE => [], self::DATA => []]; - $n_length = \count($n); - if (\count($x) > 2 * $n_length) { + static $cache = [ + self::VARIABLE => [], + self::DATA => [] + ]; + + $n_length = count($n); + + if (count($x) > 2 * $n_length) { $lhs = new $class(); $rhs = new $class(); $lhs->value = $x; @@ -155,43 +173,49 @@ private static function regularBarrett(array $x, array $n, $class) list(, $temp) = $lhs->divide($rhs); return $temp->value; } - if (($key = \array_search($n, $cache[self::VARIABLE])) === \false) { - $key = \count($cache[self::VARIABLE]); + + if (($key = array_search($n, $cache[self::VARIABLE])) === false) { + $key = count($cache[self::VARIABLE]); $cache[self::VARIABLE][] = $n; $lhs = new $class(); - $lhs_value =& $lhs->value; + $lhs_value = &$lhs->value; $lhs_value = self::array_repeat(0, 2 * $n_length); $lhs_value[] = 1; $rhs = new $class(); $rhs->value = $n; - list($temp, ) = $lhs->divide($rhs); - // m.length + list($temp, ) = $lhs->divide($rhs); // m.length $cache[self::DATA][] = $temp->value; } + // 2 * m.length - (m.length - 1) = m.length + 1 - $temp = \array_slice($x, $n_length - 1); + $temp = array_slice($x, $n_length - 1); // (m.length + 1) + m.length = 2 * m.length + 1 - $temp = $class::multiplyHelper($temp, \false, $cache[self::DATA][$key], \false); + $temp = $class::multiplyHelper($temp, false, $cache[self::DATA][$key], false); // (2 * m.length + 1) - (m.length - 1) = m.length + 2 - $temp = \array_slice($temp[self::VALUE], $n_length + 1); + $temp = array_slice($temp[self::VALUE], $n_length + 1); + // m.length + 1 - $result = \array_slice($x, 0, $n_length + 1); + $result = array_slice($x, 0, $n_length + 1); // m.length + 1 - $temp = self::multiplyLower($temp, \false, $n, \false, $n_length + 1, $class); + $temp = self::multiplyLower($temp, false, $n, false, $n_length + 1, $class); // $temp == array_slice($class::regularMultiply($temp, false, $n, false)->value, 0, $n_length + 1) - if (self::compareHelper($result, \false, $temp[self::VALUE], $temp[self::SIGN]) < 0) { + + if (self::compareHelper($result, false, $temp[self::VALUE], $temp[self::SIGN]) < 0) { $corrector_value = self::array_repeat(0, $n_length + 1); - $corrector_value[\count($corrector_value)] = 1; - $result = $class::addHelper($result, \false, $corrector_value, \false); + $corrector_value[count($corrector_value)] = 1; + $result = $class::addHelper($result, false, $corrector_value, false); $result = $result[self::VALUE]; } + // at this point, we're subtracting a number with m.length + 1 digits from another number with m.length + 1 digits - $result = $class::subtractHelper($result, \false, $temp[self::VALUE], $temp[self::SIGN]); - while (self::compareHelper($result[self::VALUE], $result[self::SIGN], $n, \false) > 0) { - $result = $class::subtractHelper($result[self::VALUE], $result[self::SIGN], $n, \false); + $result = $class::subtractHelper($result, false, $temp[self::VALUE], $temp[self::SIGN]); + while (self::compareHelper($result[self::VALUE], $result[self::SIGN], $n, false) > 0) { + $result = $class::subtractHelper($result[self::VALUE], $result[self::SIGN], $n, false); } + return $result[self::VALUE]; } + /** * Performs long multiplication up to $stop digits * @@ -208,49 +232,65 @@ private static function regularBarrett(array $x, array $n, $class) */ private static function multiplyLower(array $x_value, $x_negative, array $y_value, $y_negative, $stop, $class) { - $x_length = \count($x_value); - $y_length = \count($y_value); - if (!$x_length || !$y_length) { - // a 0 is being multiplied - return [self::VALUE => [], self::SIGN => \false]; + $x_length = count($x_value); + $y_length = count($y_value); + + if (!$x_length || !$y_length) { // a 0 is being multiplied + return [ + self::VALUE => [], + self::SIGN => false + ]; } + if ($x_length < $y_length) { $temp = $x_value; $x_value = $y_value; $y_value = $temp; - $x_length = \count($x_value); - $y_length = \count($y_value); + + $x_length = count($x_value); + $y_length = count($y_value); } + $product_value = self::array_repeat(0, $x_length + $y_length); + // the following for loop could be removed if the for loop following it // (the one with nested for loops) initially set $i to 0, but // doing so would also make the result in one set of unnecessary adds, // since on the outermost loops first pass, $product->value[$k] is going // to always be 0 + $carry = 0; - for ($j = 0; $j < $x_length; ++$j) { - // ie. $i = 0, $k = $i - $temp = $x_value[$j] * $y_value[0] + $carry; - // $product_value[$k] == 0 - $carry = $class::BASE === 26 ? \intval($temp / 0x4000000) : $temp >> 31; + + for ($j = 0; $j < $x_length; ++$j) { // ie. $i = 0, $k = $i + $temp = $x_value[$j] * $y_value[0] + $carry; // $product_value[$k] == 0 + $carry = $class::BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); $product_value[$j] = (int) ($temp - $class::BASE_FULL * $carry); } + if ($j < $stop) { $product_value[$j] = $carry; } + // the above for loop is what the previous comment was talking about. the // following for loop is the "one with nested for loops" + for ($i = 1; $i < $y_length; ++$i) { $carry = 0; + for ($j = 0, $k = $i; $j < $x_length && $k < $stop; ++$j, ++$k) { $temp = $product_value[$k] + $x_value[$j] * $y_value[$i] + $carry; - $carry = $class::BASE === 26 ? \intval($temp / 0x4000000) : $temp >> 31; + $carry = $class::BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); $product_value[$k] = (int) ($temp - $class::BASE_FULL * $carry); } + if ($k < $stop) { $product_value[$k] = $carry; } } - return [self::VALUE => self::trim($product_value), self::SIGN => $x_negative != $y_negative]; + + return [ + self::VALUE => self::trim($product_value), + self::SIGN => $x_negative != $y_negative + ]; } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Classic.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Classic.php index 04fa38a..cc1d4a2 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Classic.php +++ b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Classic.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\PHP\Reductions; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\PHP\Base; + /** * PHP Classic Modular Exponentiation Engine * * @author Jim Wigginton - * @internal */ abstract class Classic extends Base { diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/EvalBarrett.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/EvalBarrett.php index 778cffe..a7dd7c4 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/EvalBarrett.php +++ b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/EvalBarrett.php @@ -10,15 +10,16 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\PHP\Reductions; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\PHP; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\PHP\Base; + /** * PHP Dynamic Barrett Modular Exponentiation Engine * * @author Jim Wigginton - * @internal */ abstract class EvalBarrett extends Base { @@ -28,6 +29,7 @@ abstract class EvalBarrett extends Base * @see self::generateCustomReduction */ private static $custom_reduction; + /** * Barrett Modular Reduction * @@ -44,6 +46,7 @@ protected static function reduce(array $n, array $m, $class) $inline = self::$custom_reduction; return $inline($n); } + /** * Generate Custom Reduction * @@ -53,13 +56,15 @@ protected static function reduce(array $n, array $m, $class) */ protected static function generateCustomReduction(PHP $m, $class) { - $m_length = \count($m->value); + $m_length = count($m->value); + if ($m_length < 5) { $code = ' $lhs = new ' . $class . '(); $lhs->value = $x; $rhs = new ' . $class . '(); - $rhs->value = [' . \implode(',', \array_map(self::class . '::float2string', $m->value)) . ']; + $rhs->value = [' . + implode(',', array_map(self::class . '::float2string', $m->value)) . ']; list(, $temp) = $lhs->divide($rhs); return $temp->value; '; @@ -68,72 +73,101 @@ protected static function generateCustomReduction(PHP $m, $class) //self::$custom_reduction = \Closure::bind($func, $m, $class); return $func; } - $correctionNeeded = \false; + + $correctionNeeded = false; if ($m_length & 1) { - $correctionNeeded = \true; + $correctionNeeded = true; $m = clone $m; - \array_unshift($m->value, 0); + array_unshift($m->value, 0); $m_length++; } + $lhs = new $class(); - $lhs_value =& $lhs->value; + $lhs_value = &$lhs->value; + $lhs_value = self::array_repeat(0, $m_length + ($m_length >> 1)); $lhs_value[] = 1; $rhs = new $class(); + list($u, $m1) = $lhs->divide($m); + if ($class::BASE != 26) { $u = $u->value; } else { $lhs_value = self::array_repeat(0, 2 * $m_length); $lhs_value[] = 1; $rhs = new $class(); + list($u) = $lhs->divide($m); $u = $u->value; } + $m = $m->value; $m1 = $m1->value; - $cutoff = \count($m) + (\count($m) >> 1); - $code = $correctionNeeded ? 'array_unshift($n, 0);' : ''; + + $cutoff = count($m) + (count($m) >> 1); + + $code = $correctionNeeded ? + 'array_unshift($n, 0);' : + ''; + $code .= ' - if (count($n) > ' . 2 * \count($m) . ') { + if (count($n) > ' . (2 * count($m)) . ') { $lhs = new ' . $class . '(); $rhs = new ' . $class . '(); $lhs->value = $n; - $rhs->value = [' . \implode(',', \array_map(self::class . '::float2string', $m)) . ']; + $rhs->value = [' . + implode(',', array_map(self::class . '::float2string', $m)) . ']; list(, $temp) = $lhs->divide($rhs); return $temp->value; } $lsd = array_slice($n, 0, ' . $cutoff . '); $msd = array_slice($n, ' . $cutoff . ');'; + $code .= self::generateInlineTrim('msd'); $code .= self::generateInlineMultiply('msd', $m1, 'temp', $class); $code .= self::generateInlineAdd('lsd', 'temp', 'n', $class); - $code .= '$temp = array_slice($n, ' . (\count($m) - 1) . ');'; + + $code .= '$temp = array_slice($n, ' . (count($m) - 1) . ');'; $code .= self::generateInlineMultiply('temp', $u, 'temp2', $class); $code .= self::generateInlineTrim('temp2'); - $code .= $class::BASE == 26 ? '$temp = array_slice($temp2, ' . (\count($m) + 1) . ');' : '$temp = array_slice($temp2, ' . ((\count($m) >> 1) + 1) . ');'; + + $code .= $class::BASE == 26 ? + '$temp = array_slice($temp2, ' . (count($m) + 1) . ');' : + '$temp = array_slice($temp2, ' . ((count($m) >> 1) + 1) . ');'; $code .= self::generateInlineMultiply('temp', $m, 'temp2', $class); $code .= self::generateInlineTrim('temp2'); + /* if ($class::BASE == 26) { $code.= '$n = array_slice($n, 0, ' . (count($m) + 1) . '); $temp2 = array_slice($temp2, 0, ' . (count($m) + 1) . ');'; } */ + $code .= self::generateInlineSubtract2('n', 'temp2', 'temp', $class); + $subcode = self::generateInlineSubtract1('temp', $m, 'temp2', $class); $subcode .= '$temp = $temp2;'; + $code .= self::generateInlineCompare($m, 'temp', $subcode); + if ($correctionNeeded) { $code .= 'array_shift($temp);'; } + $code .= 'return $temp;'; + eval('$func = function ($n) { ' . $code . '};'); + self::$custom_reduction = $func; + return $func; + //self::$custom_reduction = \Closure::bind($func, $m, $class); } + /** * Inline Trim * @@ -152,6 +186,7 @@ private static function generateInlineTrim($name) unset($' . $name . '[$i]); }'; } + /** * Inline Multiply (unknown, known) * @@ -163,52 +198,70 @@ private static function generateInlineTrim($name) */ private static function generateInlineMultiply($input, array $arr, $output, $class) { - if (!\count($arr)) { + if (!count($arr)) { return 'return [];'; } + $regular = ' $length = count($' . $input . '); if (!$length) { $' . $output . ' = []; }else{ - $' . $output . ' = array_fill(0, $length + ' . \count($arr) . ', 0); + $' . $output . ' = array_fill(0, $length + ' . count($arr) . ', 0); $carry = 0;'; - for ($i = 0; $i < \count($arr); $i++) { + + for ($i = 0; $i < count($arr); $i++) { $regular .= ' $subtemp = $' . $input . '[0] * ' . $arr[$i]; $regular .= $i ? ' + $carry;' : ';'; + $regular .= '$carry = '; - $regular .= $class::BASE === 26 ? 'intval($subtemp / 0x4000000);' : '$subtemp >> 31;'; - $regular .= '$' . $output . '[' . $i . '] = '; + $regular .= $class::BASE === 26 ? + 'intval($subtemp / 0x4000000);' : + '$subtemp >> 31;'; + $regular .= + '$' . $output . '[' . $i . '] = '; if ($class::BASE === 26) { $regular .= '(int) ('; } $regular .= '$subtemp - ' . $class::BASE_FULL . ' * $carry'; $regular .= $class::BASE === 26 ? ');' : ';'; } - $regular .= '$' . $output . '[' . \count($arr) . '] = $carry;'; + + $regular .= '$' . $output . '[' . count($arr) . '] = $carry;'; + $regular .= ' for ($i = 1; $i < $length; ++$i) {'; - for ($j = 0; $j < \count($arr); $j++) { + + for ($j = 0; $j < count($arr); $j++) { $regular .= $j ? '$k++;' : '$k = $i;'; $regular .= ' $subtemp = $' . $output . '[$k] + $' . $input . '[$i] * ' . $arr[$j]; $regular .= $j ? ' + $carry;' : ';'; + $regular .= '$carry = '; - $regular .= $class::BASE === 26 ? 'intval($subtemp / 0x4000000);' : '$subtemp >> 31;'; - $regular .= '$' . $output . '[$k] = '; + $regular .= $class::BASE === 26 ? + 'intval($subtemp / 0x4000000);' : + '$subtemp >> 31;'; + $regular .= + '$' . $output . '[$k] = '; if ($class::BASE === 26) { $regular .= '(int) ('; } $regular .= '$subtemp - ' . $class::BASE_FULL . ' * $carry'; $regular .= $class::BASE === 26 ? ');' : ';'; } + $regular .= '$' . $output . '[++$k] = $carry; $carry = 0;'; + $regular .= '}}'; + //if (count($arr) < 2 * self::KARATSUBA_CUTOFF) { //} + return $regular; } + /** * Inline Addition * @@ -231,8 +284,11 @@ private static function generateInlineAdd($x, $y, $result, $class) $carry; $carry = $sum >= ' . self::float2string($class::MAX_DIGIT2) . '; $sum = $carry ? $sum - ' . self::float2string($class::MAX_DIGIT2) . ' : $sum;'; - $code .= $class::BASE === 26 ? '$upper = intval($sum / 0x4000000); $' . $result . '[$i] = (int) ($sum - ' . $class::BASE_FULL . ' * $upper);' : '$upper = $sum >> 31; $' . $result . '[$i] = $sum - ' . $class::BASE_FULL . ' * $upper;'; - $code .= ' + + $code .= $class::BASE === 26 ? + '$upper = intval($sum / 0x4000000); $' . $result . '[$i] = (int) ($sum - ' . $class::BASE_FULL . ' * $upper);' : + '$upper = $sum >> 31; $' . $result . '[$i] = $sum - ' . $class::BASE_FULL . ' * $upper;'; + $code .= ' $' . $result . '[$j] = $upper; } if ($j == $length) { @@ -247,9 +303,11 @@ private static function generateInlineAdd($x, $y, $result, $class) } ++$' . $result . '[$i]; }'; - $code .= self::generateInlineTrim($result); - return $code; + $code .= self::generateInlineTrim($result); + + return $code; } + /** * Inline Subtraction 2 * @@ -276,7 +334,9 @@ private static function generateInlineSubtract2($known, $unknown, $result, $clas $sum+= ' . self::float2string($class::MAX_DIGIT2) . '; } $subtemp = '; - $code .= $class::BASE === 26 ? 'intval($sum / 0x4000000);' : '$sum >> 31;'; + $code .= $class::BASE === 26 ? + 'intval($sum / 0x4000000);' : + '$sum >> 31;'; $code .= '$' . $result . '[$i] = '; if ($class::BASE === 26) { $code .= '(int) ('; @@ -301,9 +361,12 @@ private static function generateInlineSubtract2($known, $unknown, $result, $clas } --$' . $result . '[$i]; }'; + $code .= self::generateInlineTrim($result); + return $code; } + /** * Inline Subtraction 1 * @@ -318,18 +381,21 @@ private static function generateInlineSubtract2($known, $unknown, $result, $clas private static function generateInlineSubtract1($unknown, array $known, $result, $class) { $code = '$' . $result . ' = $' . $unknown . ';'; - for ($i = 0, $j = 1; $j < \count($known); $i += 2, $j += 2) { + for ($i = 0, $j = 1; $j < count($known); $i += 2, $j += 2) { $code .= '$sum = $' . $unknown . '[' . $j . '] * ' . $class::BASE_FULL . ' + $' . $unknown . '[' . $i . '] - '; $code .= self::float2string($known[$j] * $class::BASE_FULL + $known[$i]); if ($i != 0) { $code .= ' - $carry'; } + $code .= '; if ($carry = $sum < 0) { $sum+= ' . self::float2string($class::MAX_DIGIT2) . '; } $subtemp = '; - $code .= $class::BASE === 26 ? 'intval($sum / 0x4000000);' : '$sum >> 31;'; + $code .= $class::BASE === 26 ? + 'intval($sum / 0x4000000);' : + '$sum >> 31;'; $code .= ' $' . $result . '[' . $i . '] = '; if ($class::BASE === 26) { @@ -342,14 +408,17 @@ private static function generateInlineSubtract1($unknown, array $known, $result, $code .= '; $' . $result . '[' . $j . '] = $subtemp;'; } + $code .= '$i = ' . $i . ';'; - if ($j == \count($known)) { + + if ($j == count($known)) { $code .= ' $sum = $' . $unknown . '[' . $i . '] - ' . $known[$i] . ' - $carry; $carry = $sum < 0; $' . $result . '[' . $i . '] = $carry ? $sum + ' . $class::BASE_FULL . ' : $sum; ++$i;'; } + $code .= ' if ($carry) { for (; !$' . $result . '[$i]; ++$i) { @@ -358,8 +427,10 @@ private static function generateInlineSubtract1($unknown, array $known, $result, --$' . $result . '[$i]; }'; $code .= self::generateInlineTrim($result); + return $code; } + /** * Inline Comparison * @@ -372,14 +443,14 @@ private static function generateInlineSubtract1($unknown, array $known, $result, */ private static function generateInlineCompare(array $known, $unknown, $subcode) { - $uniqid = \uniqid(); + $uniqid = uniqid(); $code = 'loop_' . $uniqid . ': $clength = count($' . $unknown . '); switch (true) { - case $clength < ' . \count($known) . ': + case $clength < ' . count($known) . ': goto end_' . $uniqid . '; - case $clength > ' . \count($known) . ':'; - for ($i = \count($known) - 1; $i >= 0; $i--) { + case $clength > ' . count($known) . ':'; + for ($i = count($known) - 1; $i >= 0; $i--) { $code .= ' case $' . $unknown . '[' . $i . '] > ' . $known[$i] . ': goto subcode_' . $uniqid . '; @@ -395,8 +466,10 @@ private static function generateInlineCompare(array $known, $unknown, $subcode) goto loop_' . $uniqid . '; end_' . $uniqid . ':'; + return $code; } + /** * Convert a float to a string * @@ -408,17 +481,20 @@ private static function generateInlineCompare(array $known, $unknown, $subcode) */ private static function float2string($num) { - if (!\is_float($num)) { + if (!is_float($num)) { return (string) $num; } + if ($num < 0) { - return '-' . self::float2string(\abs($num)); + return '-' . self::float2string(abs($num)); } + $temp = ''; while ($num) { - $temp = \fmod($num, 10) . $temp; - $num = \floor($num / 10); + $temp = fmod($num, 10) . $temp; + $num = floor($num / 10); } + return $temp; } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Montgomery.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Montgomery.php index 2a19187..8e201a1 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Montgomery.php +++ b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Montgomery.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\PHP\Reductions; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\PHP\Montgomery as Progenitor; + /** * PHP Montgomery Modular Exponentiation Engine * * @author Jim Wigginton - * @internal */ abstract class Montgomery extends Progenitor { @@ -32,12 +33,14 @@ abstract class Montgomery extends Progenitor protected static function prepareReduce(array $x, array $n, $class) { $lhs = new $class(); - $lhs->value = \array_merge(self::array_repeat(0, \count($n)), $x); + $lhs->value = array_merge(self::array_repeat(0, count($n)), $x); $rhs = new $class(); $rhs->value = $n; + list(, $temp) = $lhs->divide($rhs); return $temp->value; } + /** * Montgomery Multiply * @@ -51,27 +54,38 @@ protected static function prepareReduce(array $x, array $n, $class) */ protected static function reduce(array $x, array $n, $class) { - static $cache = [self::VARIABLE => [], self::DATA => []]; - if (($key = \array_search($n, $cache[self::VARIABLE])) === \false) { - $key = \count($cache[self::VARIABLE]); + static $cache = [ + self::VARIABLE => [], + self::DATA => [] + ]; + + if (($key = array_search($n, $cache[self::VARIABLE])) === false) { + $key = count($cache[self::VARIABLE]); $cache[self::VARIABLE][] = $x; $cache[self::DATA][] = self::modInverse67108864($n, $class); } - $k = \count($n); + + $k = count($n); + $result = [self::VALUE => $x]; + for ($i = 0; $i < $k; ++$i) { $temp = $result[self::VALUE][$i] * $cache[self::DATA][$key]; - $temp = $temp - $class::BASE_FULL * ($class::BASE === 26 ? \intval($temp / 0x4000000) : $temp >> 31); + $temp = $temp - $class::BASE_FULL * ($class::BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31)); $temp = $class::regularMultiply([$temp], $n); - $temp = \array_merge(self::array_repeat(0, $i), $temp); - $result = $class::addHelper($result[self::VALUE], \false, $temp, \false); + $temp = array_merge(self::array_repeat(0, $i), $temp); + $result = $class::addHelper($result[self::VALUE], false, $temp, false); } - $result[self::VALUE] = \array_slice($result[self::VALUE], $k); - if (self::compareHelper($result, \false, $n, \false) >= 0) { - $result = $class::subtractHelper($result[self::VALUE], \false, $n, \false); + + $result[self::VALUE] = array_slice($result[self::VALUE], $k); + + if (self::compareHelper($result, false, $n, false) >= 0) { + $result = $class::subtractHelper($result[self::VALUE], false, $n, false); } + return $result[self::VALUE]; } + /** * Modular Inverse of a number mod 2**26 (eg. 67108864) * @@ -97,18 +111,16 @@ protected static function reduce(array $x, array $n, $class) * @param string $class * @return int */ - protected static function modInverse67108864(array $x, $class) + protected static function modInverse67108864(array $x, $class) // 2**26 == 67,108,864 { $x = -$x[0]; - $result = $x & 0x3; - // x**-1 mod 2**2 - $result = $result * (2 - $x * $result) & 0xf; - // x**-1 mod 2**4 - $result = $result * (2 - ($x & 0xff) * $result) & 0xff; - // x**-1 mod 2**8 - $result = $result * (2 - ($x & 0xffff) * $result & 0xffff) & 0xffff; - // x**-1 mod 2**16 - $result = $class::BASE == 26 ? \fmod($result * (2 - \fmod($x * $result, $class::BASE_FULL)), $class::BASE_FULL) : $result * (2 - $x * $result % $class::BASE_FULL) % $class::BASE_FULL; + $result = $x & 0x3; // x**-1 mod 2**2 + $result = ($result * (2 - $x * $result)) & 0xF; // x**-1 mod 2**4 + $result = ($result * (2 - ($x & 0xFF) * $result)) & 0xFF; // x**-1 mod 2**8 + $result = ($result * ((2 - ($x & 0xFFFF) * $result) & 0xFFFF)) & 0xFFFF; // x**-1 mod 2**16 + $result = $class::BASE == 26 ? + fmod($result * (2 - fmod($x * $result, $class::BASE_FULL)), $class::BASE_FULL) : // x**-1 mod 2**26 + ($result * (2 - ($x * $result) % $class::BASE_FULL)) % $class::BASE_FULL; return $result & $class::MAX_DIGIT; } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/MontgomeryMult.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/MontgomeryMult.php index 470bb25..35659e6 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/MontgomeryMult.php +++ b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/MontgomeryMult.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\PHP\Reductions; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\PHP; + /** * PHP Montgomery Modular Exponentiation Engine with interleaved multiplication * * @author Jim Wigginton - * @internal */ abstract class MontgomeryMult extends Montgomery { @@ -41,28 +42,34 @@ public static function multiplyReduce(array $x, array $y, array $m, $class) // although the above code performed better in my benchmarks the following could might // perform better under different circumstances. in lieu of deleting it it's just been // made uncallable - static $cache = [self::VARIABLE => [], self::DATA => []]; - if (($key = \array_search($m, $cache[self::VARIABLE])) === \false) { - $key = \count($cache[self::VARIABLE]); + + static $cache = [ + self::VARIABLE => [], + self::DATA => [] + ]; + + if (($key = array_search($m, $cache[self::VARIABLE])) === false) { + $key = count($cache[self::VARIABLE]); $cache[self::VARIABLE][] = $m; $cache[self::DATA][] = self::modInverse67108864($m, $class); } - $n = \max(\count($x), \count($y), \count($m)); - $x = \array_pad($x, $n, 0); - $y = \array_pad($y, $n, 0); - $m = \array_pad($m, $n, 0); + + $n = max(count($x), count($y), count($m)); + $x = array_pad($x, $n, 0); + $y = array_pad($y, $n, 0); + $m = array_pad($m, $n, 0); $a = [self::VALUE => self::array_repeat(0, $n + 1)]; for ($i = 0; $i < $n; ++$i) { $temp = $a[self::VALUE][0] + $x[$i] * $y[0]; - $temp = $temp - $class::BASE_FULL * ($class::BASE === 26 ? \intval($temp / 0x4000000) : $temp >> 31); + $temp = $temp - $class::BASE_FULL * ($class::BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31)); $temp = $temp * $cache[self::DATA][$key]; - $temp = $temp - $class::BASE_FULL * ($class::BASE === 26 ? \intval($temp / 0x4000000) : $temp >> 31); - $temp = $class::addHelper($class::regularMultiply([$x[$i]], $y), \false, $class::regularMultiply([$temp], $m), \false); - $a = $class::addHelper($a[self::VALUE], \false, $temp[self::VALUE], \false); - $a[self::VALUE] = \array_slice($a[self::VALUE], 1); + $temp = $temp - $class::BASE_FULL * ($class::BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31)); + $temp = $class::addHelper($class::regularMultiply([$x[$i]], $y), false, $class::regularMultiply([$temp], $m), false); + $a = $class::addHelper($a[self::VALUE], false, $temp[self::VALUE], false); + $a[self::VALUE] = array_slice($a[self::VALUE], 1); } - if (self::compareHelper($a[self::VALUE], \false, $m, \false) >= 0) { - $a = $class::subtractHelper($a[self::VALUE], \false, $m, \false); + if (self::compareHelper($a[self::VALUE], false, $m, false) >= 0) { + $a = $class::subtractHelper($a[self::VALUE], false, $m, false); } return $a[self::VALUE]; } diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/PowerOfTwo.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/PowerOfTwo.php index 9ad1be1..cc33201 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/PowerOfTwo.php +++ b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/PowerOfTwo.php @@ -10,14 +10,15 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\PHP\Reductions; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\PHP\Base; + /** * PHP Power Of Two Modular Exponentiation Engine * * @author Jim Wigginton - * @internal */ abstract class PowerOfTwo extends Base { @@ -33,6 +34,7 @@ protected static function prepareReduce(array $x, array $n, $class) { return self::reduce($x, $n, $class); } + /** * Power Of Two Reduction * @@ -47,8 +49,10 @@ protected static function reduce(array $x, array $n, $class) $lhs->value = $x; $rhs = new $class(); $rhs->value = $n; + $temp = new $class(); $temp->value = [1]; + $result = $lhs->bitwise_and($rhs->subtract($temp)); return $result->value; } diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP32.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP32.php index c2093b8..104be58 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP32.php +++ b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP32.php @@ -10,6 +10,7 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines; /** @@ -18,26 +19,28 @@ * Uses 64-bit floats if int size is 4 bits * * @author Jim Wigginton - * @internal */ class PHP32 extends PHP { // Constants used by PHP.php const BASE = 26; const BASE_FULL = 0x4000000; - const MAX_DIGIT = 0x3ffffff; + const MAX_DIGIT = 0x3FFFFFF; const MSB = 0x2000000; + /** * MAX10 in greatest MAX10LEN satisfying * MAX10 = 10**MAX10LEN <= 2**BASE. */ const MAX10 = 10000000; + /** * MAX10LEN in greatest MAX10LEN satisfying * MAX10 = 10**MAX10LEN <= 2**BASE. */ const MAX10LEN = 7; const MAX_DIGIT2 = 4503599627370496; + /** * Initialize a PHP32 BigInteger Engine instance * @@ -49,45 +52,48 @@ protected function initialize($base) if ($base != 256 && $base != -256) { return parent::initialize($base); } + $val = $this->value; $this->value = []; - $vals =& $this->value; - $i = \strlen($val); + $vals = &$this->value; + $i = strlen($val); if (!$i) { return; } - while (\true) { + + while (true) { $i -= 4; if ($i < 0) { if ($i == -4) { break; } - $val = \substr($val, 0, 4 + $i); - $val = \str_pad($val, 4, "\x00", \STR_PAD_LEFT); - if ($val == "\x00\x00\x00\x00") { + $val = substr($val, 0, 4 + $i); + $val = str_pad($val, 4, "\0", STR_PAD_LEFT); + if ($val == "\0\0\0\0") { break; } $i = 0; } - list(, $digit) = \unpack('N', \substr($val, $i, 4)); + list(, $digit) = unpack('N', substr($val, $i, 4)); if ($digit < 0) { - $digit += 0xffffffff + 1; + $digit += 0xFFFFFFFF + 1; } - $step = \count($vals) & 3; + $step = count($vals) & 3; if ($step) { - $digit = (int) \floor($digit / \pow(2, 2 * $step)); + $digit = (int) floor($digit / pow(2, 2 * $step)); } if ($step != 3) { - $digit = (int) \fmod($digit, static::BASE_FULL); + $digit = (int) fmod($digit, static::BASE_FULL); $i++; } $vals[] = $digit; } - while (\end($vals) === 0) { - \array_pop($vals); + while (end($vals) === 0) { + array_pop($vals); } - \reset($vals); + reset($vals); } + /** * Test for engine validity * @@ -96,8 +102,9 @@ protected function initialize($base) */ public static function isValidEngine() { - return \PHP_INT_SIZE >= 4 && !self::testJITOnWindows(); + return PHP_INT_SIZE >= 4 && !self::testJITOnWindows(); } + /** * Adds two BigIntegers. * @@ -107,8 +114,10 @@ public static function isValidEngine() public function add(PHP32 $y) { $temp = self::addHelper($this->value, $this->is_negative, $y->value, $y->is_negative); + return $this->convertToObj($temp); } + /** * Subtracts two BigIntegers. * @@ -118,8 +127,10 @@ public function add(PHP32 $y) public function subtract(PHP32 $y) { $temp = self::subtractHelper($this->value, $this->is_negative, $y->value, $y->is_negative); + return $this->convertToObj($temp); } + /** * Multiplies two BigIntegers. * @@ -129,8 +140,10 @@ public function subtract(PHP32 $y) public function multiply(PHP32 $y) { $temp = self::multiplyHelper($this->value, $this->is_negative, $y->value, $y->is_negative); + return $this->convertToObj($temp); } + /** * Divides two BigIntegers. * @@ -146,6 +159,7 @@ public function divide(PHP32 $y) { return $this->divideHelper($y); } + /** * Calculates modular inverses. * @@ -157,6 +171,7 @@ public function modInverse(PHP32 $n) { return $this->modInverseHelper($n); } + /** * Calculates modular inverses. * @@ -168,6 +183,7 @@ public function extendedGCD(PHP32 $n) { return $this->extendedGCDHelper($n); } + /** * Calculates the greatest common divisor * @@ -180,6 +196,7 @@ public function gcd(PHP32 $n) { return $this->extendedGCD($n)['gcd']; } + /** * Logical And * @@ -190,6 +207,7 @@ public function bitwise_and(PHP32 $x) { return $this->bitwiseAndHelper($x); } + /** * Logical Or * @@ -200,6 +218,7 @@ public function bitwise_or(PHP32 $x) { return $this->bitwiseOrHelper($x); } + /** * Logical Exclusive Or * @@ -210,6 +229,7 @@ public function bitwise_xor(PHP32 $x) { return $this->bitwiseXorHelper($x); } + /** * Compares two numbers. * @@ -232,6 +252,7 @@ public function compare(PHP32 $y) { return $this->compareHelper($this->value, $this->is_negative, $y->value, $y->is_negative); } + /** * Tests the equality of two numbers. * @@ -244,6 +265,7 @@ public function equals(PHP32 $x) { return $this->value === $x->value && $this->is_negative == $x->is_negative; } + /** * Performs modular exponentiation. * @@ -255,6 +277,7 @@ public function modPow(PHP32 $e, PHP32 $n) { return $this->powModOuter($e, $n); } + /** * Performs modular exponentiation. * @@ -268,6 +291,7 @@ public function powMod(PHP32 $e, PHP32 $n) { return $this->powModOuter($e, $n); } + /** * Generate a random prime number between a range * @@ -281,6 +305,7 @@ public static function randomRangePrime(PHP32 $min, PHP32 $max) { return self::randomRangePrimeOuter($min, $max); } + /** * Generate a random number between a range * @@ -298,6 +323,7 @@ public static function randomRange(PHP32 $min, PHP32 $max) { return self::randomRangeHelper($min, $max); } + /** * Performs exponentiation. * @@ -308,6 +334,7 @@ public function pow(PHP32 $n) { return $this->powHelper($n); } + /** * Return the minimum BigInteger between an arbitrary number of BigIntegers. * @@ -318,6 +345,7 @@ public static function min(PHP32 ...$nums) { return self::minHelper($nums); } + /** * Return the maximum BigInteger between an arbitrary number of BigIntegers. * @@ -328,6 +356,7 @@ public static function max(PHP32 ...$nums) { return self::maxHelper($nums); } + /** * Tests BigInteger to see if it is between two integers, inclusive * diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP64.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP64.php index b1ef3c3..c0ed12f 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP64.php +++ b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP64.php @@ -10,6 +10,7 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines; /** @@ -18,26 +19,28 @@ * Uses 64-bit integers if int size is 8 bits * * @author Jim Wigginton - * @internal */ class PHP64 extends PHP { // Constants used by PHP.php const BASE = 31; const BASE_FULL = 0x80000000; - const MAX_DIGIT = 0x7fffffff; + const MAX_DIGIT = 0x7FFFFFFF; const MSB = 0x40000000; + /** * MAX10 in greatest MAX10LEN satisfying * MAX10 = 10**MAX10LEN <= 2**BASE. */ const MAX10 = 1000000000; + /** * MAX10LEN in greatest MAX10LEN satisfying * MAX10 = 10**MAX10LEN <= 2**BASE. */ const MAX10LEN = 9; const MAX_DIGIT2 = 4611686018427387904; + /** * Initialize a PHP64 BigInteger Engine instance * @@ -49,28 +52,30 @@ protected function initialize($base) if ($base != 256 && $base != -256) { return parent::initialize($base); } + $val = $this->value; $this->value = []; - $vals =& $this->value; - $i = \strlen($val); + $vals = &$this->value; + $i = strlen($val); if (!$i) { return; } - while (\true) { + + while (true) { $i -= 4; if ($i < 0) { if ($i == -4) { break; } - $val = \substr($val, 0, 4 + $i); - $val = \str_pad($val, 4, "\x00", \STR_PAD_LEFT); - if ($val == "\x00\x00\x00\x00") { + $val = substr($val, 0, 4 + $i); + $val = str_pad($val, 4, "\0", STR_PAD_LEFT); + if ($val == "\0\0\0\0") { break; } $i = 0; } - list(, $digit) = \unpack('N', \substr($val, $i, 4)); - $step = \count($vals) & 7; + list(, $digit) = unpack('N', substr($val, $i, 4)); + $step = count($vals) & 7; if (!$step) { $digit &= static::MAX_DIGIT; $i++; @@ -79,16 +84,17 @@ protected function initialize($base) $digit >>= $shift; $shift = 32 - $shift; $digit &= (1 << $shift) - 1; - $temp = $i > 0 ? \ord($val[$i - 1]) : 0; - $digit |= $temp << $shift & 0x7f000000; + $temp = $i > 0 ? ord($val[$i - 1]) : 0; + $digit |= ($temp << $shift) & 0x7F000000; } $vals[] = $digit; } - while (\end($vals) === 0) { - \array_pop($vals); + while (end($vals) === 0) { + array_pop($vals); } - \reset($vals); + reset($vals); } + /** * Test for engine validity * @@ -97,8 +103,9 @@ protected function initialize($base) */ public static function isValidEngine() { - return \PHP_INT_SIZE >= 8 && !self::testJITOnWindows(); + return PHP_INT_SIZE >= 8 && !self::testJITOnWindows(); } + /** * Adds two BigIntegers. * @@ -108,8 +115,10 @@ public static function isValidEngine() public function add(PHP64 $y) { $temp = self::addHelper($this->value, $this->is_negative, $y->value, $y->is_negative); + return $this->convertToObj($temp); } + /** * Subtracts two BigIntegers. * @@ -119,8 +128,10 @@ public function add(PHP64 $y) public function subtract(PHP64 $y) { $temp = self::subtractHelper($this->value, $this->is_negative, $y->value, $y->is_negative); + return $this->convertToObj($temp); } + /** * Multiplies two BigIntegers. * @@ -130,8 +141,10 @@ public function subtract(PHP64 $y) public function multiply(PHP64 $y) { $temp = self::multiplyHelper($this->value, $this->is_negative, $y->value, $y->is_negative); + return $this->convertToObj($temp); } + /** * Divides two BigIntegers. * @@ -147,6 +160,7 @@ public function divide(PHP64 $y) { return $this->divideHelper($y); } + /** * Calculates modular inverses. * @@ -158,6 +172,7 @@ public function modInverse(PHP64 $n) { return $this->modInverseHelper($n); } + /** * Calculates modular inverses. * @@ -169,6 +184,7 @@ public function extendedGCD(PHP64 $n) { return $this->extendedGCDHelper($n); } + /** * Calculates the greatest common divisor * @@ -181,6 +197,7 @@ public function gcd(PHP64 $n) { return $this->extendedGCD($n)['gcd']; } + /** * Logical And * @@ -191,6 +208,7 @@ public function bitwise_and(PHP64 $x) { return $this->bitwiseAndHelper($x); } + /** * Logical Or * @@ -201,6 +219,7 @@ public function bitwise_or(PHP64 $x) { return $this->bitwiseOrHelper($x); } + /** * Logical Exclusive Or * @@ -211,6 +230,7 @@ public function bitwise_xor(PHP64 $x) { return $this->bitwiseXorHelper($x); } + /** * Compares two numbers. * @@ -233,6 +253,7 @@ public function compare(PHP64 $y) { return parent::compareHelper($this->value, $this->is_negative, $y->value, $y->is_negative); } + /** * Tests the equality of two numbers. * @@ -245,6 +266,7 @@ public function equals(PHP64 $x) { return $this->value === $x->value && $this->is_negative == $x->is_negative; } + /** * Performs modular exponentiation. * @@ -256,6 +278,7 @@ public function modPow(PHP64 $e, PHP64 $n) { return $this->powModOuter($e, $n); } + /** * Performs modular exponentiation. * @@ -269,6 +292,7 @@ public function powMod(PHP64 $e, PHP64 $n) { return $this->powModOuter($e, $n); } + /** * Generate a random prime number between a range * @@ -282,6 +306,7 @@ public static function randomRangePrime(PHP64 $min, PHP64 $max) { return self::randomRangePrimeOuter($min, $max); } + /** * Generate a random number between a range * @@ -299,6 +324,7 @@ public static function randomRange(PHP64 $min, PHP64 $max) { return self::randomRangeHelper($min, $max); } + /** * Performs exponentiation. * @@ -309,6 +335,7 @@ public function pow(PHP64 $n) { return $this->powHelper($n); } + /** * Return the minimum BigInteger between an arbitrary number of BigIntegers. * @@ -319,6 +346,7 @@ public static function min(PHP64 ...$nums) { return self::minHelper($nums); } + /** * Return the maximum BigInteger between an arbitrary number of BigIntegers. * @@ -329,6 +357,7 @@ public static function max(PHP64 ...$nums) { return self::maxHelper($nums); } + /** * Tests BigInteger to see if it is between two integers, inclusive * diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BinaryField.php b/composer/phpseclib/phpseclib/phpseclib/Math/BinaryField.php index e1e29b8..dfdb792 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BinaryField.php +++ b/composer/phpseclib/phpseclib/phpseclib/Math/BinaryField.php @@ -11,16 +11,17 @@ * @copyright 2017 Jim Wigginton * @license http://www.opensource.org/licenses/mit-license.html MIT License */ + namespace OCA\Libresign\Vendor\phpseclib3\Math; use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; use OCA\Libresign\Vendor\phpseclib3\Math\BinaryField\Integer; use OCA\Libresign\Vendor\phpseclib3\Math\Common\FiniteField; + /** * Binary Finite Fields * * @author Jim Wigginton - * @internal */ class BinaryField extends FiniteField { @@ -30,20 +31,23 @@ class BinaryField extends FiniteField * @var int */ private static $instanceCounter = 0; + /** * Keeps track of current instance * * @var int */ protected $instanceID; + /** @var BigInteger */ private $randomMax; + /** * Default constructor */ public function __construct(...$indices) { - $m = \array_shift($indices); + $m = array_shift($indices); if ($m > 571) { /* sect571r1 and sect571k1 are the largest binary curves that https://www.secg.org/sec2-v2.pdf defines altho theoretically there may be legit reasons to use binary finite fields with larger degrees @@ -53,60 +57,66 @@ public function __construct(...$indices) avoid denial of service and/or buffer overflow attacks" */ throw new \OutOfBoundsException('Degrees larger than 571 are not supported'); } - $val = \str_repeat('0', $m) . '1'; + $val = str_repeat('0', $m) . '1'; foreach ($indices as $index) { $val[$index] = '1'; } - $modulo = static::base2ToBase256(\strrev($val)); + $modulo = static::base2ToBase256(strrev($val)); + $mStart = 2 * $m - 2; - $t = \ceil($m / 8); - $finalMask = \chr((1 << $m % 8) - 1); - if ($finalMask == "\x00") { - $finalMask = "\xff"; + $t = ceil($m / 8); + $finalMask = chr((1 << ($m % 8)) - 1); + if ($finalMask == "\0") { + $finalMask = "\xFF"; } $bitLen = $mStart + 1; - $pad = \ceil($bitLen / 8); + $pad = ceil($bitLen / 8); $h = $bitLen & 7; $h = $h ? 8 - $h : 0; - $r = \rtrim(\substr($val, 0, -1), '0'); - $u = [static::base2ToBase256(\strrev($r))]; + + $r = rtrim(substr($val, 0, -1), '0'); + $u = [static::base2ToBase256(strrev($r))]; for ($i = 1; $i < 8; $i++) { - $u[] = static::base2ToBase256(\strrev(\str_repeat('0', $i) . $r)); + $u[] = static::base2ToBase256(strrev(str_repeat('0', $i) . $r)); } + // implements algorithm 2.40 (in section 2.3.5) in "Guide to Elliptic Curve Cryptography" // with W = 8 - $reduce = function ($c) use($u, $mStart, $m, $t, $finalMask, $pad, $h) { - $c = \str_pad($c, $pad, "\x00", \STR_PAD_LEFT); + $reduce = function ($c) use ($u, $mStart, $m, $t, $finalMask, $pad, $h) { + $c = str_pad($c, $pad, "\0", STR_PAD_LEFT); for ($i = $mStart; $i >= $m;) { $g = $h >> 3; $mask = $h & 7; - $mask = $mask ? 1 << 7 - $mask : 0x80; + $mask = $mask ? 1 << (7 - $mask) : 0x80; for (; $mask > 0; $mask >>= 1, $i--, $h++) { - if (\ord($c[$g]) & $mask) { + if (ord($c[$g]) & $mask) { $temp = $i - $m; $j = $temp >> 3; $k = $temp & 7; - $t1 = $j ? \substr($c, 0, -$j) : $c; - $length = \strlen($t1); + $t1 = $j ? substr($c, 0, -$j) : $c; + $length = strlen($t1); if ($length) { - $t2 = \str_pad($u[$k], $length, "\x00", \STR_PAD_LEFT); + $t2 = str_pad($u[$k], $length, "\0", STR_PAD_LEFT); $temp = $t1 ^ $t2; - $c = $j ? \substr_replace($c, $temp, 0, $length) : $temp; + $c = $j ? substr_replace($c, $temp, 0, $length) : $temp; } } } } - $c = \substr($c, -$t); - if (\strlen($c) == $t) { + $c = substr($c, -$t); + if (strlen($c) == $t) { $c[0] = $c[0] & $finalMask; } - return \ltrim($c, "\x00"); + return ltrim($c, "\0"); }; + $this->instanceID = self::$instanceCounter++; Integer::setModulo($this->instanceID, $modulo); Integer::setRecurringModuloFunction($this->instanceID, $reduce); + $this->randomMax = new BigInteger($modulo, 2); } + /** * Returns an instance of a dynamically generated PrimeFieldInteger class * @@ -117,6 +127,7 @@ public function newInteger($num) { return new Integer($this->instanceID, $num instanceof BigInteger ? $num->toBytes() : $num); } + /** * Returns an integer on the finite field between one and the prime modulo * @@ -128,8 +139,10 @@ public function randomInteger() if (!isset($one)) { $one = new BigInteger(1); } + return new Integer($this->instanceID, BigInteger::randomRange($one, $this->randomMax)->toBytes()); } + /** * Returns the length of the modulo in bytes * @@ -137,8 +150,9 @@ public function randomInteger() */ public function getLengthInBytes() { - return \strlen(Integer::getModulo($this->instanceID)); + return strlen(Integer::getModulo($this->instanceID)); } + /** * Returns the length of the modulo in bits * @@ -146,8 +160,9 @@ public function getLengthInBytes() */ public function getLength() { - return \strlen(Integer::getModulo($this->instanceID)) << 3; + return strlen(Integer::getModulo($this->instanceID)) << 3; } + /** * Converts a base-2 string to a base-256 string * @@ -158,16 +173,19 @@ public function getLength() public static function base2ToBase256($x, $size = null) { $str = Strings::bits2bin($x); - $pad = \strlen($x) >> 3; - if (\strlen($x) & 3) { + + $pad = strlen($x) >> 3; + if (strlen($x) & 3) { $pad++; } - $str = \str_pad($str, $pad, "\x00", \STR_PAD_LEFT); + $str = str_pad($str, $pad, "\0", STR_PAD_LEFT); if (isset($size)) { - $str = \str_pad($str, $size, "\x00", \STR_PAD_LEFT); + $str = str_pad($str, $size, "\0", STR_PAD_LEFT); } + return $str; } + /** * Converts a base-256 string to a base-2 string * @@ -176,9 +194,10 @@ public static function base2ToBase256($x, $size = null) */ public static function base256ToBase2($x) { - if (\function_exists('gmp_import')) { - return \gmp_strval(\gmp_import($x), 2); + if (function_exists('gmp_import')) { + return gmp_strval(gmp_import($x), 2); } + return Strings::bin2bits($x); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BinaryField/Integer.php b/composer/phpseclib/phpseclib/phpseclib/Math/BinaryField/Integer.php index 40581c5..641463f 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BinaryField/Integer.php +++ b/composer/phpseclib/phpseclib/phpseclib/Math/BinaryField/Integer.php @@ -17,17 +17,18 @@ * @copyright 2017 Jim Wigginton * @license http://www.opensource.org/licenses/mit-license.html MIT License */ + namespace OCA\Libresign\Vendor\phpseclib3\Math\BinaryField; use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; use OCA\Libresign\Vendor\phpseclib3\Math\BinaryField; use OCA\Libresign\Vendor\phpseclib3\Math\Common\FiniteField\Integer as Base; + /** * Binary Finite Fields * * @author Jim Wigginton - * @internal */ class Integer extends Base { @@ -37,37 +38,42 @@ class Integer extends Base * @var string */ protected $value; + /** * Keeps track of current instance * * @var int */ protected $instanceID; + /** * Holds the PrimeField's modulo * * @var array */ protected static $modulo; + /** * Holds a pre-generated function to perform modulo reductions * * @var callable[] */ protected static $reduce; + /** * Default constructor */ public function __construct($instanceID, $num = '') { $this->instanceID = $instanceID; - if (!\strlen($num)) { + if (!strlen($num)) { $this->value = ''; } else { $reduce = static::$reduce[$instanceID]; $this->value = $reduce($num); } } + /** * Set the modulo for a given instance * @param int $instanceID @@ -77,6 +83,7 @@ public static function setModulo($instanceID, $modulo) { static::$modulo[$instanceID] = $modulo; } + /** * Set the modulo for a given instance */ @@ -84,6 +91,7 @@ public static function setRecurringModuloFunction($instanceID, callable $functio { static::$reduce[$instanceID] = $function; } + /** * Tests a parameter to see if it's of the right instance * @@ -92,9 +100,10 @@ public static function setRecurringModuloFunction($instanceID, callable $functio private static function checkInstance(self $x, self $y) { if ($x->instanceID != $y->instanceID) { - throw new \UnexpectedValueException('The instances of the two BinaryField\\Integer objects do not match'); + throw new \UnexpectedValueException('The instances of the two BinaryField\Integer objects do not match'); } } + /** * Tests the equality of two numbers. * @@ -103,8 +112,10 @@ private static function checkInstance(self $x, self $y) public function equals(self $x) { static::checkInstance($this, $x); + return $this->value == $x->value; } + /** * Compares two numbers. * @@ -113,13 +124,18 @@ public function equals(self $x) public function compare(self $x) { static::checkInstance($this, $x); + $a = $this->value; $b = $x->value; - $length = \max(\strlen($a), \strlen($b)); - $a = \str_pad($a, $length, "\x00", \STR_PAD_LEFT); - $b = \str_pad($b, $length, "\x00", \STR_PAD_LEFT); - return \strcmp($a, $b); + + $length = max(strlen($a), strlen($b)); + + $a = str_pad($a, $length, "\0", STR_PAD_LEFT); + $b = str_pad($b, $length, "\0", STR_PAD_LEFT); + + return strcmp($a, $b); } + /** * Returns the degree of the polynomial * @@ -128,15 +144,16 @@ public function compare(self $x) */ private static function deg($x) { - $x = \ltrim($x, "\x00"); - $xbit = \decbin(\ord($x[0])); - $xlen = $xbit == '0' ? 0 : \strlen($xbit); - $len = \strlen($x); + $x = ltrim($x, "\0"); + $xbit = decbin(ord($x[0])); + $xlen = $xbit == '0' ? 0 : strlen($xbit); + $len = strlen($x); if (!$len) { return -1; } - return 8 * \strlen($x) - 9 + $xlen; + return 8 * strlen($x) - 9 + $xlen; } + /** * Perform polynomial division * @@ -147,20 +164,26 @@ private static function polynomialDivide($x, $y) { // in wikipedia's description of the algorithm, lc() is the leading coefficient. over a binary field that's // always going to be 1. - $q = \chr(0); + + $q = chr(0); $d = static::deg($y); $r = $x; while (($degr = static::deg($r)) >= $d) { - $s = '1' . \str_repeat('0', $degr - $d); + $s = '1' . str_repeat('0', $degr - $d); $s = BinaryField::base2ToBase256($s); - $length = \max(\strlen($s), \strlen($q)); - $q = !isset($q) ? $s : \str_pad($q, $length, "\x00", \STR_PAD_LEFT) ^ \str_pad($s, $length, "\x00", \STR_PAD_LEFT); + $length = max(strlen($s), strlen($q)); + $q = !isset($q) ? $s : + str_pad($q, $length, "\0", STR_PAD_LEFT) ^ + str_pad($s, $length, "\0", STR_PAD_LEFT); $s = static::polynomialMultiply($s, $y); - $length = \max(\strlen($r), \strlen($s)); - $r = \str_pad($r, $length, "\x00", \STR_PAD_LEFT) ^ \str_pad($s, $length, "\x00", \STR_PAD_LEFT); + $length = max(strlen($r), strlen($s)); + $r = str_pad($r, $length, "\0", STR_PAD_LEFT) ^ + str_pad($s, $length, "\0", STR_PAD_LEFT); } - return [\ltrim($q, "\x00"), \ltrim($r, "\x00")]; + + return [ltrim($q, "\0"), ltrim($r, "\0")]; } + /** * Perform polynomial multiplation in the traditional way * @@ -169,32 +192,35 @@ private static function polynomialDivide($x, $y) */ private static function regularPolynomialMultiply($x, $y) { - $precomputed = [\ltrim($x, "\x00")]; - $x = \strrev(BinaryField::base256ToBase2($x)); - $y = \strrev(BinaryField::base256ToBase2($y)); - if (\strlen($x) == \strlen($y)) { - $length = \strlen($x); + $precomputed = [ltrim($x, "\0")]; + $x = strrev(BinaryField::base256ToBase2($x)); + $y = strrev(BinaryField::base256ToBase2($y)); + if (strlen($x) == strlen($y)) { + $length = strlen($x); } else { - $length = \max(\strlen($x), \strlen($y)); - $x = \str_pad($x, $length, '0'); - $y = \str_pad($y, $length, '0'); + $length = max(strlen($x), strlen($y)); + $x = str_pad($x, $length, '0'); + $y = str_pad($y, $length, '0'); } - $result = \str_repeat('0', 2 * $length - 1); + $result = str_repeat('0', 2 * $length - 1); $result = BinaryField::base2ToBase256($result); - $size = \strlen($result); - $x = \strrev($x); + $size = strlen($result); + $x = strrev($x); + // precompute left shift 1 through 7 for ($i = 1; $i < 8; $i++) { - $precomputed[$i] = BinaryField::base2ToBase256($x . \str_repeat('0', $i)); + $precomputed[$i] = BinaryField::base2ToBase256($x . str_repeat('0', $i)); } - for ($i = 0; $i < \strlen($y); $i++) { + for ($i = 0; $i < strlen($y); $i++) { if ($y[$i] == '1') { - $temp = $precomputed[$i & 7] . \str_repeat("\x00", $i >> 3); - $result ^= \str_pad($temp, $size, "\x00", \STR_PAD_LEFT); + $temp = $precomputed[$i & 7] . str_repeat("\0", $i >> 3); + $result ^= str_pad($temp, $size, "\0", STR_PAD_LEFT); } } + return $result; } + /** * Perform polynomial multiplation * @@ -205,31 +231,48 @@ private static function regularPolynomialMultiply($x, $y) */ private static function polynomialMultiply($x, $y) { - if (\strlen($x) == \strlen($y)) { - $length = \strlen($x); + if (strlen($x) == strlen($y)) { + $length = strlen($x); } else { - $length = \max(\strlen($x), \strlen($y)); - $x = \str_pad($x, $length, "\x00", \STR_PAD_LEFT); - $y = \str_pad($y, $length, "\x00", \STR_PAD_LEFT); + $length = max(strlen($x), strlen($y)); + $x = str_pad($x, $length, "\0", STR_PAD_LEFT); + $y = str_pad($y, $length, "\0", STR_PAD_LEFT); } - switch (\true) { - case \PHP_INT_SIZE == 8 && $length <= 4: - return $length != 4 ? self::subMultiply(\str_pad($x, 4, "\x00", \STR_PAD_LEFT), \str_pad($y, 4, "\x00", \STR_PAD_LEFT)) : self::subMultiply($x, $y); - case \PHP_INT_SIZE == 4 || $length > 32: + + switch (true) { + case PHP_INT_SIZE == 8 && $length <= 4: + return $length != 4 ? + self::subMultiply(str_pad($x, 4, "\0", STR_PAD_LEFT), str_pad($y, 4, "\0", STR_PAD_LEFT)) : + self::subMultiply($x, $y); + case PHP_INT_SIZE == 4 || $length > 32: return self::regularPolynomialMultiply($x, $y); } + $m = $length >> 1; - $x1 = \substr($x, 0, -$m); - $x0 = \substr($x, -$m); - $y1 = \substr($y, 0, -$m); - $y0 = \substr($y, -$m); + + $x1 = substr($x, 0, -$m); + $x0 = substr($x, -$m); + $y1 = substr($y, 0, -$m); + $y0 = substr($y, -$m); + $z2 = self::polynomialMultiply($x1, $y1); $z0 = self::polynomialMultiply($x0, $y0); - $z1 = self::polynomialMultiply(self::subAdd2($x1, $x0), self::subAdd2($y1, $y0)); + $z1 = self::polynomialMultiply( + self::subAdd2($x1, $x0), + self::subAdd2($y1, $y0) + ); + $z1 = self::subAdd3($z1, $z2, $z0); - $xy = self::subAdd3($z2 . \str_repeat("\x00", 2 * $m), $z1 . \str_repeat("\x00", $m), $z0); - return \ltrim($xy, "\x00"); + + $xy = self::subAdd3( + $z2 . str_repeat("\0", 2 * $m), + $z1 . str_repeat("\0", $m), + $z0 + ); + + return ltrim($xy, "\0"); } + /** * Perform polynomial multiplication on 2x 32-bit numbers, returning * a 64-bit number @@ -241,28 +284,34 @@ private static function polynomialMultiply($x, $y) */ private static function subMultiply($x, $y) { - $x = \unpack('N', $x)[1]; - $y = \unpack('N', $y)[1]; + $x = unpack('N', $x)[1]; + $y = unpack('N', $y)[1]; + $x0 = $x & 0x11111111; $x1 = $x & 0x22222222; $x2 = $x & 0x44444444; $x3 = $x & 0x88888888; + $y0 = $y & 0x11111111; $y1 = $y & 0x22222222; $y2 = $y & 0x44444444; $y3 = $y & 0x88888888; - $z0 = $x0 * $y0 ^ $x1 * $y3 ^ $x2 * $y2 ^ $x3 * $y1; - $z1 = $x0 * $y1 ^ $x1 * $y0 ^ $x2 * $y3 ^ $x3 * $y2; - $z2 = $x0 * $y2 ^ $x1 * $y1 ^ $x2 * $y0 ^ $x3 * $y3; - $z3 = $x0 * $y3 ^ $x1 * $y2 ^ $x2 * $y1 ^ $x3 * $y0; + + $z0 = ($x0 * $y0) ^ ($x1 * $y3) ^ ($x2 * $y2) ^ ($x3 * $y1); + $z1 = ($x0 * $y1) ^ ($x1 * $y0) ^ ($x2 * $y3) ^ ($x3 * $y2); + $z2 = ($x0 * $y2) ^ ($x1 * $y1) ^ ($x2 * $y0) ^ ($x3 * $y3); + $z3 = ($x0 * $y3) ^ ($x1 * $y2) ^ ($x2 * $y1) ^ ($x3 * $y0); + $z0 &= 0x1111111111111111; $z1 &= 0x2222222222222222; $z2 &= 0x4444444444444444; - $z3 &= -8608480567731124088; - // 0x8888888888888888 gets interpreted as a float + $z3 &= -8608480567731124088; // 0x8888888888888888 gets interpreted as a float + $z = $z0 | $z1 | $z2 | $z3; - return \pack('J', $z); + + return pack('J', $z); } + /** * Adds two numbers * @@ -272,11 +321,12 @@ private static function subMultiply($x, $y) */ private static function subAdd2($x, $y) { - $length = \max(\strlen($x), \strlen($y)); - $x = \str_pad($x, $length, "\x00", \STR_PAD_LEFT); - $y = \str_pad($y, $length, "\x00", \STR_PAD_LEFT); + $length = max(strlen($x), strlen($y)); + $x = str_pad($x, $length, "\0", STR_PAD_LEFT); + $y = str_pad($y, $length, "\0", STR_PAD_LEFT); return $x ^ $y; } + /** * Adds three numbers * @@ -286,12 +336,13 @@ private static function subAdd2($x, $y) */ private static function subAdd3($x, $y, $z) { - $length = \max(\strlen($x), \strlen($y), \strlen($z)); - $x = \str_pad($x, $length, "\x00", \STR_PAD_LEFT); - $y = \str_pad($y, $length, "\x00", \STR_PAD_LEFT); - $z = \str_pad($z, $length, "\x00", \STR_PAD_LEFT); + $length = max(strlen($x), strlen($y), strlen($z)); + $x = str_pad($x, $length, "\0", STR_PAD_LEFT); + $y = str_pad($y, $length, "\0", STR_PAD_LEFT); + $z = str_pad($z, $length, "\0", STR_PAD_LEFT); return $x ^ $y ^ $z; } + /** * Adds two BinaryFieldIntegers. * @@ -300,11 +351,15 @@ private static function subAdd3($x, $y, $z) public function add(self $y) { static::checkInstance($this, $y); - $length = \strlen(static::$modulo[$this->instanceID]); - $x = \str_pad($this->value, $length, "\x00", \STR_PAD_LEFT); - $y = \str_pad($y->value, $length, "\x00", \STR_PAD_LEFT); + + $length = strlen(static::$modulo[$this->instanceID]); + + $x = str_pad($this->value, $length, "\0", STR_PAD_LEFT); + $y = str_pad($y->value, $length, "\0", STR_PAD_LEFT); + return new static($this->instanceID, $x ^ $y); } + /** * Subtracts two BinaryFieldIntegers. * @@ -314,6 +369,7 @@ public function subtract(self $x) { return $this->add($x); } + /** * Multiplies two BinaryFieldIntegers. * @@ -322,8 +378,10 @@ public function subtract(self $x) public function multiply(self $y) { static::checkInstance($this, $y); + return new static($this->instanceID, static::polynomialMultiply($this->value, $y->value)); } + /** * Returns the modular inverse of a BinaryFieldInteger * @@ -333,12 +391,14 @@ public function modInverse() { $remainder0 = static::$modulo[$this->instanceID]; $remainder1 = $this->value; + if ($remainder1 == '') { return new static($this->instanceID); } - $aux0 = "\x00"; - $aux1 = "\x01"; - while ($remainder1 != "\x01") { + + $aux0 = "\0"; + $aux1 = "\1"; + while ($remainder1 != "\1") { list($q, $r) = static::polynomialDivide($remainder0, $remainder1); $remainder0 = $remainder1; $remainder1 = $r; @@ -346,14 +406,17 @@ public function modInverse() // row n-2 and the product of the quotient and the auxiliary in row // n-1 $temp = static::polynomialMultiply($aux1, $q); - $aux = \str_pad($aux0, \strlen($temp), "\x00", \STR_PAD_LEFT) ^ \str_pad($temp, \strlen($aux0), "\x00", \STR_PAD_LEFT); + $aux = str_pad($aux0, strlen($temp), "\0", STR_PAD_LEFT) ^ + str_pad($temp, strlen($aux0), "\0", STR_PAD_LEFT); $aux0 = $aux1; $aux1 = $aux; } + $temp = new static($this->instanceID); - $temp->value = \ltrim($aux1, "\x00"); + $temp->value = ltrim($aux1, "\0"); return $temp; } + /** * Divides two PrimeFieldIntegers. * @@ -362,9 +425,11 @@ public function modInverse() public function divide(self $x) { static::checkInstance($this, $x); + $x = $x->modInverse(); return $this->multiply($x); } + /** * Negate * @@ -375,9 +440,11 @@ public function divide(self $x) */ public function negate() { - $x = \str_pad($this->value, \strlen(static::$modulo[$this->instanceID]), "\x00", \STR_PAD_LEFT); + $x = str_pad($this->value, strlen(static::$modulo[$this->instanceID]), "\0", STR_PAD_LEFT); + return new static($this->instanceID, $x ^ static::$modulo[$this->instanceID]); } + /** * Returns the modulo * @@ -387,6 +454,7 @@ public static function getModulo($instanceID) { return static::$modulo[$instanceID]; } + /** * Converts an Integer to a byte string (eg. base-256). * @@ -394,8 +462,9 @@ public static function getModulo($instanceID) */ public function toBytes() { - return \str_pad($this->value, \strlen(static::$modulo[$this->instanceID]), "\x00", \STR_PAD_LEFT); + return str_pad($this->value, strlen(static::$modulo[$this->instanceID]), "\0", STR_PAD_LEFT); } + /** * Converts an Integer to a hex string (eg. base-16). * @@ -405,6 +474,7 @@ public function toHex() { return Strings::bin2hex($this->toBytes()); } + /** * Converts an Integer to a bit string (eg. base-2). * @@ -415,6 +485,7 @@ public function toBits() //return str_pad(BinaryField::base256ToBase2($this->value), strlen(static::$modulo[$this->instanceID]), '0', STR_PAD_LEFT); return BinaryField::base256ToBase2($this->value); } + /** * Converts an Integer to a BigInteger * @@ -424,6 +495,7 @@ public function toBigInteger() { return new BigInteger($this->value, 256); } + /** * __toString() magic method * @@ -432,6 +504,7 @@ public function __toString() { return (string) $this->toBigInteger(); } + /** * __debugInfo() magic method * diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/Common/FiniteField.php b/composer/phpseclib/phpseclib/phpseclib/Math/Common/FiniteField.php index 7b0d757..15945d1 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Math/Common/FiniteField.php +++ b/composer/phpseclib/phpseclib/phpseclib/Math/Common/FiniteField.php @@ -9,13 +9,13 @@ * @copyright 2017 Jim Wigginton * @license http://www.opensource.org/licenses/mit-license.html MIT License */ + namespace OCA\Libresign\Vendor\phpseclib3\Math\Common; /** * Finite Fields * * @author Jim Wigginton - * @internal */ abstract class FiniteField { diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/Common/FiniteField/Integer.php b/composer/phpseclib/phpseclib/phpseclib/Math/Common/FiniteField/Integer.php index 6591668..247d00f 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Math/Common/FiniteField/Integer.php +++ b/composer/phpseclib/phpseclib/phpseclib/Math/Common/FiniteField/Integer.php @@ -9,13 +9,13 @@ * @copyright 2017 Jim Wigginton * @license http://www.opensource.org/licenses/mit-license.html MIT License */ + namespace OCA\Libresign\Vendor\phpseclib3\Math\Common\FiniteField; /** * Finite Field Integer * * @author Jim Wigginton - * @internal */ abstract class Integer implements \JsonSerializable { @@ -32,12 +32,13 @@ abstract class Integer implements \JsonSerializable #[\ReturnTypeWillChange] public function jsonSerialize() { - return ['hex' => $this->toHex(\true)]; + return ['hex' => $this->toHex(true)]; } + /** * Converts an Integer to a hex string (eg. base-16). * * @return string */ - public abstract function toHex(); + abstract public function toHex(); } diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/PrimeField.php b/composer/phpseclib/phpseclib/phpseclib/Math/PrimeField.php index f73014f..fc4f16f 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Math/PrimeField.php +++ b/composer/phpseclib/phpseclib/phpseclib/Math/PrimeField.php @@ -12,15 +12,16 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://pear.php.net/package/Math_BigInteger */ + namespace OCA\Libresign\Vendor\phpseclib3\Math; use OCA\Libresign\Vendor\phpseclib3\Math\Common\FiniteField; use OCA\Libresign\Vendor\phpseclib3\Math\PrimeField\Integer; + /** * Prime Finite Fields * * @author Jim Wigginton - * @internal */ class PrimeField extends FiniteField { @@ -30,12 +31,14 @@ class PrimeField extends FiniteField * @var int */ private static $instanceCounter = 0; + /** * Keeps track of current instance * * @var int */ protected $instanceID; + /** * Default constructor */ @@ -44,10 +47,12 @@ public function __construct(BigInteger $modulo) if (!$modulo->isPrime()) { throw new \UnexpectedValueException('PrimeField requires a prime number be passed to the constructor'); } + $this->instanceID = self::$instanceCounter++; Integer::setModulo($this->instanceID, $modulo); Integer::setRecurringModuloFunction($this->instanceID, $modulo->createRecurringModuloFunction()); } + /** * Use a custom defined modular reduction function * @@ -57,6 +62,7 @@ public function setReduction(\Closure $func) { $this->reduce = $func->bindTo($this, $this); } + /** * Returns an instance of a dynamically generated PrimeFieldInteger class * @@ -66,6 +72,7 @@ public function newInteger(BigInteger $num) { return new Integer($this->instanceID, $num); } + /** * Returns an integer on the finite field between one and the prime modulo * @@ -77,8 +84,10 @@ public function randomInteger() if (!isset($one)) { $one = new BigInteger(1); } + return new Integer($this->instanceID, BigInteger::randomRange($one, Integer::getModulo($this->instanceID))); } + /** * Returns the length of the modulo in bytes * @@ -88,6 +97,7 @@ public function getLengthInBytes() { return Integer::getModulo($this->instanceID)->getLengthInBytes(); } + /** * Returns the length of the modulo in bits * @@ -97,6 +107,7 @@ public function getLength() { return Integer::getModulo($this->instanceID)->getLength(); } + /** * Destructor */ diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/PrimeField/Integer.php b/composer/phpseclib/phpseclib/phpseclib/Math/PrimeField/Integer.php index 9ef3ae3..99f4e15 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Math/PrimeField/Integer.php +++ b/composer/phpseclib/phpseclib/phpseclib/Math/PrimeField/Integer.php @@ -9,16 +9,17 @@ * @copyright 2017 Jim Wigginton * @license http://www.opensource.org/licenses/mit-license.html MIT License */ + namespace OCA\Libresign\Vendor\phpseclib3\Math\PrimeField; use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; use OCA\Libresign\Vendor\phpseclib3\Math\Common\FiniteField\Integer as Base; + /** * Prime Finite Fields * * @author Jim Wigginton - * @internal */ class Integer extends Base { @@ -28,42 +29,49 @@ class Integer extends Base * @var BigInteger */ protected $value; + /** * Keeps track of current instance * * @var int */ protected $instanceID; + /** * Holds the PrimeField's modulo * * @var array */ protected static $modulo; + /** * Holds a pre-generated function to perform modulo reductions * * @var array */ protected static $reduce; + /** * Zero * * @var BigInteger[] */ protected static $zero; + /** * One * * @var BigInteger[] */ protected static $one; + /** * Two * * @var BigInteger[] */ protected static $two; + /** * Default constructor * @@ -80,6 +88,7 @@ public function __construct($instanceID, $num = null) $this->value = $reduce($num); } } + /** * Set the modulo for a given instance * @@ -90,6 +99,7 @@ public static function setModulo($instanceID, BigInteger $modulo) { static::$modulo[$instanceID] = $modulo; } + /** * Set the modulo for a given instance * @@ -103,6 +113,7 @@ public static function setRecurringModuloFunction($instanceID, callable $functio static::$zero[$instanceID] = new BigInteger(); } } + /** * Delete the modulo for a given instance */ @@ -114,6 +125,7 @@ public static function cleanupCache($instanceID) unset(static::$one[$instanceID]); unset(static::$two[$instanceID]); } + /** * Returns the modulo * @@ -124,6 +136,7 @@ public static function getModulo($instanceID) { return static::$modulo[$instanceID]; } + /** * Tests a parameter to see if it's of the right instance * @@ -134,9 +147,10 @@ public static function getModulo($instanceID) public static function checkInstance(self $x, self $y) { if ($x->instanceID != $y->instanceID) { - throw new \UnexpectedValueException('The instances of the two PrimeField\\Integer objects do not match'); + throw new \UnexpectedValueException('The instances of the two PrimeField\Integer objects do not match'); } } + /** * Tests the equality of two numbers. * @@ -145,8 +159,10 @@ public static function checkInstance(self $x, self $y) public function equals(self $x) { static::checkInstance($this, $x); + return $this->value->equals($x->value); } + /** * Compares two numbers. * @@ -155,8 +171,10 @@ public function equals(self $x) public function compare(self $x) { static::checkInstance($this, $x); + return $this->value->compare($x->value); } + /** * Adds two PrimeFieldIntegers. * @@ -165,13 +183,16 @@ public function compare(self $x) public function add(self $x) { static::checkInstance($this, $x); + $temp = new static($this->instanceID); $temp->value = $this->value->add($x->value); if ($temp->value->compare(static::$modulo[$this->instanceID]) >= 0) { $temp->value = $temp->value->subtract(static::$modulo[$this->instanceID]); } + return $temp; } + /** * Subtracts two PrimeFieldIntegers. * @@ -180,13 +201,16 @@ public function add(self $x) public function subtract(self $x) { static::checkInstance($this, $x); + $temp = new static($this->instanceID); $temp->value = $this->value->subtract($x->value); if ($temp->value->isNegative()) { $temp->value = $temp->value->add(static::$modulo[$this->instanceID]); } + return $temp; } + /** * Multiplies two PrimeFieldIntegers. * @@ -195,8 +219,10 @@ public function subtract(self $x) public function multiply(self $x) { static::checkInstance($this, $x); + return new static($this->instanceID, $this->value->multiply($x->value)); } + /** * Divides two PrimeFieldIntegers. * @@ -205,9 +231,11 @@ public function multiply(self $x) public function divide(self $x) { static::checkInstance($this, $x); + $denominator = $x->value->modInverse(static::$modulo[$this->instanceID]); return new static($this->instanceID, $this->value->multiply($denominator)); } + /** * Performs power operation on a PrimeFieldInteger. * @@ -217,8 +245,10 @@ public function pow(BigInteger $x) { $temp = new static($this->instanceID); $temp->value = $this->value->powMod($x, static::$modulo[$this->instanceID]); + return $temp; } + /** * Calculates the square root * @@ -231,10 +261,11 @@ public function squareRoot() static::$one[$this->instanceID] = new BigInteger(1); static::$two[$this->instanceID] = new BigInteger(2); } - $one =& static::$one[$this->instanceID]; - $two =& static::$two[$this->instanceID]; - $modulo =& static::$modulo[$this->instanceID]; - $reduce =& static::$reduce[$this->instanceID]; + $one = &static::$one[$this->instanceID]; + $two = &static::$two[$this->instanceID]; + $modulo = &static::$modulo[$this->instanceID]; + $reduce = &static::$reduce[$this->instanceID]; + $p_1 = $modulo->subtract($one); $q = clone $p_1; $s = BigInteger::scan1divide($q); @@ -245,19 +276,22 @@ public function squareRoot() break; } } + $m = new BigInteger($s); $c = $z->powMod($q, $modulo); $t = $this->value->powMod($q, $modulo); list($temp) = $q->add($one)->divide($two); $r = $this->value->powMod($temp, $modulo); + while (!$t->equals($one)) { for ($i = clone $one; $i->compare($m) < 0; $i = $i->add($one)) { if ($t->powMod($two->pow($i), $modulo)->equals($one)) { break; } } + if ($i->compare($m) == 0) { - return \false; + return false; } $b = $c->powMod($two->pow($m->subtract($i)->subtract($one)), $modulo); $m = $i; @@ -265,8 +299,10 @@ public function squareRoot() $t = $reduce($t->multiply($c)); $r = $reduce($r->multiply($b)); } + return new static($this->instanceID, $r); } + /** * Is Odd? * @@ -276,6 +312,7 @@ public function isOdd() { return $this->value->isOdd(); } + /** * Negate * @@ -288,6 +325,7 @@ public function negate() { return new static($this->instanceID, static::$modulo[$this->instanceID]->subtract($this->value)); } + /** * Converts an Integer to a byte string (eg. base-256). * @@ -297,10 +335,11 @@ public function toBytes() { if (isset(static::$modulo[$this->instanceID])) { $length = static::$modulo[$this->instanceID]->getLengthInBytes(); - return \str_pad($this->value->toBytes(), $length, "\x00", \STR_PAD_LEFT); + return str_pad($this->value->toBytes(), $length, "\0", STR_PAD_LEFT); } return $this->value->toBytes(); } + /** * Converts an Integer to a hex string (eg. base-16). * @@ -310,6 +349,7 @@ public function toHex() { return Strings::bin2hex($this->toBytes()); } + /** * Converts an Integer to a bit string (eg. base-2). * @@ -322,8 +362,10 @@ public function toBits() if (!isset($length)) { $length = static::$modulo[$this->instanceID]->getLength(); } - return \str_pad($this->value->toBits(), $length, '0', \STR_PAD_LEFT); + + return str_pad($this->value->toBits(), $length, '0', STR_PAD_LEFT); } + /** * Returns the w-ary non-adjacent form (wNAF) * @@ -333,33 +375,41 @@ public function toBits() public function getNAF($w = 1) { $w++; - $zero =& static::$zero[$this->instanceID]; + + $zero = &static::$zero[$this->instanceID]; + $mask = new BigInteger((1 << $w) - 1); $sub = new BigInteger(1 << $w); //$sub = new BigInteger(1 << ($w - 1)); $d = $this->toBigInteger(); $d_i = []; + $i = 0; while ($d->compare($zero) > 0) { if ($d->isOdd()) { // start mods - $bigInteger = $d->testBit($w - 1) ? $d->bitwise_and($mask)->subtract($sub) : $d->bitwise_and($mask); + + $bigInteger = $d->testBit($w - 1) ? + $d->bitwise_and($mask)->subtract($sub) : + //$sub->subtract($d->bitwise_and($mask)) : + $d->bitwise_and($mask); // end mods $d = $d->subtract($bigInteger); $d_i[$i] = (int) $bigInteger->toString(); } else { $d_i[$i] = 0; } - $shift = !$d->equals($zero) && $d->bitwise_and($mask)->equals($zero) ? $w : 1; - // $w or $w + 1? + $shift = !$d->equals($zero) && $d->bitwise_and($mask)->equals($zero) ? $w : 1; // $w or $w + 1? $d = $d->bitwise_rightShift($shift); while (--$shift > 0) { $d_i[++$i] = 0; } $i++; } + return $d_i; } + /** * Converts an Integer to a BigInteger * @@ -369,6 +419,7 @@ public function toBigInteger() { return clone $this->value; } + /** * __toString() magic method * @@ -378,6 +429,7 @@ public function __toString() { return (string) $this->value; } + /** * __debugInfo() magic method * diff --git a/composer/phpseclib/phpseclib/phpseclib/Net/SFTP.php b/composer/phpseclib/phpseclib/phpseclib/Net/SFTP.php index bf8c5f7..6c503e7 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Net/SFTP.php +++ b/composer/phpseclib/phpseclib/phpseclib/Net/SFTP.php @@ -30,15 +30,16 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Net; use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; use OCA\Libresign\Vendor\phpseclib3\Exception\FileNotFoundException; + /** * Pure-PHP implementations of SFTP. * * @author Jim Wigginton - * @internal */ class SFTP extends SSH2 { @@ -51,6 +52,7 @@ class SFTP extends SSH2 * @see \phpseclib3\Net\SSH2::get_channel_packet() */ const CHANNEL = 0x100; + /** * Reads data from a local file. * @@ -83,6 +85,7 @@ class SFTP extends SSH2 * @see \phpseclib3\Net\SFTP::put() */ const RESUME_START = 8; + /** * Packet Types * @@ -91,6 +94,7 @@ class SFTP extends SSH2 * @access private */ private static $packet_types = []; + /** * Status Codes * @@ -99,14 +103,19 @@ class SFTP extends SSH2 * @access private */ private static $status_codes = []; + /** @var array */ private static $attributes; + /** @var array */ private static $open_flags; + /** @var array */ private static $open_flags5; + /** @var array */ private static $file_types; + /** * The Request ID * @@ -116,7 +125,8 @@ class SFTP extends SSH2 * @var boolean * @see self::_send_sftp_packet() */ - private $use_request_id = \false; + private $use_request_id = false; + /** * The Packet Type * @@ -127,6 +137,7 @@ class SFTP extends SSH2 * @see self::_get_sftp_packet() */ private $packet_type = -1; + /** * Packet Buffer * @@ -134,6 +145,7 @@ class SFTP extends SSH2 * @see self::_get_sftp_packet() */ private $packet_buffer = ''; + /** * Extensions supported by the server * @@ -141,6 +153,7 @@ class SFTP extends SSH2 * @see self::_initChannel() */ private $extensions = []; + /** * Server SFTP version * @@ -148,6 +161,7 @@ class SFTP extends SSH2 * @see self::_initChannel() */ private $version; + /** * Default Server SFTP version * @@ -155,6 +169,7 @@ class SFTP extends SSH2 * @see self::_initChannel() */ private $defaultVersion; + /** * Preferred SFTP version * @@ -162,6 +177,7 @@ class SFTP extends SSH2 * @see self::_initChannel() */ private $preferredVersion = 3; + /** * Current working directory * @@ -169,7 +185,8 @@ class SFTP extends SSH2 * @see self::realpath() * @see self::chdir() */ - private $pwd = \false; + private $pwd = false; + /** * Packet Type Log * @@ -177,6 +194,7 @@ class SFTP extends SSH2 * @var array */ private $packet_type_log = []; + /** * Packet Log * @@ -184,6 +202,7 @@ class SFTP extends SSH2 * @var array */ private $packet_log = []; + /** * Real-time log file pointer * @@ -191,6 +210,7 @@ class SFTP extends SSH2 * @var resource|closed-resource */ private $realtime_log_file; + /** * Real-time log file size * @@ -198,6 +218,7 @@ class SFTP extends SSH2 * @var int */ private $realtime_log_size; + /** * Real-time log file wrap boolean * @@ -205,6 +226,7 @@ class SFTP extends SSH2 * @var bool */ private $realtime_log_wrap; + /** * Current log size * @@ -213,6 +235,7 @@ class SFTP extends SSH2 * @var int */ private $log_size; + /** * Error information * @@ -221,6 +244,7 @@ class SFTP extends SSH2 * @var array */ private $sftp_errors = []; + /** * Stat Cache * @@ -233,6 +257,7 @@ class SFTP extends SSH2 * @var array */ private $stat_cache = []; + /** * Max SFTP Packet Size * @@ -241,6 +266,7 @@ class SFTP extends SSH2 * @var int */ private $max_sftp_packet; + /** * Stat Cache Flag * @@ -248,7 +274,8 @@ class SFTP extends SSH2 * @see self::enableStatCache() * @var bool */ - private $use_stat_cache = \true; + private $use_stat_cache = true; + /** * Sort Options * @@ -257,6 +284,7 @@ class SFTP extends SSH2 * @var array */ protected $sortOptions = []; + /** * Canonicalization Flag * @@ -268,7 +296,8 @@ class SFTP extends SSH2 * @see self::realpath() * @var bool */ - private $canonicalize_paths = \true; + private $canonicalize_paths = true; + /** * Request Buffers * @@ -276,6 +305,7 @@ class SFTP extends SSH2 * @var array */ private $requestBuffer = []; + /** * Preserve timestamps on file downloads / uploads * @@ -283,7 +313,8 @@ class SFTP extends SSH2 * @see self::put() * @var bool */ - private $preserveTime = \false; + private $preserveTime = false; + /** * Arbitrary Length Packets Flag * @@ -296,7 +327,8 @@ class SFTP extends SSH2 * @see self::_get_sftp_packet() * @var bool */ - private $allow_arbitrary_length_packets = \false; + private $allow_arbitrary_length_packets = false; + /** * Was the last packet due to the channels being closed or not? * @@ -304,13 +336,15 @@ class SFTP extends SSH2 * @see self::get_sftp_packet() * @var bool */ - private $channel_close = \false; + private $channel_close = false; + /** * Has the SFTP channel been partially negotiated? * * @var bool */ - private $partial_init = \false; + private $partial_init = false; + /** * Default Constructor. * @@ -325,68 +359,135 @@ class SFTP extends SSH2 public function __construct($host, $port = 22, $timeout = 10) { parent::__construct($host, $port, $timeout); + $this->max_sftp_packet = 1 << 15; + if (empty(self::$packet_types)) { - self::$packet_types = [1 => 'NET_SFTP_INIT', 2 => 'NET_SFTP_VERSION', 3 => 'NET_SFTP_OPEN', 4 => 'NET_SFTP_CLOSE', 5 => 'NET_SFTP_READ', 6 => 'NET_SFTP_WRITE', 7 => 'NET_SFTP_LSTAT', 9 => 'NET_SFTP_SETSTAT', 10 => 'NET_SFTP_FSETSTAT', 11 => 'NET_SFTP_OPENDIR', 12 => 'NET_SFTP_READDIR', 13 => 'NET_SFTP_REMOVE', 14 => 'NET_SFTP_MKDIR', 15 => 'NET_SFTP_RMDIR', 16 => 'NET_SFTP_REALPATH', 17 => 'NET_SFTP_STAT', 18 => 'NET_SFTP_RENAME', 19 => 'NET_SFTP_READLINK', 20 => 'NET_SFTP_SYMLINK', 21 => 'NET_SFTP_LINK', 101 => 'NET_SFTP_STATUS', 102 => 'NET_SFTP_HANDLE', 103 => 'NET_SFTP_DATA', 104 => 'NET_SFTP_NAME', 105 => 'NET_SFTP_ATTRS', 200 => 'NET_SFTP_EXTENDED', 201 => 'NET_SFTP_EXTENDED_REPLY']; - self::$status_codes = [0 => 'NET_SFTP_STATUS_OK', 1 => 'NET_SFTP_STATUS_EOF', 2 => 'NET_SFTP_STATUS_NO_SUCH_FILE', 3 => 'NET_SFTP_STATUS_PERMISSION_DENIED', 4 => 'NET_SFTP_STATUS_FAILURE', 5 => 'NET_SFTP_STATUS_BAD_MESSAGE', 6 => 'NET_SFTP_STATUS_NO_CONNECTION', 7 => 'NET_SFTP_STATUS_CONNECTION_LOST', 8 => 'NET_SFTP_STATUS_OP_UNSUPPORTED', 9 => 'NET_SFTP_STATUS_INVALID_HANDLE', 10 => 'NET_SFTP_STATUS_NO_SUCH_PATH', 11 => 'NET_SFTP_STATUS_FILE_ALREADY_EXISTS', 12 => 'NET_SFTP_STATUS_WRITE_PROTECT', 13 => 'NET_SFTP_STATUS_NO_MEDIA', 14 => 'NET_SFTP_STATUS_NO_SPACE_ON_FILESYSTEM', 15 => 'NET_SFTP_STATUS_QUOTA_EXCEEDED', 16 => 'NET_SFTP_STATUS_UNKNOWN_PRINCIPAL', 17 => 'NET_SFTP_STATUS_LOCK_CONFLICT', 18 => 'NET_SFTP_STATUS_DIR_NOT_EMPTY', 19 => 'NET_SFTP_STATUS_NOT_A_DIRECTORY', 20 => 'NET_SFTP_STATUS_INVALID_FILENAME', 21 => 'NET_SFTP_STATUS_LINK_LOOP', 22 => 'NET_SFTP_STATUS_CANNOT_DELETE', 23 => 'NET_SFTP_STATUS_INVALID_PARAMETER', 24 => 'NET_SFTP_STATUS_FILE_IS_A_DIRECTORY', 25 => 'NET_SFTP_STATUS_BYTE_RANGE_LOCK_CONFLICT', 26 => 'NET_SFTP_STATUS_BYTE_RANGE_LOCK_REFUSED', 27 => 'NET_SFTP_STATUS_DELETE_PENDING', 28 => 'NET_SFTP_STATUS_FILE_CORRUPT', 29 => 'NET_SFTP_STATUS_OWNER_INVALID', 30 => 'NET_SFTP_STATUS_GROUP_INVALID', 31 => 'NET_SFTP_STATUS_NO_MATCHING_BYTE_RANGE_LOCK']; + self::$packet_types = [ + 1 => 'NET_SFTP_INIT', + 2 => 'NET_SFTP_VERSION', + 3 => 'NET_SFTP_OPEN', + 4 => 'NET_SFTP_CLOSE', + 5 => 'NET_SFTP_READ', + 6 => 'NET_SFTP_WRITE', + 7 => 'NET_SFTP_LSTAT', + 9 => 'NET_SFTP_SETSTAT', + 10 => 'NET_SFTP_FSETSTAT', + 11 => 'NET_SFTP_OPENDIR', + 12 => 'NET_SFTP_READDIR', + 13 => 'NET_SFTP_REMOVE', + 14 => 'NET_SFTP_MKDIR', + 15 => 'NET_SFTP_RMDIR', + 16 => 'NET_SFTP_REALPATH', + 17 => 'NET_SFTP_STAT', + 18 => 'NET_SFTP_RENAME', + 19 => 'NET_SFTP_READLINK', + 20 => 'NET_SFTP_SYMLINK', + 21 => 'NET_SFTP_LINK', + + 101 => 'NET_SFTP_STATUS', + 102 => 'NET_SFTP_HANDLE', + 103 => 'NET_SFTP_DATA', + 104 => 'NET_SFTP_NAME', + 105 => 'NET_SFTP_ATTRS', + + 200 => 'NET_SFTP_EXTENDED', + 201 => 'NET_SFTP_EXTENDED_REPLY' + ]; + self::$status_codes = [ + 0 => 'NET_SFTP_STATUS_OK', + 1 => 'NET_SFTP_STATUS_EOF', + 2 => 'NET_SFTP_STATUS_NO_SUCH_FILE', + 3 => 'NET_SFTP_STATUS_PERMISSION_DENIED', + 4 => 'NET_SFTP_STATUS_FAILURE', + 5 => 'NET_SFTP_STATUS_BAD_MESSAGE', + 6 => 'NET_SFTP_STATUS_NO_CONNECTION', + 7 => 'NET_SFTP_STATUS_CONNECTION_LOST', + 8 => 'NET_SFTP_STATUS_OP_UNSUPPORTED', + 9 => 'NET_SFTP_STATUS_INVALID_HANDLE', + 10 => 'NET_SFTP_STATUS_NO_SUCH_PATH', + 11 => 'NET_SFTP_STATUS_FILE_ALREADY_EXISTS', + 12 => 'NET_SFTP_STATUS_WRITE_PROTECT', + 13 => 'NET_SFTP_STATUS_NO_MEDIA', + 14 => 'NET_SFTP_STATUS_NO_SPACE_ON_FILESYSTEM', + 15 => 'NET_SFTP_STATUS_QUOTA_EXCEEDED', + 16 => 'NET_SFTP_STATUS_UNKNOWN_PRINCIPAL', + 17 => 'NET_SFTP_STATUS_LOCK_CONFLICT', + 18 => 'NET_SFTP_STATUS_DIR_NOT_EMPTY', + 19 => 'NET_SFTP_STATUS_NOT_A_DIRECTORY', + 20 => 'NET_SFTP_STATUS_INVALID_FILENAME', + 21 => 'NET_SFTP_STATUS_LINK_LOOP', + 22 => 'NET_SFTP_STATUS_CANNOT_DELETE', + 23 => 'NET_SFTP_STATUS_INVALID_PARAMETER', + 24 => 'NET_SFTP_STATUS_FILE_IS_A_DIRECTORY', + 25 => 'NET_SFTP_STATUS_BYTE_RANGE_LOCK_CONFLICT', + 26 => 'NET_SFTP_STATUS_BYTE_RANGE_LOCK_REFUSED', + 27 => 'NET_SFTP_STATUS_DELETE_PENDING', + 28 => 'NET_SFTP_STATUS_FILE_CORRUPT', + 29 => 'NET_SFTP_STATUS_OWNER_INVALID', + 30 => 'NET_SFTP_STATUS_GROUP_INVALID', + 31 => 'NET_SFTP_STATUS_NO_MATCHING_BYTE_RANGE_LOCK' + ]; // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-7.1 // the order, in this case, matters quite a lot - see \phpseclib3\Net\SFTP::_parseAttributes() to understand why self::$attributes = [ - 0x1 => 'NET_SFTP_ATTR_SIZE', - 0x2 => 'NET_SFTP_ATTR_UIDGID', - // defined in SFTPv3, removed in SFTPv4+ - 0x80 => 'NET_SFTP_ATTR_OWNERGROUP', - // defined in SFTPv4+ - 0x4 => 'NET_SFTP_ATTR_PERMISSIONS', - 0x8 => 'NET_SFTP_ATTR_ACCESSTIME', - 0x10 => 'NET_SFTP_ATTR_CREATETIME', - // SFTPv4+ - 0x20 => 'NET_SFTP_ATTR_MODIFYTIME', - 0x40 => 'NET_SFTP_ATTR_ACL', - 0x100 => 'NET_SFTP_ATTR_SUBSECOND_TIMES', - 0x200 => 'NET_SFTP_ATTR_BITS', - // SFTPv5+ - 0x400 => 'NET_SFTP_ATTR_ALLOCATION_SIZE', - // SFTPv6+ - 0x800 => 'NET_SFTP_ATTR_TEXT_HINT', - 0x1000 => 'NET_SFTP_ATTR_MIME_TYPE', - 0x2000 => 'NET_SFTP_ATTR_LINK_COUNT', - 0x4000 => 'NET_SFTP_ATTR_UNTRANSLATED_NAME', - 0x8000 => 'NET_SFTP_ATTR_CTIME', + 0x00000001 => 'NET_SFTP_ATTR_SIZE', + 0x00000002 => 'NET_SFTP_ATTR_UIDGID', // defined in SFTPv3, removed in SFTPv4+ + 0x00000080 => 'NET_SFTP_ATTR_OWNERGROUP', // defined in SFTPv4+ + 0x00000004 => 'NET_SFTP_ATTR_PERMISSIONS', + 0x00000008 => 'NET_SFTP_ATTR_ACCESSTIME', + 0x00000010 => 'NET_SFTP_ATTR_CREATETIME', // SFTPv4+ + 0x00000020 => 'NET_SFTP_ATTR_MODIFYTIME', + 0x00000040 => 'NET_SFTP_ATTR_ACL', + 0x00000100 => 'NET_SFTP_ATTR_SUBSECOND_TIMES', + 0x00000200 => 'NET_SFTP_ATTR_BITS', // SFTPv5+ + 0x00000400 => 'NET_SFTP_ATTR_ALLOCATION_SIZE', // SFTPv6+ + 0x00000800 => 'NET_SFTP_ATTR_TEXT_HINT', + 0x00001000 => 'NET_SFTP_ATTR_MIME_TYPE', + 0x00002000 => 'NET_SFTP_ATTR_LINK_COUNT', + 0x00004000 => 'NET_SFTP_ATTR_UNTRANSLATED_NAME', + 0x00008000 => 'NET_SFTP_ATTR_CTIME', // 0x80000000 will yield a floating point on 32-bit systems and converting floating points to integers // yields inconsistent behavior depending on how php is compiled. so we left shift -1 (which, in // two's compliment, consists of all 1 bits) by 31. on 64-bit systems this'll yield 0xFFFFFFFF80000000. // that's not a problem, however, and 'anded' and a 32-bit number, as all the leading 1 bits are ignored. - \PHP_INT_SIZE == 4 ? -1 << 31 : 0x80000000 => 'NET_SFTP_ATTR_EXTENDED', + (PHP_INT_SIZE == 4 ? (-1 << 31) : 0x80000000) => 'NET_SFTP_ATTR_EXTENDED' ]; // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-04#section-6.3 // the flag definitions change somewhat in SFTPv5+. if SFTPv5+ support is added to this library, maybe name // the array for that $this->open5_flags and similarly alter the constant names. - self::$open_flags = [0x1 => 'NET_SFTP_OPEN_READ', 0x2 => 'NET_SFTP_OPEN_WRITE', 0x4 => 'NET_SFTP_OPEN_APPEND', 0x8 => 'NET_SFTP_OPEN_CREATE', 0x10 => 'NET_SFTP_OPEN_TRUNCATE', 0x20 => 'NET_SFTP_OPEN_EXCL', 0x40 => 'NET_SFTP_OPEN_TEXT']; + self::$open_flags = [ + 0x00000001 => 'NET_SFTP_OPEN_READ', + 0x00000002 => 'NET_SFTP_OPEN_WRITE', + 0x00000004 => 'NET_SFTP_OPEN_APPEND', + 0x00000008 => 'NET_SFTP_OPEN_CREATE', + 0x00000010 => 'NET_SFTP_OPEN_TRUNCATE', + 0x00000020 => 'NET_SFTP_OPEN_EXCL', + 0x00000040 => 'NET_SFTP_OPEN_TEXT' // defined in SFTPv4 + ]; // SFTPv5+ changed the flags up: // https://datatracker.ietf.org/doc/html/draft-ietf-secsh-filexfer-13#section-8.1.1.3 self::$open_flags5 = [ // when SSH_FXF_ACCESS_DISPOSITION is a 3 bit field that controls how the file is opened - 0x0 => 'NET_SFTP_OPEN_CREATE_NEW', - 0x1 => 'NET_SFTP_OPEN_CREATE_TRUNCATE', - 0x2 => 'NET_SFTP_OPEN_OPEN_EXISTING', - 0x3 => 'NET_SFTP_OPEN_OPEN_OR_CREATE', - 0x4 => 'NET_SFTP_OPEN_TRUNCATE_EXISTING', + 0x00000000 => 'NET_SFTP_OPEN_CREATE_NEW', + 0x00000001 => 'NET_SFTP_OPEN_CREATE_TRUNCATE', + 0x00000002 => 'NET_SFTP_OPEN_OPEN_EXISTING', + 0x00000003 => 'NET_SFTP_OPEN_OPEN_OR_CREATE', + 0x00000004 => 'NET_SFTP_OPEN_TRUNCATE_EXISTING', // the rest of the flags are not supported - 0x8 => 'NET_SFTP_OPEN_APPEND_DATA', - // "the offset field of SS_FXP_WRITE requests is ignored" - 0x10 => 'NET_SFTP_OPEN_APPEND_DATA_ATOMIC', - 0x20 => 'NET_SFTP_OPEN_TEXT_MODE', - 0x40 => 'NET_SFTP_OPEN_BLOCK_READ', - 0x80 => 'NET_SFTP_OPEN_BLOCK_WRITE', - 0x100 => 'NET_SFTP_OPEN_BLOCK_DELETE', - 0x200 => 'NET_SFTP_OPEN_BLOCK_ADVISORY', - 0x400 => 'NET_SFTP_OPEN_NOFOLLOW', - 0x800 => 'NET_SFTP_OPEN_DELETE_ON_CLOSE', - 0x1000 => 'NET_SFTP_OPEN_ACCESS_AUDIT_ALARM_INFO', - 0x2000 => 'NET_SFTP_OPEN_ACCESS_BACKUP', - 0x4000 => 'NET_SFTP_OPEN_BACKUP_STREAM', - 0x8000 => 'NET_SFTP_OPEN_OVERRIDE_OWNER', + 0x00000008 => 'NET_SFTP_OPEN_APPEND_DATA', // "the offset field of SS_FXP_WRITE requests is ignored" + 0x00000010 => 'NET_SFTP_OPEN_APPEND_DATA_ATOMIC', + 0x00000020 => 'NET_SFTP_OPEN_TEXT_MODE', + 0x00000040 => 'NET_SFTP_OPEN_BLOCK_READ', + 0x00000080 => 'NET_SFTP_OPEN_BLOCK_WRITE', + 0x00000100 => 'NET_SFTP_OPEN_BLOCK_DELETE', + 0x00000200 => 'NET_SFTP_OPEN_BLOCK_ADVISORY', + 0x00000400 => 'NET_SFTP_OPEN_NOFOLLOW', + 0x00000800 => 'NET_SFTP_OPEN_DELETE_ON_CLOSE', + 0x00001000 => 'NET_SFTP_OPEN_ACCESS_AUDIT_ALARM_INFO', + 0x00002000 => 'NET_SFTP_OPEN_ACCESS_BACKUP', + 0x00004000 => 'NET_SFTP_OPEN_BACKUP_STREAM', + 0x00008000 => 'NET_SFTP_OPEN_OVERRIDE_OWNER', ]; // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-04#section-5.2 // see \phpseclib3\Net\SFTP::_parseLongname() for an explanation @@ -401,17 +502,26 @@ public function __construct($host, $port = 22, $timeout = 10) 6 => 'NET_SFTP_TYPE_SOCKET', 7 => 'NET_SFTP_TYPE_CHAR_DEVICE', 8 => 'NET_SFTP_TYPE_BLOCK_DEVICE', - 9 => 'NET_SFTP_TYPE_FIFO', + 9 => 'NET_SFTP_TYPE_FIFO' ]; - self::define_array(self::$packet_types, self::$status_codes, self::$attributes, self::$open_flags, self::$open_flags5, self::$file_types); + self::define_array( + self::$packet_types, + self::$status_codes, + self::$attributes, + self::$open_flags, + self::$open_flags5, + self::$file_types + ); } - if (!\defined('NET_SFTP_QUEUE_SIZE')) { - \define('NET_SFTP_QUEUE_SIZE', 32); + + if (!defined('NET_SFTP_QUEUE_SIZE')) { + define('NET_SFTP_QUEUE_SIZE', 32); } - if (!\defined('NET_SFTP_UPLOAD_QUEUE_SIZE')) { - \define('NET_SFTP_UPLOAD_QUEUE_SIZE', 1024); + if (!defined('NET_SFTP_UPLOAD_QUEUE_SIZE')) { + define('NET_SFTP_UPLOAD_QUEUE_SIZE', 1024); } } + /** * Check a few things before SFTP functions are called * @@ -420,13 +530,16 @@ public function __construct($host, $port = 22, $timeout = 10) private function precheck() { if (!($this->bitmap & SSH2::MASK_LOGIN)) { - return \false; + return false; } - if ($this->pwd === \false) { + + if ($this->pwd === false) { return $this->init_sftp_connection(); } - return \true; + + return true; } + /** * Partially initialize an SFTP connection * @@ -435,44 +548,73 @@ private function precheck() */ private function partial_init_sftp_connection() { - $response = $this->open_channel(self::CHANNEL, \true); - if ($response === \true && $this->isTimeout()) { - return \false; + $response = $this->open_channel(self::CHANNEL, true); + if ($response === true && $this->isTimeout()) { + return false; } - $packet = Strings::packSSH2('CNsbs', NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[self::CHANNEL], 'subsystem', \true, 'sftp'); + + $packet = Strings::packSSH2( + 'CNsbs', + NET_SSH2_MSG_CHANNEL_REQUEST, + $this->server_channels[self::CHANNEL], + 'subsystem', + true, + 'sftp' + ); $this->send_binary_packet($packet); + $this->channel_status[self::CHANNEL] = NET_SSH2_MSG_CHANNEL_REQUEST; - $response = $this->get_channel_packet(self::CHANNEL, \true); - if ($response === \false) { + + $response = $this->get_channel_packet(self::CHANNEL, true); + if ($response === false) { // from PuTTY's psftp.exe - $command = "test -x /usr/lib/sftp-server && exec /usr/lib/sftp-server\n" . "test -x /usr/local/lib/sftp-server && exec /usr/local/lib/sftp-server\n" . "exec sftp-server"; + $command = "test -x /usr/lib/sftp-server && exec /usr/lib/sftp-server\n" . + "test -x /usr/local/lib/sftp-server && exec /usr/local/lib/sftp-server\n" . + "exec sftp-server"; // we don't do $this->exec($command, false) because exec() operates on a different channel and plus the SSH_MSG_CHANNEL_OPEN that exec() does // is redundant - $packet = Strings::packSSH2('CNsCs', NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[self::CHANNEL], 'exec', 1, $command); + $packet = Strings::packSSH2( + 'CNsCs', + NET_SSH2_MSG_CHANNEL_REQUEST, + $this->server_channels[self::CHANNEL], + 'exec', + 1, + $command + ); $this->send_binary_packet($packet); + $this->channel_status[self::CHANNEL] = NET_SSH2_MSG_CHANNEL_REQUEST; - $response = $this->get_channel_packet(self::CHANNEL, \true); - if ($response === \false) { - return \false; + + $response = $this->get_channel_packet(self::CHANNEL, true); + if ($response === false) { + return false; } - } elseif ($response === \true && $this->isTimeout()) { - return \false; + } elseif ($response === true && $this->isTimeout()) { + return false; } + $this->channel_status[self::CHANNEL] = NET_SSH2_MSG_CHANNEL_DATA; - $this->send_sftp_packet(NET_SFTP_INIT, "\x00\x00\x00\x03"); + $this->send_sftp_packet(NET_SFTP_INIT, "\0\0\0\3"); + $response = $this->get_sftp_packet(); if ($this->packet_type != NET_SFTP_VERSION) { - throw new \UnexpectedValueException('Expected NET_SFTP_VERSION. ' . 'Got packet type: ' . $this->packet_type); + throw new \UnexpectedValueException('Expected NET_SFTP_VERSION. ' + . 'Got packet type: ' . $this->packet_type); } - $this->use_request_id = \true; + + $this->use_request_id = true; + list($this->defaultVersion) = Strings::unpackSSH2('N', $response); while (!empty($response)) { list($key, $value) = Strings::unpackSSH2('ss', $response); $this->extensions[$key] = $value; } - $this->partial_init = \true; - return \true; + + $this->partial_init = true; + + return true; } + /** * (Re)initializes the SFTP channel * @@ -481,25 +623,26 @@ private function partial_init_sftp_connection() private function init_sftp_connection() { if (!$this->partial_init && !$this->partial_init_sftp_connection()) { - return \false; + return false; } + /* A Note on SFTPv4/5/6 support: states the following: - + "If the client wishes to interoperate with servers that support noncontiguous version numbers it SHOULD send '3'" - + Given that the server only sends its version number after the client has already done so, the above seems to be suggesting that v3 should be the default version. This makes sense given that v3 is the most popular. - + states the following; - + "If the server did not send the "versions" extension, or the version-from-list was not included, the server MAY send a status response describing the failure, but MUST then close the channel without processing any further requests." - + So what do you do if you have a client whose initial SSH_FXP_INIT packet says it implements v3 and a server whose initial SSH_FXP_VERSION reply says it implements v4 and only v4? If it only implements v4, the "versions" extension is likely not going to have been sent so version re-negotiation as discussed @@ -508,33 +651,36 @@ private function init_sftp_connection() */ $this->version = $this->defaultVersion; if (isset($this->extensions['versions']) && (!$this->preferredVersion || $this->preferredVersion != $this->version)) { - $versions = \explode(',', $this->extensions['versions']); + $versions = explode(',', $this->extensions['versions']); $supported = [6, 5, 4]; if ($this->preferredVersion) { - $supported = \array_diff($supported, [$this->preferredVersion]); - \array_unshift($supported, $this->preferredVersion); + $supported = array_diff($supported, [$this->preferredVersion]); + array_unshift($supported, $this->preferredVersion); } foreach ($supported as $ver) { - if (\in_array($ver, $versions)) { + if (in_array($ver, $versions)) { if ($ver === $this->version) { break; } $this->version = (int) $ver; - $packet = Strings::packSSH2('ss', 'version-select', "{$ver}"); + $packet = Strings::packSSH2('ss', 'version-select', "$ver"); $this->send_sftp_packet(NET_SFTP_EXTENDED, $packet); $response = $this->get_sftp_packet(); if ($this->packet_type != NET_SFTP_STATUS) { - throw new \UnexpectedValueException('Expected NET_SFTP_STATUS. ' . 'Got packet type: ' . $this->packet_type); + throw new \UnexpectedValueException('Expected NET_SFTP_STATUS. ' + . 'Got packet type: ' . $this->packet_type); } list($status) = Strings::unpackSSH2('N', $response); if ($status != NET_SFTP_STATUS_OK) { $this->logError($response, $status); - throw new \UnexpectedValueException('Expected NET_SFTP_STATUS_OK. ' . ' Got ' . $status); + throw new \UnexpectedValueException('Expected NET_SFTP_STATUS_OK. ' + . ' Got ' . $status); } break; } } } + /* SFTPv4+ defines a 'newline' extension. SFTPv3 seems to have unofficial support for it via 'newline@vandyke.com', however, I'm not sure what 'newline@vandyke.com' is supposed to do (the fact that it's unofficial means that it's @@ -549,38 +695,44 @@ private function init_sftp_connection() } */ if ($this->version < 2 || $this->version > 6) { - return \false; + return false; } - $this->pwd = \true; + + $this->pwd = true; try { $this->pwd = $this->realpath('.'); } catch (\UnexpectedValueException $e) { if (!$this->canonicalize_paths) { throw $e; } - $this->canonicalize_paths = \false; + $this->canonicalize_paths = false; $this->reset_sftp(); return $this->init_sftp_connection(); } + $this->update_stat_cache($this->pwd, []); - return \true; + + return true; } + /** * Disable the stat cache * */ public function disableStatCache() { - $this->use_stat_cache = \false; + $this->use_stat_cache = false; } + /** * Enable the stat cache * */ public function enableStatCache() { - $this->use_stat_cache = \true; + $this->use_stat_cache = true; } + /** * Clear the stat cache * @@ -589,14 +741,16 @@ public function clearStatCache() { $this->stat_cache = []; } + /** * Enable path canonicalization * */ public function enablePathCanonicalization() { - $this->canonicalize_paths = \true; + $this->canonicalize_paths = true; } + /** * Disable path canonicalization * @@ -605,24 +759,27 @@ public function enablePathCanonicalization() */ public function disablePathCanonicalization() { - $this->canonicalize_paths = \false; + $this->canonicalize_paths = false; } + /** * Enable arbitrary length packets * */ public function enableArbitraryLengthPackets() { - $this->allow_arbitrary_length_packets = \true; + $this->allow_arbitrary_length_packets = true; } + /** * Disable arbitrary length packets * */ public function disableArbitraryLengthPackets() { - $this->allow_arbitrary_length_packets = \false; + $this->allow_arbitrary_length_packets = false; } + /** * Returns the current directory name * @@ -631,10 +788,12 @@ public function disableArbitraryLengthPackets() public function pwd() { if (!$this->precheck()) { - return \false; + return false; } + return $this->pwd; } + /** * Logs errors * @@ -646,14 +805,17 @@ private function logError($response, $status = -1) if ($status == -1) { list($status) = Strings::unpackSSH2('N', $response); } + $error = self::$status_codes[$status]; + if ($this->version > 2) { list($message) = Strings::unpackSSH2('s', $response); - $this->sftp_errors[] = "{$error}: {$message}"; + $this->sftp_errors[] = "$error: $message"; } else { $this->sftp_errors[] = $error; } } + /** * Canonicalize the Server-Side Path Name * @@ -670,18 +832,20 @@ private function logError($response, $status = -1) */ public function realpath($path) { - if ($this->precheck() === \false) { - return \false; + if ($this->precheck() === false) { + return false; } + $path = (string) $path; + if (!$this->canonicalize_paths) { - if ($this->pwd === \true) { + if ($this->pwd === true) { return '.'; } - if (!\strlen($path) || $path[0] != '/') { + if (!strlen($path) || $path[0] != '/') { $path = $this->pwd . '/' . $path; } - $parts = \explode('/', $path); + $parts = explode('/', $path); $afterPWD = $beforePWD = []; foreach ($parts as $part) { switch ($part) { @@ -690,7 +854,7 @@ public function realpath($path) break; case '..': if (!empty($afterPWD)) { - \array_pop($afterPWD); + array_pop($afterPWD); } else { $beforePWD[] = '..'; } @@ -699,12 +863,14 @@ public function realpath($path) $afterPWD[] = $part; } } - $beforePWD = \count($beforePWD) ? \implode('/', $beforePWD) : '.'; - return $beforePWD . '/' . \implode('/', $afterPWD); + $beforePWD = count($beforePWD) ? implode('/', $beforePWD) : '.'; + return $beforePWD . '/' . implode('/', $afterPWD); } - if ($this->pwd === \true) { + + if ($this->pwd === true) { // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.9 $this->send_sftp_packet(NET_SFTP_REALPATH, Strings::packSSH2('s', $path)); + $response = $this->get_sftp_packet(); switch ($this->packet_type) { case NET_SFTP_NAME: @@ -715,32 +881,37 @@ public function realpath($path) return $filename; case NET_SFTP_STATUS: $this->logError($response); - return \false; + return false; default: - throw new \UnexpectedValueException('Expected NET_SFTP_NAME or NET_SFTP_STATUS. ' . 'Got packet type: ' . $this->packet_type); + throw new \UnexpectedValueException('Expected NET_SFTP_NAME or NET_SFTP_STATUS. ' + . 'Got packet type: ' . $this->packet_type); } } - if (!\strlen($path) || $path[0] != '/') { + + if (!strlen($path) || $path[0] != '/') { $path = $this->pwd . '/' . $path; } - $path = \explode('/', $path); + + $path = explode('/', $path); $new = []; foreach ($path as $dir) { - if (!\strlen($dir)) { + if (!strlen($dir)) { continue; } switch ($dir) { case '..': - \array_pop($new); - // fall-through + array_pop($new); + // fall-through case '.': break; default: $new[] = $dir; } } - return '/' . \implode('/', $new); + + return '/' . implode('/', $new); } + /** * Changes the current directory * @@ -751,49 +922,61 @@ public function realpath($path) public function chdir($dir) { if (!$this->precheck()) { - return \false; + return false; } + $dir = (string) $dir; + // assume current dir if $dir is empty if ($dir === '') { $dir = './'; - // suffix a slash if needed - } elseif ($dir[\strlen($dir) - 1] != '/') { + // suffix a slash if needed + } elseif ($dir[strlen($dir) - 1] != '/') { $dir .= '/'; } + $dir = $this->realpath($dir); - if ($dir === \false) { - return \false; + if ($dir === false) { + return false; } + // confirm that $dir is, in fact, a valid directory - if ($this->use_stat_cache && \is_array($this->query_stat_cache($dir))) { + if ($this->use_stat_cache && is_array($this->query_stat_cache($dir))) { $this->pwd = $dir; - return \true; + return true; } + // we could do a stat on the alleged $dir to see if it's a directory but that doesn't tell us // the currently logged in user has the appropriate permissions or not. maybe you could see if // the file's uid / gid match the currently logged in user's uid / gid but how there's no easy // way to get those with SFTP + $this->send_sftp_packet(NET_SFTP_OPENDIR, Strings::packSSH2('s', $dir)); + // see \phpseclib3\Net\SFTP::nlist() for a more thorough explanation of the following $response = $this->get_sftp_packet(); switch ($this->packet_type) { case NET_SFTP_HANDLE: - $handle = \substr($response, 4); + $handle = substr($response, 4); break; case NET_SFTP_STATUS: $this->logError($response); - return \false; + return false; default: - throw new \UnexpectedValueException('Expected NET_SFTP_HANDLE or NET_SFTP_STATUS' . 'Got packet type: ' . $this->packet_type); + throw new \UnexpectedValueException('Expected NET_SFTP_HANDLE or NET_SFTP_STATUS' . + 'Got packet type: ' . $this->packet_type); } + if (!$this->close_handle($handle)) { - return \false; + return false; } + $this->update_stat_cache($dir, []); + $this->pwd = $dir; - return \true; + return true; } + /** * Returns a list of files in the given directory * @@ -801,10 +984,11 @@ public function chdir($dir) * @param bool $recursive * @return array|false */ - public function nlist($dir = '.', $recursive = \false) + public function nlist($dir = '.', $recursive = false) { return $this->nlist_helper($dir, $recursive, ''); } + /** * Helper method for nlist * @@ -815,31 +999,36 @@ public function nlist($dir = '.', $recursive = \false) */ private function nlist_helper($dir, $recursive, $relativeDir) { - $files = $this->readlist($dir, \false); + $files = $this->readlist($dir, false); + // If we get an int back, then that is an "unexpected" status. // We do not have a file list, so return false. - if (\is_int($files)) { - return \false; + if (is_int($files)) { + return false; } - if (!$recursive || $files === \false) { + + if (!$recursive || $files === false) { return $files; } + $result = []; foreach ($files as $value) { if ($value == '.' || $value == '..') { $result[] = $relativeDir . $value; continue; } - if (\is_array($this->query_stat_cache($this->realpath($dir . '/' . $value)))) { - $temp = $this->nlist_helper($dir . '/' . $value, \true, $relativeDir . $value . '/'); - $temp = \is_array($temp) ? $temp : []; - $result = \array_merge($result, $temp); + if (is_array($this->query_stat_cache($this->realpath($dir . '/' . $value)))) { + $temp = $this->nlist_helper($dir . '/' . $value, true, $relativeDir . $value . '/'); + $temp = is_array($temp) ? $temp : []; + $result = array_merge($result, $temp); } else { $result[] = $relativeDir . $value; } } + return $result; } + /** * Returns a detailed list of files in the given directory * @@ -847,42 +1036,49 @@ private function nlist_helper($dir, $recursive, $relativeDir) * @param bool $recursive * @return array|false */ - public function rawlist($dir = '.', $recursive = \false) + public function rawlist($dir = '.', $recursive = false) { - $files = $this->readlist($dir, \true); + $files = $this->readlist($dir, true); + // If we get an int back, then that is an "unexpected" status. // We do not have a file list, so return false. - if (\is_int($files)) { - return \false; + if (is_int($files)) { + return false; } - if (!$recursive || $files === \false) { + + if (!$recursive || $files === false) { return $files; } + static $depth = 0; + foreach ($files as $key => $value) { if ($depth != 0 && $key == '..') { unset($files[$key]); continue; } - $is_directory = \false; + $is_directory = false; if ($key != '.' && $key != '..') { if ($this->use_stat_cache) { - $is_directory = \is_array($this->query_stat_cache($this->realpath($dir . '/' . $key))); + $is_directory = is_array($this->query_stat_cache($this->realpath($dir . '/' . $key))); } else { $stat = $this->lstat($dir . '/' . $key); $is_directory = $stat && $stat['type'] === NET_SFTP_TYPE_DIRECTORY; } } + if ($is_directory) { $depth++; - $files[$key] = $this->rawlist($dir . '/' . $key, \true); + $files[$key] = $this->rawlist($dir . '/' . $key, true); $depth--; } else { $files[$key] = (object) $value; } } + return $files; } + /** * Reads a list, be it detailed or not, of files in the given directory * @@ -891,24 +1087,27 @@ public function rawlist($dir = '.', $recursive = \false) * @return array|false * @throws \UnexpectedValueException on receipt of unexpected packets */ - private function readlist($dir, $raw = \true) + private function readlist($dir, $raw = true) { if (!$this->precheck()) { - return \false; + return false; } + $dir = $this->realpath($dir . '/'); - if ($dir === \false) { - return \false; + if ($dir === false) { + return false; } + // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.1.2 $this->send_sftp_packet(NET_SFTP_OPENDIR, Strings::packSSH2('s', $dir)); + $response = $this->get_sftp_packet(); switch ($this->packet_type) { case NET_SFTP_HANDLE: // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-9.2 // since 'handle' is the last field in the SSH_FXP_HANDLE packet, we'll just remove the first four bytes that // represent the length of the string and leave it at that - $handle = \substr($response, 4); + $handle = substr($response, 4); break; case NET_SFTP_STATUS: // presumably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED @@ -916,15 +1115,19 @@ private function readlist($dir, $raw = \true) $this->logError($response, $status); return $status; default: - throw new \UnexpectedValueException('Expected NET_SFTP_HANDLE or NET_SFTP_STATUS. ' . 'Got packet type: ' . $this->packet_type); + throw new \UnexpectedValueException('Expected NET_SFTP_HANDLE or NET_SFTP_STATUS. ' + . 'Got packet type: ' . $this->packet_type); } + $this->update_stat_cache($dir, []); + $contents = []; - while (\true) { + while (true) { // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.2.2 // why multiple SSH_FXP_READDIR packets would be sent when the response to a single one can span arbitrarily many // SSH_MSG_CHANNEL_DATA messages is not known to me. $this->send_sftp_packet(NET_SFTP_READDIR, Strings::packSSH2('s', $handle)); + $response = $this->get_sftp_packet(); switch ($this->packet_type) { case NET_SFTP_NAME: @@ -944,6 +1147,7 @@ private function readlist($dir, $raw = \true) } } $contents[$shortname] = $attributes + ['filename' => $shortname]; + if (isset($attributes['type']) && $attributes['type'] == NET_SFTP_TYPE_DIRECTORY && ($shortname != '.' && $shortname != '..')) { $this->update_stat_cache($dir . '/' . $shortname, []); } else { @@ -966,17 +1170,22 @@ private function readlist($dir, $raw = \true) } break 2; default: - throw new \UnexpectedValueException('Expected NET_SFTP_NAME or NET_SFTP_STATUS. ' . 'Got packet type: ' . $this->packet_type); + throw new \UnexpectedValueException('Expected NET_SFTP_NAME or NET_SFTP_STATUS. ' + . 'Got packet type: ' . $this->packet_type); } } + if (!$this->close_handle($handle)) { - return \false; + return false; } - if (\count($this->sortOptions)) { - \uasort($contents, [&$this, 'comparator']); + + if (count($this->sortOptions)) { + uasort($contents, [&$this, 'comparator']); } - return $raw ? $contents : \array_map('strval', \array_keys($contents)); + + return $raw ? $contents : array_map('strval', array_keys($contents)); } + /** * Compares two rawlist entries using parameters set by setListOrder() * @@ -988,7 +1197,7 @@ private function readlist($dir, $raw = \true) */ private function comparator(array $a, array $b) { - switch (\true) { + switch (true) { case $a['filename'] === '.' || $b['filename'] === '.': if ($a['filename'] === $b['filename']) { return 0; @@ -1022,23 +1231,24 @@ private function comparator(array $a, array $b) } switch ($sort) { case 'filename': - $result = \strcasecmp($a['filename'], $b['filename']); + $result = strcasecmp($a['filename'], $b['filename']); if ($result) { - return $order === \SORT_DESC ? -$result : $result; + return $order === SORT_DESC ? -$result : $result; } break; case 'mode': $a[$sort] &= 07777; $b[$sort] &= 07777; - // fall-through + // fall-through default: if ($a[$sort] === $b[$sort]) { break; } - return $order === \SORT_ASC ? $a[$sort] - $b[$sort] : $b[$sort] - $a[$sort]; + return $order === SORT_ASC ? $a[$sort] - $b[$sort] : $b[$sort] - $a[$sort]; } } } + /** * Defines how nlist() and rawlist() will be sorted - if at all. * @@ -1065,14 +1275,15 @@ public function setListOrder(...$args) if (empty($args)) { return; } - $len = \count($args) & 0x7ffffffe; + $len = count($args) & 0x7FFFFFFE; for ($i = 0; $i < $len; $i += 2) { $this->sortOptions[$args[$i]] = $args[$i + 1]; } - if (!\count($this->sortOptions)) { - $this->sortOptions = ['bogus' => \true]; + if (!count($this->sortOptions)) { + $this->sortOptions = ['bogus' => true]; } } + /** * Save files / directories to cache * @@ -1081,25 +1292,27 @@ public function setListOrder(...$args) */ private function update_stat_cache($path, $value) { - if ($this->use_stat_cache === \false) { + if ($this->use_stat_cache === false) { return; } + // preg_replace('#^/|/(?=/)|/$#', '', $dir) == str_replace('//', '/', trim($path, '/')) - $dirs = \explode('/', \preg_replace('#^/|/(?=/)|/$#', '', $path)); - $temp =& $this->stat_cache; - $max = \count($dirs) - 1; + $dirs = explode('/', preg_replace('#^/|/(?=/)|/$#', '', $path)); + + $temp = &$this->stat_cache; + $max = count($dirs) - 1; foreach ($dirs as $i => $dir) { // if $temp is an object that means one of two things. // 1. a file was deleted and changed to a directory behind phpseclib's back // 2. it's a symlink. when lstat is done it's unclear what it's a symlink to - if (\is_object($temp)) { + if (is_object($temp)) { $temp = []; } if (!isset($temp[$dir])) { $temp[$dir] = []; } if ($i === $max) { - if (\is_object($temp[$dir]) && \is_object($value)) { + if (is_object($temp[$dir]) && is_object($value)) { if (!isset($value->stat) && isset($temp[$dir]->stat)) { $value->stat = $temp[$dir]->stat; } @@ -1110,9 +1323,10 @@ private function update_stat_cache($path, $value) $temp[$dir] = $value; break; } - $temp =& $temp[$dir]; + $temp = &$temp[$dir]; } } + /** * Remove files / directories from cache * @@ -1121,23 +1335,25 @@ private function update_stat_cache($path, $value) */ private function remove_from_stat_cache($path) { - $dirs = \explode('/', \preg_replace('#^/|/(?=/)|/$#', '', $path)); - $temp =& $this->stat_cache; - $max = \count($dirs) - 1; + $dirs = explode('/', preg_replace('#^/|/(?=/)|/$#', '', $path)); + + $temp = &$this->stat_cache; + $max = count($dirs) - 1; foreach ($dirs as $i => $dir) { - if (!\is_array($temp)) { - return \false; + if (!is_array($temp)) { + return false; } if ($i === $max) { unset($temp[$dir]); - return \true; + return true; } if (!isset($temp[$dir])) { - return \false; + return false; } - $temp =& $temp[$dir]; + $temp = &$temp[$dir]; } } + /** * Checks cache for path * @@ -1148,19 +1364,21 @@ private function remove_from_stat_cache($path) */ private function query_stat_cache($path) { - $dirs = \explode('/', \preg_replace('#^/|/(?=/)|/$#', '', $path)); - $temp =& $this->stat_cache; + $dirs = explode('/', preg_replace('#^/|/(?=/)|/$#', '', $path)); + + $temp = &$this->stat_cache; foreach ($dirs as $dir) { - if (!\is_array($temp)) { + if (!is_array($temp)) { return null; } if (!isset($temp[$dir])) { return null; } - $temp =& $temp[$dir]; + $temp = &$temp[$dir]; } return $temp; } + /** * Returns general information about a file. * @@ -1172,25 +1390,28 @@ private function query_stat_cache($path) public function stat($filename) { if (!$this->precheck()) { - return \false; + return false; } + $filename = $this->realpath($filename); - if ($filename === \false) { - return \false; + if ($filename === false) { + return false; } + if ($this->use_stat_cache) { $result = $this->query_stat_cache($filename); - if (\is_array($result) && isset($result['.']) && isset($result['.']->stat)) { + if (is_array($result) && isset($result['.']) && isset($result['.']->stat)) { return $result['.']->stat; } - if (\is_object($result) && isset($result->stat)) { + if (is_object($result) && isset($result->stat)) { return $result->stat; } } + $stat = $this->stat_helper($filename, NET_SFTP_STAT); - if ($stat === \false) { + if ($stat === false) { $this->remove_from_stat_cache($filename); - return \false; + return false; } if (isset($stat['type'])) { if ($stat['type'] == NET_SFTP_TYPE_DIRECTORY) { @@ -1199,15 +1420,21 @@ public function stat($filename) $this->update_stat_cache($filename, (object) ['stat' => $stat]); return $stat; } + $pwd = $this->pwd; - $stat['type'] = $this->chdir($filename) ? NET_SFTP_TYPE_DIRECTORY : NET_SFTP_TYPE_REGULAR; + $stat['type'] = $this->chdir($filename) ? + NET_SFTP_TYPE_DIRECTORY : + NET_SFTP_TYPE_REGULAR; $this->pwd = $pwd; + if ($stat['type'] == NET_SFTP_TYPE_DIRECTORY) { $filename .= '/.'; } $this->update_stat_cache($filename, (object) ['stat' => $stat]); + return $stat; } + /** * Returns general information about a file or symbolic link. * @@ -1219,25 +1446,28 @@ public function stat($filename) public function lstat($filename) { if (!$this->precheck()) { - return \false; + return false; } + $filename = $this->realpath($filename); - if ($filename === \false) { - return \false; + if ($filename === false) { + return false; } + if ($this->use_stat_cache) { $result = $this->query_stat_cache($filename); - if (\is_array($result) && isset($result['.']) && isset($result['.']->lstat)) { + if (is_array($result) && isset($result['.']) && isset($result['.']->lstat)) { return $result['.']->lstat; } - if (\is_object($result) && isset($result->lstat)) { + if (is_object($result) && isset($result->lstat)) { return $result->lstat; } } + $lstat = $this->stat_helper($filename, NET_SFTP_LSTAT); - if ($lstat === \false) { + if ($lstat === false) { $this->remove_from_stat_cache($filename); - return \false; + return false; } if (isset($lstat['type'])) { if ($lstat['type'] == NET_SFTP_TYPE_DIRECTORY) { @@ -1246,21 +1476,29 @@ public function lstat($filename) $this->update_stat_cache($filename, (object) ['lstat' => $lstat]); return $lstat; } + $stat = $this->stat_helper($filename, NET_SFTP_STAT); + if ($lstat != $stat) { - $lstat = \array_merge($lstat, ['type' => NET_SFTP_TYPE_SYMLINK]); + $lstat = array_merge($lstat, ['type' => NET_SFTP_TYPE_SYMLINK]); $this->update_stat_cache($filename, (object) ['lstat' => $lstat]); return $stat; } + $pwd = $this->pwd; - $lstat['type'] = $this->chdir($filename) ? NET_SFTP_TYPE_DIRECTORY : NET_SFTP_TYPE_REGULAR; + $lstat['type'] = $this->chdir($filename) ? + NET_SFTP_TYPE_DIRECTORY : + NET_SFTP_TYPE_REGULAR; $this->pwd = $pwd; + if ($lstat['type'] == NET_SFTP_TYPE_DIRECTORY) { $filename .= '/.'; } $this->update_stat_cache($filename, (object) ['lstat' => $lstat]); + return $lstat; } + /** * Returns general information about a file or symbolic link * @@ -1277,16 +1515,20 @@ private function stat_helper($filename, $type) // SFTPv4+ adds an additional 32-bit integer field - flags - to the following: $packet = Strings::packSSH2('s', $filename); $this->send_sftp_packet($type, $packet); + $response = $this->get_sftp_packet(); switch ($this->packet_type) { case NET_SFTP_ATTRS: return $this->parseAttributes($response); case NET_SFTP_STATUS: $this->logError($response); - return \false; + return false; } - throw new \UnexpectedValueException('Expected NET_SFTP_ATTRS or NET_SFTP_STATUS. ' . 'Got packet type: ' . $this->packet_type); + + throw new \UnexpectedValueException('Expected NET_SFTP_ATTRS or NET_SFTP_STATUS. ' + . 'Got packet type: ' . $this->packet_type); } + /** * Truncates a file to a given length * @@ -1297,8 +1539,10 @@ private function stat_helper($filename, $type) public function truncate($filename, $new_size) { $attr = Strings::packSSH2('NQ', NET_SFTP_ATTR_SIZE, $new_size); - return $this->setstat($filename, $attr, \false); + + return $this->setstat($filename, $attr, false); } + /** * Sets access and modification time of file. * @@ -1313,35 +1557,48 @@ public function truncate($filename, $new_size) public function touch($filename, $time = null, $atime = null) { if (!$this->precheck()) { - return \false; + return false; } + $filename = $this->realpath($filename); - if ($filename === \false) { - return \false; + if ($filename === false) { + return false; } + if (!isset($time)) { - $time = \time(); + $time = time(); } if (!isset($atime)) { $atime = $time; } - $attr = $this->version < 4 ? \pack('N3', NET_SFTP_ATTR_ACCESSTIME, $atime, $time) : Strings::packSSH2('NQ2', NET_SFTP_ATTR_ACCESSTIME | NET_SFTP_ATTR_MODIFYTIME, $atime, $time); + + $attr = $this->version < 4 ? + pack('N3', NET_SFTP_ATTR_ACCESSTIME, $atime, $time) : + Strings::packSSH2('NQ2', NET_SFTP_ATTR_ACCESSTIME | NET_SFTP_ATTR_MODIFYTIME, $atime, $time); + $packet = Strings::packSSH2('s', $filename); - $packet .= $this->version >= 5 ? \pack('N2', 0, NET_SFTP_OPEN_OPEN_EXISTING) : \pack('N', NET_SFTP_OPEN_WRITE | NET_SFTP_OPEN_CREATE | NET_SFTP_OPEN_EXCL); + $packet .= $this->version >= 5 ? + pack('N2', 0, NET_SFTP_OPEN_OPEN_EXISTING) : + pack('N', NET_SFTP_OPEN_WRITE | NET_SFTP_OPEN_CREATE | NET_SFTP_OPEN_EXCL); $packet .= $attr; + $this->send_sftp_packet(NET_SFTP_OPEN, $packet); + $response = $this->get_sftp_packet(); switch ($this->packet_type) { case NET_SFTP_HANDLE: - return $this->close_handle(\substr($response, 4)); + return $this->close_handle(substr($response, 4)); case NET_SFTP_STATUS: $this->logError($response); break; default: - throw new \UnexpectedValueException('Expected NET_SFTP_HANDLE or NET_SFTP_STATUS. ' . 'Got packet type: ' . $this->packet_type); + throw new \UnexpectedValueException('Expected NET_SFTP_HANDLE or NET_SFTP_STATUS. ' + . 'Got packet type: ' . $this->packet_type); } - return $this->setstat($filename, $attr, \false); + + return $this->setstat($filename, $attr, false); } + /** * Changes file or directory owner * @@ -1357,27 +1614,38 @@ public function touch($filename, $time = null, $atime = null) * @param bool $recursive * @return bool */ - public function chown($filename, $uid, $recursive = \false) + public function chown($filename, $uid, $recursive = false) { /* - quoting , - - "To avoid a representation that is tied to a particular underlying - implementation at the client or server, the use of UTF-8 strings has - been chosen. The string should be of the form "user@dns_domain". - This will allow for a client and server that do not use the same - local representation the ability to translate to a common syntax that - can be interpreted by both. In the case where there is no - translation available to the client or server, the attribute value - must be constructed without the "@"." - - phpseclib _could_ auto append the dns_domain to $uid BUT what if it shouldn't - have one? phpseclib would have no way of knowing so rather than guess phpseclib - will just use whatever value the user provided - */ - $attr = $this->version < 4 ? \pack('N3', NET_SFTP_ATTR_UIDGID, $uid, -1) : Strings::packSSH2('Nss', NET_SFTP_ATTR_OWNERGROUP, $uid, ''); + quoting , + + "To avoid a representation that is tied to a particular underlying + implementation at the client or server, the use of UTF-8 strings has + been chosen. The string should be of the form "user@dns_domain". + This will allow for a client and server that do not use the same + local representation the ability to translate to a common syntax that + can be interpreted by both. In the case where there is no + translation available to the client or server, the attribute value + must be constructed without the "@"." + + phpseclib _could_ auto append the dns_domain to $uid BUT what if it shouldn't + have one? phpseclib would have no way of knowing so rather than guess phpseclib + will just use whatever value the user provided + */ + + $attr = $this->version < 4 ? + // quoting , + // "if the owner or group is specified as -1, then that ID is not changed" + pack('N3', NET_SFTP_ATTR_UIDGID, $uid, -1) : + // quoting , + // "If either the owner or group field is zero length, the field should be + // considered absent, and no change should be made to that specific field + // during a modification operation" + Strings::packSSH2('Nss', NET_SFTP_ATTR_OWNERGROUP, $uid, ''); + return $this->setstat($filename, $attr, $recursive); } + /** * Changes file or directory group * @@ -1393,11 +1661,15 @@ public function chown($filename, $uid, $recursive = \false) * @param bool $recursive * @return bool */ - public function chgrp($filename, $gid, $recursive = \false) + public function chgrp($filename, $gid, $recursive = false) { - $attr = $this->version < 4 ? \pack('N3', NET_SFTP_ATTR_UIDGID, -1, $gid) : Strings::packSSH2('Nss', NET_SFTP_ATTR_OWNERGROUP, '', $gid); + $attr = $this->version < 4 ? + pack('N3', NET_SFTP_ATTR_UIDGID, -1, $gid) : + Strings::packSSH2('Nss', NET_SFTP_ATTR_OWNERGROUP, '', $gid); + return $this->setstat($filename, $attr, $recursive); } + /** * Set permissions on a file. * @@ -1410,26 +1682,29 @@ public function chgrp($filename, $gid, $recursive = \false) * @throws \UnexpectedValueException on receipt of unexpected packets * @return mixed */ - public function chmod($mode, $filename, $recursive = \false) + public function chmod($mode, $filename, $recursive = false) { - if (\is_string($mode) && \is_int($filename)) { + if (is_string($mode) && is_int($filename)) { $temp = $mode; $mode = $filename; $filename = $temp; } - $attr = \pack('N2', NET_SFTP_ATTR_PERMISSIONS, $mode & 07777); + + $attr = pack('N2', NET_SFTP_ATTR_PERMISSIONS, $mode & 07777); if (!$this->setstat($filename, $attr, $recursive)) { - return \false; + return false; } if ($recursive) { - return \true; + return true; } + $filename = $this->realpath($filename); // rather than return what the permissions *should* be, we'll return what they actually are. this will also // tell us if the file actually exists. // incidentally, SFTPv4+ adds an additional 32-bit integer field - flags - to the following: - $packet = \pack('Na*', \strlen($filename), $filename); + $packet = pack('Na*', strlen($filename), $filename); $this->send_sftp_packet(NET_SFTP_STAT, $packet); + $response = $this->get_sftp_packet(); switch ($this->packet_type) { case NET_SFTP_ATTRS: @@ -1437,10 +1712,13 @@ public function chmod($mode, $filename, $recursive = \false) return $attrs['mode']; case NET_SFTP_STATUS: $this->logError($response); - return \false; + return false; } - throw new \UnexpectedValueException('Expected NET_SFTP_ATTRS or NET_SFTP_STATUS. ' . 'Got packet type: ' . $this->packet_type); + + throw new \UnexpectedValueException('Expected NET_SFTP_ATTRS or NET_SFTP_STATUS. ' + . 'Got packet type: ' . $this->packet_type); } + /** * Sets information about a file * @@ -1453,40 +1731,51 @@ public function chmod($mode, $filename, $recursive = \false) private function setstat($filename, $attr, $recursive) { if (!$this->precheck()) { - return \false; + return false; } + $filename = $this->realpath($filename); - if ($filename === \false) { - return \false; + if ($filename === false) { + return false; } + $this->remove_from_stat_cache($filename); + if ($recursive) { $i = 0; $result = $this->setstat_recursive($filename, $attr, $i); $this->read_put_responses($i); return $result; } + $packet = Strings::packSSH2('s', $filename); - $packet .= $this->version >= 4 ? \pack('a*Ca*', \substr($attr, 0, 4), NET_SFTP_TYPE_UNKNOWN, \substr($attr, 4)) : $attr; + $packet .= $this->version >= 4 ? + pack('a*Ca*', substr($attr, 0, 4), NET_SFTP_TYPE_UNKNOWN, substr($attr, 4)) : + $attr; $this->send_sftp_packet(NET_SFTP_SETSTAT, $packet); + /* "Because some systems must use separate system calls to set various attributes, it is possible that a failure response will be returned, but yet some of the attributes may be have been successfully modified. If possible, servers SHOULD avoid this situation; however, clients MUST be aware that this is possible." - + -- http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.6 */ $response = $this->get_sftp_packet(); if ($this->packet_type != NET_SFTP_STATUS) { - throw new \UnexpectedValueException('Expected NET_SFTP_STATUS. ' . 'Got packet type: ' . $this->packet_type); + throw new \UnexpectedValueException('Expected NET_SFTP_STATUS. ' + . 'Got packet type: ' . $this->packet_type); } + list($status) = Strings::unpackSSH2('N', $response); if ($status != NET_SFTP_STATUS_OK) { $this->logError($response, $status); - return \false; + return false; } - return \true; + + return true; } + /** * Recursively sets information on directories on the SFTP server * @@ -1500,53 +1789,68 @@ private function setstat($filename, $attr, $recursive) private function setstat_recursive($path, $attr, &$i) { if (!$this->read_put_responses($i)) { - return \false; + return false; } $i = 0; - $entries = $this->readlist($path, \true); - if ($entries === \false || \is_int($entries)) { - return $this->setstat($path, $attr, \false); + $entries = $this->readlist($path, true); + + if ($entries === false || is_int($entries)) { + return $this->setstat($path, $attr, false); } + // normally $entries would have at least . and .. but it might not if the directories // permissions didn't allow reading if (empty($entries)) { - return \false; + return false; } + unset($entries['.'], $entries['..']); foreach ($entries as $filename => $props) { if (!isset($props['type'])) { - return \false; + return false; } + $temp = $path . '/' . $filename; if ($props['type'] == NET_SFTP_TYPE_DIRECTORY) { if (!$this->setstat_recursive($temp, $attr, $i)) { - return \false; + return false; } } else { $packet = Strings::packSSH2('s', $temp); - $packet .= $this->version >= 4 ? \pack('Ca*', NET_SFTP_TYPE_UNKNOWN, $attr) : $attr; + $packet .= $this->version >= 4 ? + pack('Ca*', NET_SFTP_TYPE_UNKNOWN, $attr) : + $attr; $this->send_sftp_packet(NET_SFTP_SETSTAT, $packet); + $i++; + if ($i >= NET_SFTP_QUEUE_SIZE) { if (!$this->read_put_responses($i)) { - return \false; + return false; } $i = 0; } } } + $packet = Strings::packSSH2('s', $path); - $packet .= $this->version >= 4 ? \pack('Ca*', NET_SFTP_TYPE_UNKNOWN, $attr) : $attr; + $packet .= $this->version >= 4 ? + pack('Ca*', NET_SFTP_TYPE_UNKNOWN, $attr) : + $attr; $this->send_sftp_packet(NET_SFTP_SETSTAT, $packet); + $i++; + if ($i >= NET_SFTP_QUEUE_SIZE) { if (!$this->read_put_responses($i)) { - return \false; + return false; } $i = 0; } - return \true; + + return true; } + /** * Return the target of a symbolic link * @@ -1557,28 +1861,36 @@ private function setstat_recursive($path, $attr, &$i) public function readlink($link) { if (!$this->precheck()) { - return \false; + return false; } + $link = $this->realpath($link); + $this->send_sftp_packet(NET_SFTP_READLINK, Strings::packSSH2('s', $link)); + $response = $this->get_sftp_packet(); switch ($this->packet_type) { case NET_SFTP_NAME: break; case NET_SFTP_STATUS: $this->logError($response); - return \false; + return false; default: - throw new \UnexpectedValueException('Expected NET_SFTP_NAME or NET_SFTP_STATUS. ' . 'Got packet type: ' . $this->packet_type); + throw new \UnexpectedValueException('Expected NET_SFTP_NAME or NET_SFTP_STATUS. ' + . 'Got packet type: ' . $this->packet_type); } + list($count) = Strings::unpackSSH2('N', $response); // the file isn't a symlink if (!$count) { - return \false; + return false; } + list($filename) = Strings::unpackSSH2('s', $response); + return $filename; } + /** * Create a symlink * @@ -1592,50 +1904,59 @@ public function readlink($link) public function symlink($target, $link) { if (!$this->precheck()) { - return \false; + return false; } + //$target = $this->realpath($target); $link = $this->realpath($link); + /* quoting https://datatracker.ietf.org/doc/html/draft-ietf-secsh-filexfer-09#section-12.1 : - - Changed the SYMLINK packet to be LINK and give it the ability to - create hard links. Also change it's packet number because many - implementation implemented SYMLINK with the arguments reversed. - Hopefully the new argument names make it clear which way is which. - */ + + Changed the SYMLINK packet to be LINK and give it the ability to + create hard links. Also change it's packet number because many + implementation implemented SYMLINK with the arguments reversed. + Hopefully the new argument names make it clear which way is which. + */ if ($this->version == 6) { $type = NET_SFTP_LINK; $packet = Strings::packSSH2('ssC', $link, $target, 1); } else { $type = NET_SFTP_SYMLINK; /* quoting http://bxr.su/OpenBSD/usr.bin/ssh/PROTOCOL#347 : - - 3.1. sftp: Reversal of arguments to SSH_FXP_SYMLINK - - When OpenSSH's sftp-server was implemented, the order of the arguments - to the SSH_FXP_SYMLINK method was inadvertently reversed. Unfortunately, - the reversal was not noticed until the server was widely deployed. Since - fixing this to follow the specification would cause incompatibility, the - current order was retained. For correct operation, clients should send - SSH_FXP_SYMLINK as follows: - - uint32 id - string targetpath - string linkpath */ - $packet = \substr($this->server_identifier, 0, 15) == 'SSH-2.0-OpenSSH' ? Strings::packSSH2('ss', $target, $link) : Strings::packSSH2('ss', $link, $target); + + 3.1. sftp: Reversal of arguments to SSH_FXP_SYMLINK + + When OpenSSH's sftp-server was implemented, the order of the arguments + to the SSH_FXP_SYMLINK method was inadvertently reversed. Unfortunately, + the reversal was not noticed until the server was widely deployed. Since + fixing this to follow the specification would cause incompatibility, the + current order was retained. For correct operation, clients should send + SSH_FXP_SYMLINK as follows: + + uint32 id + string targetpath + string linkpath */ + $packet = substr($this->server_identifier, 0, 15) == 'SSH-2.0-OpenSSH' ? + Strings::packSSH2('ss', $target, $link) : + Strings::packSSH2('ss', $link, $target); } $this->send_sftp_packet($type, $packet); + $response = $this->get_sftp_packet(); if ($this->packet_type != NET_SFTP_STATUS) { - throw new \UnexpectedValueException('Expected NET_SFTP_STATUS. ' . 'Got packet type: ' . $this->packet_type); + throw new \UnexpectedValueException('Expected NET_SFTP_STATUS. ' + . 'Got packet type: ' . $this->packet_type); } + list($status) = Strings::unpackSSH2('N', $response); if ($status != NET_SFTP_STATUS_OK) { $this->logError($response, $status); - return \false; + return false; } - return \true; + + return true; } + /** * Creates a directory. * @@ -1644,27 +1965,31 @@ public function symlink($target, $link) * @param bool $recursive * @return bool */ - public function mkdir($dir, $mode = -1, $recursive = \false) + public function mkdir($dir, $mode = -1, $recursive = false) { if (!$this->precheck()) { - return \false; + return false; } + $dir = $this->realpath($dir); + if ($recursive) { - $dirs = \explode('/', \preg_replace('#/(?=/)|/$#', '', $dir)); + $dirs = explode('/', preg_replace('#/(?=/)|/$#', '', $dir)); if (empty($dirs[0])) { - \array_shift($dirs); + array_shift($dirs); $dirs[0] = '/' . $dirs[0]; } - for ($i = 0; $i < \count($dirs); $i++) { - $temp = \array_slice($dirs, 0, $i + 1); - $temp = \implode('/', $temp); + for ($i = 0; $i < count($dirs); $i++) { + $temp = array_slice($dirs, 0, $i + 1); + $temp = implode('/', $temp); $result = $this->mkdir_helper($temp, $mode); } return $result; } + return $this->mkdir_helper($dir, $mode); } + /** * Helper function for directory creation * @@ -1675,21 +2000,27 @@ public function mkdir($dir, $mode = -1, $recursive = \false) private function mkdir_helper($dir, $mode) { // send SSH_FXP_MKDIR without any attributes (that's what the \0\0\0\0 is doing) - $this->send_sftp_packet(NET_SFTP_MKDIR, Strings::packSSH2('s', $dir) . "\x00\x00\x00\x00"); + $this->send_sftp_packet(NET_SFTP_MKDIR, Strings::packSSH2('s', $dir) . "\0\0\0\0"); + $response = $this->get_sftp_packet(); if ($this->packet_type != NET_SFTP_STATUS) { - throw new \UnexpectedValueException('Expected NET_SFTP_STATUS. ' . 'Got packet type: ' . $this->packet_type); + throw new \UnexpectedValueException('Expected NET_SFTP_STATUS. ' + . 'Got packet type: ' . $this->packet_type); } + list($status) = Strings::unpackSSH2('N', $response); if ($status != NET_SFTP_STATUS_OK) { $this->logError($response, $status); - return \false; + return false; } + if ($mode !== -1) { $this->chmod($mode, $dir); } - return \true; + + return true; } + /** * Removes a directory. * @@ -1700,30 +2031,38 @@ private function mkdir_helper($dir, $mode) public function rmdir($dir) { if (!$this->precheck()) { - return \false; + return false; } + $dir = $this->realpath($dir); - if ($dir === \false) { - return \false; + if ($dir === false) { + return false; } + $this->send_sftp_packet(NET_SFTP_RMDIR, Strings::packSSH2('s', $dir)); + $response = $this->get_sftp_packet(); if ($this->packet_type != NET_SFTP_STATUS) { - throw new \UnexpectedValueException('Expected NET_SFTP_STATUS. ' . 'Got packet type: ' . $this->packet_type); + throw new \UnexpectedValueException('Expected NET_SFTP_STATUS. ' + . 'Got packet type: ' . $this->packet_type); } + list($status) = Strings::unpackSSH2('N', $response); if ($status != NET_SFTP_STATUS_OK) { // presumably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED? $this->logError($response, $status); - return \false; + return false; } + $this->remove_from_stat_cache($dir); // the following will do a soft delete, which would be useful if you deleted a file // and then tried to do a stat on the deleted file. the above, in contrast, does // a hard delete //$this->update_stat_cache($dir, false); - return \true; + + return true; } + /** * Uploads a file to the SFTP server. * @@ -1776,13 +2115,16 @@ public function rmdir($dir) public function put($remote_file, $data, $mode = self::SOURCE_STRING, $start = -1, $local_start = -1, $progressCallback = null) { if (!$this->precheck()) { - return \false; + return false; } + $remote_file = $this->realpath($remote_file); - if ($remote_file === \false) { - return \false; + if ($remote_file === false) { + return false; } + $this->remove_from_stat_cache($remote_file); + if ($this->version >= 5) { $flags = NET_SFTP_OPEN_OPEN_OR_CREATE; } else { @@ -1791,12 +2133,13 @@ public function put($remote_file, $data, $mode = self::SOURCE_STRING, $start = - // in practice, it doesn't seem to do that. //$flags|= ($mode & self::RESUME) ? NET_SFTP_OPEN_APPEND : NET_SFTP_OPEN_TRUNCATE; } + if ($start >= 0) { $offset = $start; } elseif ($mode & (self::RESUME | self::RESUME_START)) { // if NET_SFTP_OPEN_APPEND worked as it should _size() wouldn't need to be called $stat = $this->stat($remote_file); - $offset = $stat !== \false && $stat['size'] ? $stat['size'] : 0; + $offset = $stat !== false && $stat['size'] ? $stat['size'] : 0; } else { $offset = 0; if ($this->version >= 5) { @@ -1805,98 +2148,111 @@ public function put($remote_file, $data, $mode = self::SOURCE_STRING, $start = - $flags |= NET_SFTP_OPEN_TRUNCATE; } } + $this->remove_from_stat_cache($remote_file); + $packet = Strings::packSSH2('s', $remote_file); - $packet .= $this->version >= 5 ? \pack('N3', 0, $flags, 0) : \pack('N2', $flags, 0); + $packet .= $this->version >= 5 ? + pack('N3', 0, $flags, 0) : + pack('N2', $flags, 0); $this->send_sftp_packet(NET_SFTP_OPEN, $packet); + $response = $this->get_sftp_packet(); switch ($this->packet_type) { case NET_SFTP_HANDLE: - $handle = \substr($response, 4); + $handle = substr($response, 4); break; case NET_SFTP_STATUS: $this->logError($response); - return \false; + return false; default: - throw new \UnexpectedValueException('Expected NET_SFTP_HANDLE or NET_SFTP_STATUS. ' . 'Got packet type: ' . $this->packet_type); + throw new \UnexpectedValueException('Expected NET_SFTP_HANDLE or NET_SFTP_STATUS. ' + . 'Got packet type: ' . $this->packet_type); } + // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.2.3 - $dataCallback = \false; - switch (\true) { + $dataCallback = false; + switch (true) { case $mode & self::SOURCE_CALLBACK: - if (!\is_callable($data)) { + if (!is_callable($data)) { throw new \BadFunctionCallException("\$data should be is_callable() if you specify SOURCE_CALLBACK flag"); } $dataCallback = $data; // do nothing break; - case \is_resource($data): + case is_resource($data): $mode = $mode & ~self::SOURCE_LOCAL_FILE; - $info = \stream_get_meta_data($data); + $info = stream_get_meta_data($data); if (isset($info['wrapper_type']) && $info['wrapper_type'] == 'PHP' && $info['stream_type'] == 'Input') { - $fp = \fopen('php://memory', 'w+'); - \stream_copy_to_stream($data, $fp); - \rewind($fp); + $fp = fopen('php://memory', 'w+'); + stream_copy_to_stream($data, $fp); + rewind($fp); } else { $fp = $data; } break; case $mode & self::SOURCE_LOCAL_FILE: - if (!\is_file($data)) { - throw new FileNotFoundException("{$data} is not a valid file"); + if (!is_file($data)) { + throw new FileNotFoundException("$data is not a valid file"); } - $fp = @\fopen($data, 'rb'); + $fp = @fopen($data, 'rb'); if (!$fp) { - return \false; + return false; } } + if (isset($fp)) { - $stat = \fstat($fp); + $stat = fstat($fp); $size = !empty($stat) ? $stat['size'] : 0; + if ($local_start >= 0) { - \fseek($fp, $local_start); + fseek($fp, $local_start); $size -= $local_start; } elseif ($mode & self::RESUME) { - \fseek($fp, $offset); + fseek($fp, $offset); $size -= $offset; } } elseif ($dataCallback) { $size = 0; } else { - $size = \strlen($data); + $size = strlen($data); } + $sent = 0; - $size = $size < 0 ? ($size & 0x7fffffff) + 0x80000000 : $size; + $size = $size < 0 ? ($size & 0x7FFFFFFF) + 0x80000000 : $size; + $sftp_packet_size = $this->max_sftp_packet; // make the SFTP packet be exactly the SFTP packet size by including the bytes in the NET_SFTP_WRITE packets "header" - $sftp_packet_size -= \strlen($handle) + 25; + $sftp_packet_size -= strlen($handle) + 25; $i = $j = 0; while ($dataCallback || ($size === 0 || $sent < $size)) { if ($dataCallback) { $temp = $dataCallback($sftp_packet_size); - if (\is_null($temp)) { + if (is_null($temp)) { break; } } else { - $temp = isset($fp) ? \fread($fp, $sftp_packet_size) : \substr($data, $sent, $sftp_packet_size); - if ($temp === \false || $temp === '') { + $temp = isset($fp) ? fread($fp, $sftp_packet_size) : substr($data, $sent, $sftp_packet_size); + if ($temp === false || $temp === '') { break; } } + $subtemp = $offset + $sent; - $packet = \pack('Na*N3a*', \strlen($handle), $handle, $subtemp / 4294967296, $subtemp, \strlen($temp), $temp); + $packet = pack('Na*N3a*', strlen($handle), $handle, $subtemp / 4294967296, $subtemp, strlen($temp), $temp); try { $this->send_sftp_packet(NET_SFTP_WRITE, $packet, $j); } catch (\Exception $e) { if ($mode & self::SOURCE_LOCAL_FILE) { - \fclose($fp); + fclose($fp); } throw $e; } - $sent += \strlen($temp); - if (\is_callable($progressCallback)) { + $sent += strlen($temp); + if (is_callable($progressCallback)) { $progressCallback($sent); } + $i++; $j++; if ($i == NET_SFTP_UPLOAD_QUEUE_SIZE) { @@ -1907,28 +2263,36 @@ public function put($remote_file, $data, $mode = self::SOURCE_STRING, $start = - $i = 0; } } + $result = $this->close_handle($handle); + if (!$this->read_put_responses($i)) { if ($mode & self::SOURCE_LOCAL_FILE) { - \fclose($fp); + fclose($fp); } $this->close_handle($handle); - return \false; + return false; } + if ($mode & SFTP::SOURCE_LOCAL_FILE) { - if (isset($fp) && \is_resource($fp)) { - \fclose($fp); + if (isset($fp) && is_resource($fp)) { + fclose($fp); } + if ($this->preserveTime) { - $stat = \stat($data); - $attr = $this->version < 4 ? \pack('N3', NET_SFTP_ATTR_ACCESSTIME, $stat['atime'], $stat['mtime']) : Strings::packSSH2('NQ2', NET_SFTP_ATTR_ACCESSTIME | NET_SFTP_ATTR_MODIFYTIME, $stat['atime'], $stat['mtime']); - if (!$this->setstat($remote_file, $attr, \false)) { + $stat = stat($data); + $attr = $this->version < 4 ? + pack('N3', NET_SFTP_ATTR_ACCESSTIME, $stat['atime'], $stat['mtime']) : + Strings::packSSH2('NQ2', NET_SFTP_ATTR_ACCESSTIME | NET_SFTP_ATTR_MODIFYTIME, $stat['atime'], $stat['mtime']); + if (!$this->setstat($remote_file, $attr, false)) { throw new \RuntimeException('Error setting file time'); } } } + return $result; } + /** * Reads multiple successive SSH_FXP_WRITE responses * @@ -1944,16 +2308,20 @@ private function read_put_responses($i) while ($i--) { $response = $this->get_sftp_packet(); if ($this->packet_type != NET_SFTP_STATUS) { - throw new \UnexpectedValueException('Expected NET_SFTP_STATUS. ' . 'Got packet type: ' . $this->packet_type); + throw new \UnexpectedValueException('Expected NET_SFTP_STATUS. ' + . 'Got packet type: ' . $this->packet_type); } + list($status) = Strings::unpackSSH2('N', $response); if ($status != NET_SFTP_STATUS_OK) { $this->logError($response, $status); break; } } + return $i < 0; } + /** * Close handle * @@ -1963,20 +2331,25 @@ private function read_put_responses($i) */ private function close_handle($handle) { - $this->send_sftp_packet(NET_SFTP_CLOSE, \pack('Na*', \strlen($handle), $handle)); + $this->send_sftp_packet(NET_SFTP_CLOSE, pack('Na*', strlen($handle), $handle)); + // "The client MUST release all resources associated with the handle regardless of the status." // -- http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.1.3 $response = $this->get_sftp_packet(); if ($this->packet_type != NET_SFTP_STATUS) { - throw new \UnexpectedValueException('Expected NET_SFTP_STATUS. ' . 'Got packet type: ' . $this->packet_type); + throw new \UnexpectedValueException('Expected NET_SFTP_STATUS. ' + . 'Got packet type: ' . $this->packet_type); } + list($status) = Strings::unpackSSH2('N', $response); if ($status != NET_SFTP_STATUS_OK) { $this->logError($response, $status); - return \false; + return false; } - return \true; + + return true; } + /** * Downloads a file from the SFTP server. * @@ -1994,59 +2367,70 @@ private function close_handle($handle) * @throws \UnexpectedValueException on receipt of unexpected packets * @return string|bool */ - public function get($remote_file, $local_file = \false, $offset = 0, $length = -1, $progressCallback = null) + public function get($remote_file, $local_file = false, $offset = 0, $length = -1, $progressCallback = null) { if (!$this->precheck()) { - return \false; + return false; } + $remote_file = $this->realpath($remote_file); - if ($remote_file === \false) { - return \false; + if ($remote_file === false) { + return false; } + $packet = Strings::packSSH2('s', $remote_file); - $packet .= $this->version >= 5 ? \pack('N3', 0, NET_SFTP_OPEN_OPEN_EXISTING, 0) : \pack('N2', NET_SFTP_OPEN_READ, 0); + $packet .= $this->version >= 5 ? + pack('N3', 0, NET_SFTP_OPEN_OPEN_EXISTING, 0) : + pack('N2', NET_SFTP_OPEN_READ, 0); $this->send_sftp_packet(NET_SFTP_OPEN, $packet); + $response = $this->get_sftp_packet(); switch ($this->packet_type) { case NET_SFTP_HANDLE: - $handle = \substr($response, 4); + $handle = substr($response, 4); break; - case NET_SFTP_STATUS: - // presumably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED + case NET_SFTP_STATUS: // presumably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED $this->logError($response); - return \false; + return false; default: - throw new \UnexpectedValueException('Expected NET_SFTP_HANDLE or NET_SFTP_STATUS. ' . 'Got packet type: ' . $this->packet_type); + throw new \UnexpectedValueException('Expected NET_SFTP_HANDLE or NET_SFTP_STATUS. ' + . 'Got packet type: ' . $this->packet_type); } - if (\is_resource($local_file)) { + + if (is_resource($local_file)) { $fp = $local_file; - $stat = \fstat($fp); + $stat = fstat($fp); $res_offset = $stat['size']; } else { $res_offset = 0; - if ($local_file !== \false && !\is_callable($local_file)) { - $fp = \fopen($local_file, 'wb'); + if ($local_file !== false && !is_callable($local_file)) { + $fp = fopen($local_file, 'wb'); if (!$fp) { - return \false; + return false; } } else { $content = ''; } } - $fclose_check = $local_file !== \false && !\is_callable($local_file) && !\is_resource($local_file); + + $fclose_check = $local_file !== false && !is_callable($local_file) && !is_resource($local_file); + $start = $offset; $read = 0; - while (\true) { + while (true) { $i = 0; + while ($i < NET_SFTP_QUEUE_SIZE && ($length < 0 || $read < $length)) { $tempoffset = $start + $read; - $packet_size = $length > 0 ? \min($this->max_sftp_packet, $length - $read) : $this->max_sftp_packet; + + $packet_size = $length > 0 ? min($this->max_sftp_packet, $length - $read) : $this->max_sftp_packet; + $packet = Strings::packSSH2('sN3', $handle, $tempoffset / 4294967296, $tempoffset, $packet_size); try { $this->send_sftp_packet(NET_SFTP_READ, $packet, $i); } catch (\Exception $e) { if ($fclose_check) { - \fclose($fp); + fclose($fp); } throw $e; } @@ -2054,72 +2438,83 @@ public function get($remote_file, $local_file = \false, $offset = 0, $length = - $read += $packet_size; $i++; } + if (!$i) { break; } + $packets_sent = $i - 1; - $clear_responses = \false; + + $clear_responses = false; while ($i > 0) { $i--; + if ($clear_responses) { $this->get_sftp_packet($packets_sent - $i); continue; } else { $response = $this->get_sftp_packet($packets_sent - $i); } + switch ($this->packet_type) { case NET_SFTP_DATA: - $temp = \substr($response, 4); - $offset += \strlen($temp); - if ($local_file === \false) { + $temp = substr($response, 4); + $offset += strlen($temp); + if ($local_file === false) { $content .= $temp; - } elseif (\is_callable($local_file)) { + } elseif (is_callable($local_file)) { $local_file($temp); } else { - \fputs($fp, $temp); + fputs($fp, $temp); } - if (\is_callable($progressCallback)) { - \call_user_func($progressCallback, $offset); + if (is_callable($progressCallback)) { + call_user_func($progressCallback, $offset); } $temp = null; break; case NET_SFTP_STATUS: // could, in theory, return false if !strlen($content) but we'll hold off for the time being $this->logError($response); - $clear_responses = \true; - // don't break out of the loop yet, so we can read the remaining responses + $clear_responses = true; // don't break out of the loop yet, so we can read the remaining responses break; default: if ($fclose_check) { - \fclose($fp); + fclose($fp); } if ($this->channel_close) { - $this->partial_init = \false; + $this->partial_init = false; $this->init_sftp_connection(); - return \false; + return false; } else { - throw new \UnexpectedValueException('Expected NET_SFTP_DATA or NET_SFTP_STATUS. ' . 'Got packet type: ' . $this->packet_type); + throw new \UnexpectedValueException('Expected NET_SFTP_DATA or NET_SFTP_STATUS. ' + . 'Got packet type: ' . $this->packet_type); } } $response = null; } + if ($clear_responses) { break; } } + if ($fclose_check) { - \fclose($fp); + fclose($fp); + if ($this->preserveTime) { $stat = $this->stat($remote_file); - \touch($local_file, $stat['mtime'], $stat['atime']); + touch($local_file, $stat['mtime'], $stat['atime']); } } + if (!$this->close_handle($handle)) { - return \false; + return false; } + // if $content isn't set that means a file was written to - return isset($content) ? $content : \true; + return isset($content) ? $content : true; } + /** * Deletes a file on the SFTP server. * @@ -2128,43 +2523,54 @@ public function get($remote_file, $local_file = \false, $offset = 0, $length = - * @return bool * @throws \UnexpectedValueException on receipt of unexpected packets */ - public function delete($path, $recursive = \true) + public function delete($path, $recursive = true) { if (!$this->precheck()) { - return \false; + return false; } - if (\is_object($path)) { + + if (is_object($path)) { // It's an object. Cast it as string before we check anything else. $path = (string) $path; } - if (!\is_string($path) || $path == '') { - return \false; + + if (!is_string($path) || $path == '') { + return false; } + $path = $this->realpath($path); - if ($path === \false) { - return \false; + if ($path === false) { + return false; } + // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.3 - $this->send_sftp_packet(NET_SFTP_REMOVE, \pack('Na*', \strlen($path), $path)); + $this->send_sftp_packet(NET_SFTP_REMOVE, pack('Na*', strlen($path), $path)); + $response = $this->get_sftp_packet(); if ($this->packet_type != NET_SFTP_STATUS) { - throw new \UnexpectedValueException('Expected NET_SFTP_STATUS. ' . 'Got packet type: ' . $this->packet_type); + throw new \UnexpectedValueException('Expected NET_SFTP_STATUS. ' + . 'Got packet type: ' . $this->packet_type); } + // if $status isn't SSH_FX_OK it's probably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED list($status) = Strings::unpackSSH2('N', $response); if ($status != NET_SFTP_STATUS_OK) { $this->logError($response, $status); if (!$recursive) { - return \false; + return false; } + $i = 0; $result = $this->delete_recursive($path, $i); $this->read_put_responses($i); return $result; } + $this->remove_from_stat_cache($path); - return \true; + + return true; } + /** * Recursively deletes directories on the SFTP server * @@ -2177,52 +2583,63 @@ public function delete($path, $recursive = \true) private function delete_recursive($path, &$i) { if (!$this->read_put_responses($i)) { - return \false; + return false; } $i = 0; - $entries = $this->readlist($path, \true); + $entries = $this->readlist($path, true); + // The folder does not exist at all, so we cannot delete it. if ($entries === NET_SFTP_STATUS_NO_SUCH_FILE) { - return \false; + return false; } + // Normally $entries would have at least . and .. but it might not if the directories // permissions didn't allow reading. If this happens then default to an empty list of files. - if ($entries === \false || \is_int($entries)) { + if ($entries === false || is_int($entries)) { $entries = []; } + unset($entries['.'], $entries['..']); foreach ($entries as $filename => $props) { if (!isset($props['type'])) { - return \false; + return false; } + $temp = $path . '/' . $filename; if ($props['type'] == NET_SFTP_TYPE_DIRECTORY) { if (!$this->delete_recursive($temp, $i)) { - return \false; + return false; } } else { $this->send_sftp_packet(NET_SFTP_REMOVE, Strings::packSSH2('s', $temp)); $this->remove_from_stat_cache($temp); + $i++; + if ($i >= NET_SFTP_QUEUE_SIZE) { if (!$this->read_put_responses($i)) { - return \false; + return false; } $i = 0; } } } + $this->send_sftp_packet(NET_SFTP_RMDIR, Strings::packSSH2('s', $path)); $this->remove_from_stat_cache($path); + $i++; + if ($i >= NET_SFTP_QUEUE_SIZE) { if (!$this->read_put_responses($i)) { - return \false; + return false; } $i = 0; } - return \true; + + return true; } + /** * Checks whether a file or directory exists * @@ -2233,17 +2650,22 @@ public function file_exists($path) { if ($this->use_stat_cache) { if (!$this->precheck()) { - return \false; + return false; } + $path = $this->realpath($path); + $result = $this->query_stat_cache($path); + if (isset($result)) { // return true if $result is an array or if it's an stdClass object - return $result !== \false; + return $result !== false; } } - return $this->stat($path) !== \false; + + return $this->stat($path) !== false; } + /** * Tells whether the filename is a directory * @@ -2253,11 +2675,12 @@ public function file_exists($path) public function is_dir($path) { $result = $this->get_stat_cache_prop($path, 'type'); - if ($result === \false) { - return \false; + if ($result === false) { + return false; } return $result === NET_SFTP_TYPE_DIRECTORY; } + /** * Tells whether the filename is a regular file * @@ -2267,11 +2690,12 @@ public function is_dir($path) public function is_file($path) { $result = $this->get_stat_cache_prop($path, 'type'); - if ($result === \false) { - return \false; + if ($result === false) { + return false; } return $result === NET_SFTP_TYPE_REGULAR; } + /** * Tells whether the filename is a symbolic link * @@ -2281,11 +2705,12 @@ public function is_file($path) public function is_link($path) { $result = $this->get_lstat_cache_prop($path, 'type'); - if ($result === \false) { - return \false; + if ($result === false) { + return false; } return $result === NET_SFTP_TYPE_SYMLINK; } + /** * Tells whether a file exists and is readable * @@ -2295,21 +2720,24 @@ public function is_link($path) public function is_readable($path) { if (!$this->precheck()) { - return \false; + return false; } + $packet = Strings::packSSH2('sNN', $this->realpath($path), NET_SFTP_OPEN_READ, 0); $this->send_sftp_packet(NET_SFTP_OPEN, $packet); + $response = $this->get_sftp_packet(); switch ($this->packet_type) { case NET_SFTP_HANDLE: - return \true; - case NET_SFTP_STATUS: - // presumably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED - return \false; + return true; + case NET_SFTP_STATUS: // presumably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED + return false; default: - throw new \UnexpectedValueException('Expected NET_SFTP_HANDLE or NET_SFTP_STATUS. ' . 'Got packet type: ' . $this->packet_type); + throw new \UnexpectedValueException('Expected NET_SFTP_HANDLE or NET_SFTP_STATUS. ' + . 'Got packet type: ' . $this->packet_type); } } + /** * Tells whether the filename is writable * @@ -2319,21 +2747,24 @@ public function is_readable($path) public function is_writable($path) { if (!$this->precheck()) { - return \false; + return false; } + $packet = Strings::packSSH2('sNN', $this->realpath($path), NET_SFTP_OPEN_WRITE, 0); $this->send_sftp_packet(NET_SFTP_OPEN, $packet); + $response = $this->get_sftp_packet(); switch ($this->packet_type) { case NET_SFTP_HANDLE: - return \true; - case NET_SFTP_STATUS: - // presumably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED - return \false; + return true; + case NET_SFTP_STATUS: // presumably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED + return false; default: - throw new \UnexpectedValueException('Expected SSH_FXP_HANDLE or SSH_FXP_STATUS. ' . 'Got packet type: ' . $this->packet_type); + throw new \UnexpectedValueException('Expected SSH_FXP_HANDLE or SSH_FXP_STATUS. ' + . 'Got packet type: ' . $this->packet_type); } } + /** * Tells whether the filename is writeable * @@ -2346,6 +2777,7 @@ public function is_writeable($path) { return $this->is_writable($path); } + /** * Gets last access time of file * @@ -2356,6 +2788,7 @@ public function fileatime($path) { return $this->get_stat_cache_prop($path, 'atime'); } + /** * Gets file modification time * @@ -2366,6 +2799,7 @@ public function filemtime($path) { return $this->get_stat_cache_prop($path, 'mtime'); } + /** * Gets file permissions * @@ -2376,6 +2810,7 @@ public function fileperms($path) { return $this->get_stat_cache_prop($path, 'mode'); } + /** * Gets file owner * @@ -2386,6 +2821,7 @@ public function fileowner($path) { return $this->get_stat_cache_prop($path, 'uid'); } + /** * Gets file group * @@ -2396,6 +2832,7 @@ public function filegroup($path) { return $this->get_stat_cache_prop($path, 'gid'); } + /** * Recursively go through rawlist() output to get the total filesize * @@ -2408,10 +2845,13 @@ private static function recursiveFilesize(array $files) if ($name == '.' || $name == '..') { continue; } - $size += \is_array($file) ? self::recursiveFilesize($file) : $file->size; + $size += is_array($file) ? + self::recursiveFilesize($file) : + $file->size; } return $size; } + /** * Gets file size * @@ -2419,10 +2859,13 @@ private static function recursiveFilesize(array $files) * @param bool $recursive * @return mixed */ - public function filesize($path, $recursive = \false) + public function filesize($path, $recursive = false) { - return !$recursive || $this->filetype($path) != 'dir' ? $this->get_stat_cache_prop($path, 'size') : self::recursiveFilesize($this->rawlist($path, \true)); + return !$recursive || $this->filetype($path) != 'dir' ? + $this->get_stat_cache_prop($path, 'size') : + self::recursiveFilesize($this->rawlist($path, true)); } + /** * Gets file type * @@ -2432,9 +2875,10 @@ public function filesize($path, $recursive = \false) public function filetype($path) { $type = $this->get_stat_cache_prop($path, 'type'); - if ($type === \false) { - return \false; + if ($type === false) { + return false; } + switch ($type) { case NET_SFTP_TYPE_BLOCK_DEVICE: return 'block'; @@ -2449,9 +2893,10 @@ public function filetype($path) case NET_SFTP_TYPE_SYMLINK: return 'link'; default: - return \false; + return false; } } + /** * Return a stat properity * @@ -2465,6 +2910,7 @@ private function get_stat_cache_prop($path, $prop) { return $this->get_xstat_cache_prop($path, $prop, 'stat'); } + /** * Return an lstat properity * @@ -2478,6 +2924,7 @@ private function get_lstat_cache_prop($path, $prop) { return $this->get_xstat_cache_prop($path, $prop, 'lstat'); } + /** * Return a stat or lstat properity * @@ -2491,21 +2938,28 @@ private function get_lstat_cache_prop($path, $prop) private function get_xstat_cache_prop($path, $prop, $type) { if (!$this->precheck()) { - return \false; + return false; } + if ($this->use_stat_cache) { $path = $this->realpath($path); + $result = $this->query_stat_cache($path); - if (\is_object($result) && isset($result->{$type})) { + + if (is_object($result) && isset($result->$type)) { return $result->{$type}[$prop]; } } - $result = $this->{$type}($path); - if ($result === \false || !isset($result[$prop])) { - return \false; + + $result = $this->$type($path); + + if ($result === false || !isset($result[$prop])) { + return false; } + return $result[$prop]; } + /** * Renames a file or a directory on the SFTP server. * @@ -2519,45 +2973,53 @@ private function get_xstat_cache_prop($path, $prop, $type) public function rename($oldname, $newname) { if (!$this->precheck()) { - return \false; + return false; } + $oldname = $this->realpath($oldname); $newname = $this->realpath($newname); - if ($oldname === \false || $newname === \false) { - return \false; + if ($oldname === false || $newname === false) { + return false; } + // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.3 $packet = Strings::packSSH2('ss', $oldname, $newname); if ($this->version >= 5) { /* quoting https://datatracker.ietf.org/doc/html/draft-ietf-secsh-filexfer-05#section-6.5 , - - 'flags' is 0 or a combination of: - - SSH_FXP_RENAME_OVERWRITE 0x00000001 - SSH_FXP_RENAME_ATOMIC 0x00000002 - SSH_FXP_RENAME_NATIVE 0x00000004 - - (none of these are currently supported) */ - $packet .= "\x00\x00\x00\x00"; + + 'flags' is 0 or a combination of: + + SSH_FXP_RENAME_OVERWRITE 0x00000001 + SSH_FXP_RENAME_ATOMIC 0x00000002 + SSH_FXP_RENAME_NATIVE 0x00000004 + + (none of these are currently supported) */ + $packet .= "\0\0\0\0"; } $this->send_sftp_packet(NET_SFTP_RENAME, $packet); + $response = $this->get_sftp_packet(); if ($this->packet_type != NET_SFTP_STATUS) { - throw new \UnexpectedValueException('Expected NET_SFTP_STATUS. ' . 'Got packet type: ' . $this->packet_type); + throw new \UnexpectedValueException('Expected NET_SFTP_STATUS. ' + . 'Got packet type: ' . $this->packet_type); } + // if $status isn't SSH_FX_OK it's probably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED list($status) = Strings::unpackSSH2('N', $response); if ($status != NET_SFTP_STATUS_OK) { $this->logError($response, $status); - return \false; + return false; } + // don't move the stat cache entry over since this operation could very well change the // atime and mtime attributes //$this->update_stat_cache($newname, $this->query_stat_cache($oldname)); $this->remove_from_stat_cache($oldname); $this->remove_from_stat_cache($newname); - return \true; + + return true; } + /** * Parse Time * @@ -2577,6 +3039,7 @@ private function parseTime($key, $flags, &$response) } return $attr; } + /** * Parse Attributes * @@ -2588,11 +3051,13 @@ private function parseTime($key, $flags, &$response) protected function parseAttributes(&$response) { $attr = []; + if ($this->version >= 4) { list($flags, $attr['type']) = Strings::unpackSSH2('NC', $response); } else { list($flags) = Strings::unpackSSH2('N', $response); } + foreach (self::$attributes as $key => $value) { switch ($flags & $key) { case NET_SFTP_ATTR_UIDGID: @@ -2625,8 +3090,7 @@ protected function parseAttributes(&$response) } } switch ($flags & $key) { - case NET_SFTP_ATTR_SIZE: - // 0x00000001 + case NET_SFTP_ATTR_SIZE: // 0x00000001 // The size attribute is defined as an unsigned 64-bit integer. // The following will use floats on 32-bit platforms, if necessary. // As can be seen in the BigInteger class, floats are generally @@ -2635,36 +3099,30 @@ protected function parseAttributes(&$response) // of precision. Interpreted in filesize, 2^50 bytes = 1024 TiB. list($attr['size']) = Strings::unpackSSH2('Q', $response); break; - case NET_SFTP_ATTR_UIDGID: - // 0x00000002 (SFTPv3 only) + case NET_SFTP_ATTR_UIDGID: // 0x00000002 (SFTPv3 only) list($attr['uid'], $attr['gid']) = Strings::unpackSSH2('NN', $response); break; - case NET_SFTP_ATTR_PERMISSIONS: - // 0x00000004 + case NET_SFTP_ATTR_PERMISSIONS: // 0x00000004 list($attr['mode']) = Strings::unpackSSH2('N', $response); $fileType = $this->parseMode($attr['mode']); - if ($this->version < 4 && $fileType !== \false) { + if ($this->version < 4 && $fileType !== false) { $attr += ['type' => $fileType]; } break; - case NET_SFTP_ATTR_ACCESSTIME: - // 0x00000008 + case NET_SFTP_ATTR_ACCESSTIME: // 0x00000008 if ($this->version >= 4) { $attr += $this->parseTime('atime', $flags, $response); break; } list($attr['atime'], $attr['mtime']) = Strings::unpackSSH2('NN', $response); break; - case NET_SFTP_ATTR_CREATETIME: - // 0x00000010 (SFTPv4+) + case NET_SFTP_ATTR_CREATETIME: // 0x00000010 (SFTPv4+) $attr += $this->parseTime('createtime', $flags, $response); break; - case NET_SFTP_ATTR_MODIFYTIME: - // 0x00000020 + case NET_SFTP_ATTR_MODIFYTIME: // 0x00000020 $attr += $this->parseTime('mtime', $flags, $response); break; - case NET_SFTP_ATTR_ACL: - // 0x00000040 + case NET_SFTP_ATTR_ACL: // 0x00000040 // access control list // see https://datatracker.ietf.org/doc/html/draft-ietf-secsh-filexfer-04#section-5.7 // currently unsupported @@ -2673,15 +3131,12 @@ protected function parseAttributes(&$response) list($type, $flag, $mask, $who) = Strings::unpackSSH2('N3s', $result); } break; - case NET_SFTP_ATTR_OWNERGROUP: - // 0x00000080 + case NET_SFTP_ATTR_OWNERGROUP: // 0x00000080 list($attr['owner'], $attr['$group']) = Strings::unpackSSH2('ss', $response); break; - case NET_SFTP_ATTR_SUBSECOND_TIMES: - // 0x00000100 + case NET_SFTP_ATTR_SUBSECOND_TIMES: // 0x00000100 break; - case NET_SFTP_ATTR_BITS: - // 0x00000200 (SFTPv5+) + case NET_SFTP_ATTR_BITS: // 0x00000200 (SFTPv5+) // see https://datatracker.ietf.org/doc/html/draft-ietf-secsh-filexfer-05#section-5.8 // currently unsupported // tells if you file is: @@ -2692,44 +3147,37 @@ protected function parseAttributes(&$response) // $attr['attrib-bits'] and $attr['attrib-bits-valid'] // eg. - instead of _ break; - case NET_SFTP_ATTR_ALLOCATION_SIZE: - // 0x00000400 (SFTPv6+) + case NET_SFTP_ATTR_ALLOCATION_SIZE: // 0x00000400 (SFTPv6+) // see https://datatracker.ietf.org/doc/html/draft-ietf-secsh-filexfer-13#section-7.4 // represents the number of bytes that the file consumes on the disk. will // usually be larger than the 'size' field list($attr['allocation-size']) = Strings::unpackSSH2('Q', $response); break; - case NET_SFTP_ATTR_TEXT_HINT: - // 0x00000800 + case NET_SFTP_ATTR_TEXT_HINT: // 0x00000800 // https://datatracker.ietf.org/doc/html/draft-ietf-secsh-filexfer-13#section-7.10 // currently unsupported // tells if file is "known text", "guessed text", "known binary", "guessed binary" list($text_hint) = Strings::unpackSSH2('C', $response); // the above should be $attr['text-hint'] break; - case NET_SFTP_ATTR_MIME_TYPE: - // 0x00001000 + case NET_SFTP_ATTR_MIME_TYPE: // 0x00001000 // see https://datatracker.ietf.org/doc/html/draft-ietf-secsh-filexfer-13#section-7.11 list($attr['mime-type']) = Strings::unpackSSH2('s', $response); break; - case NET_SFTP_ATTR_LINK_COUNT: - // 0x00002000 + case NET_SFTP_ATTR_LINK_COUNT: // 0x00002000 // see https://datatracker.ietf.org/doc/html/draft-ietf-secsh-filexfer-13#section-7.12 list($attr['link-count']) = Strings::unpackSSH2('N', $response); break; - case NET_SFTP_ATTR_UNTRANSLATED_NAME: - // 0x00004000 + case NET_SFTP_ATTR_UNTRANSLATED_NAME:// 0x00004000 // see https://datatracker.ietf.org/doc/html/draft-ietf-secsh-filexfer-13#section-7.13 list($attr['untranslated-name']) = Strings::unpackSSH2('s', $response); break; - case NET_SFTP_ATTR_CTIME: - // 0x00008000 + case NET_SFTP_ATTR_CTIME: // 0x00008000 // 'ctime' contains the last time the file attributes were changed. The // exact meaning of this field depends on the server. $attr += $this->parseTime('ctime', $flags, $response); break; - case NET_SFTP_ATTR_EXTENDED: - // 0x80000000 + case NET_SFTP_ATTR_EXTENDED: // 0x80000000 list($count) = Strings::unpackSSH2('N', $response); for ($i = 0; $i < $count; $i++) { list($key, $value) = Strings::unpackSSH2('ss', $response); @@ -2739,6 +3187,7 @@ protected function parseAttributes(&$response) } return $attr; } + /** * Attempt to identify the file type * @@ -2751,12 +3200,10 @@ private function parseMode($mode) { // values come from http://lxr.free-electrons.com/source/include/uapi/linux/stat.h#L12 // see, also, http://linux.die.net/man/2/stat - switch ($mode & 0170000) { - // ie. 1111 0000 0000 0000 - case 00: - // no file type specified - figure out the file type using alternative means - return \false; - case 040000: + switch ($mode & 0170000) {// ie. 1111 0000 0000 0000 + case 0000000: // no file type specified - figure out the file type using alternative means + return false; + case 0040000: return NET_SFTP_TYPE_DIRECTORY; case 0100000: return NET_SFTP_TYPE_REGULAR; @@ -2764,20 +3211,15 @@ private function parseMode($mode) return NET_SFTP_TYPE_SYMLINK; // new types introduced in SFTPv5+ // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-05#section-5.2 - case 010000: - // named pipe (fifo) + case 0010000: // named pipe (fifo) return NET_SFTP_TYPE_FIFO; - case 020000: - // character special + case 0020000: // character special return NET_SFTP_TYPE_CHAR_DEVICE; - case 060000: - // block special + case 0060000: // block special return NET_SFTP_TYPE_BLOCK_DEVICE; - case 0140000: - // socket + case 0140000: // socket return NET_SFTP_TYPE_SOCKET; - case 0160000: - // whiteout + case 0160000: // whiteout // "SPECIAL should be used for files that are of // a known type which cannot be expressed in the protocol" return NET_SFTP_TYPE_SPECIAL; @@ -2785,6 +3227,7 @@ private function parseMode($mode) return NET_SFTP_TYPE_UNKNOWN; } } + /** * Parse Longname * @@ -2803,7 +3246,7 @@ private function parseLongname($longname) { // http://en.wikipedia.org/wiki/Unix_file_types // http://en.wikipedia.org/wiki/Filesystem_permissions#Notation_of_traditional_Unix_permissions - if (\preg_match('#^[^/]([r-][w-][xstST-]){3}#', $longname)) { + if (preg_match('#^[^/]([r-][w-][xstST-]){3}#', $longname)) { switch ($longname[0]) { case '-': return NET_SFTP_TYPE_REGULAR; @@ -2815,8 +3258,10 @@ private function parseLongname($longname) return NET_SFTP_TYPE_SPECIAL; } } - return \false; + + return false; } + /** * Sends SFTP Packets * @@ -2834,26 +3279,34 @@ private function send_sftp_packet($type, $data, $request_id = 1) // in SSH2.php the timeout is cumulative per function call. eg. exec() will // timeout after 10s. but for SFTP.php it's cumulative per packet $this->curTimeout = $this->timeout; - $this->is_timeout = \false; - $packet = $this->use_request_id ? \pack('NCNa*', \strlen($data) + 5, $type, $request_id, $data) : \pack('NCa*', \strlen($data) + 1, $type, $data); - $start = \microtime(\true); + $this->is_timeout = false; + + $packet = $this->use_request_id ? + pack('NCNa*', strlen($data) + 5, $type, $request_id, $data) : + pack('NCa*', strlen($data) + 1, $type, $data); + + $start = microtime(true); $this->send_channel_packet(self::CHANNEL, $packet); - $stop = \microtime(\true); - if (\defined('NET_SFTP_LOGGING')) { - $packet_type = '-> ' . self::$packet_types[$type] . ' (' . \round($stop - $start, 4) . 's)'; + $stop = microtime(true); + + if (defined('NET_SFTP_LOGGING')) { + $packet_type = '-> ' . self::$packet_types[$type] . + ' (' . round($stop - $start, 4) . 's)'; $this->append_log($packet_type, $data); } } + /** * Resets the SFTP channel for re-use */ private function reset_sftp() { - $this->use_request_id = \false; - $this->pwd = \false; + $this->use_request_id = false; + $this->pwd = false; $this->requestBuffer = []; - $this->partial_init = \false; + $this->partial_init = false; } + /** * Resets a connection for re-use */ @@ -2862,6 +3315,7 @@ protected function reset_connection() parent::reset_connection(); $this->reset_sftp(); } + /** * Receives SFTP Packets * @@ -2876,77 +3330,93 @@ protected function reset_connection() */ private function get_sftp_packet($request_id = null) { - $this->channel_close = \false; + $this->channel_close = false; + if (isset($request_id) && isset($this->requestBuffer[$request_id])) { $this->packet_type = $this->requestBuffer[$request_id]['packet_type']; $temp = $this->requestBuffer[$request_id]['packet']; unset($this->requestBuffer[$request_id]); return $temp; } + // in SSH2.php the timeout is cumulative per function call. eg. exec() will // timeout after 10s. but for SFTP.php it's cumulative per packet $this->curTimeout = $this->timeout; - $this->is_timeout = \false; - $start = \microtime(\true); + $this->is_timeout = false; + + $start = microtime(true); + // SFTP packet length - while (\strlen($this->packet_buffer) < 4) { - $temp = $this->get_channel_packet(self::CHANNEL, \true); - if ($temp === \true) { + while (strlen($this->packet_buffer) < 4) { + $temp = $this->get_channel_packet(self::CHANNEL, true); + if ($temp === true) { if ($this->channel_status[self::CHANNEL] === NET_SSH2_MSG_CHANNEL_CLOSE) { - $this->channel_close = \true; + $this->channel_close = true; } - $this->packet_type = \false; + $this->packet_type = false; $this->packet_buffer = ''; - return \false; + return false; } $this->packet_buffer .= $temp; } - if (\strlen($this->packet_buffer) < 4) { + if (strlen($this->packet_buffer) < 4) { throw new \RuntimeException('Packet is too small'); } - $length = \unpack('Nlength', Strings::shift($this->packet_buffer, 4))['length']; + $length = unpack('Nlength', Strings::shift($this->packet_buffer, 4))['length']; + $tempLength = $length; - $tempLength -= \strlen($this->packet_buffer); + $tempLength -= strlen($this->packet_buffer); + // 256 * 1024 is what SFTP_MAX_MSG_LENGTH is set to in OpenSSH's sftp-common.h if (!$this->allow_arbitrary_length_packets && !$this->use_request_id && $tempLength > 256 * 1024) { throw new \RuntimeException('Invalid Size'); } + // SFTP packet type and data payload while ($tempLength > 0) { - $temp = $this->get_channel_packet(self::CHANNEL, \true); - if ($temp === \true) { + $temp = $this->get_channel_packet(self::CHANNEL, true); + if ($temp === true) { if ($this->channel_status[self::CHANNEL] === NET_SSH2_MSG_CHANNEL_CLOSE) { - $this->channel_close = \true; + $this->channel_close = true; } - $this->packet_type = \false; + $this->packet_type = false; $this->packet_buffer = ''; - return \false; + return false; } $this->packet_buffer .= $temp; - $tempLength -= \strlen($temp); + $tempLength -= strlen($temp); } - $stop = \microtime(\true); - $this->packet_type = \ord(Strings::shift($this->packet_buffer)); + + $stop = microtime(true); + + $this->packet_type = ord(Strings::shift($this->packet_buffer)); + if ($this->use_request_id) { - $packet_id = \unpack('Npacket_id', Strings::shift($this->packet_buffer, 4))['packet_id']; - // remove the request id - $length -= 5; - // account for the request id and the packet type + $packet_id = unpack('Npacket_id', Strings::shift($this->packet_buffer, 4))['packet_id']; // remove the request id + $length -= 5; // account for the request id and the packet type } else { - $length -= 1; - // account for the packet type + $length -= 1; // account for the packet type } + $packet = Strings::shift($this->packet_buffer, $length); - if (\defined('NET_SFTP_LOGGING')) { - $packet_type = '<- ' . self::$packet_types[$this->packet_type] . ' (' . \round($stop - $start, 4) . 's)'; + + if (defined('NET_SFTP_LOGGING')) { + $packet_type = '<- ' . self::$packet_types[$this->packet_type] . + ' (' . round($stop - $start, 4) . 's)'; $this->append_log($packet_type, $packet); } + if (isset($request_id) && $this->use_request_id && $packet_id != $request_id) { - $this->requestBuffer[$packet_id] = ['packet_type' => $this->packet_type, 'packet' => $packet]; + $this->requestBuffer[$packet_id] = [ + 'packet_type' => $this->packet_type, + 'packet' => $packet + ]; return $this->get_sftp_packet($request_id); } + return $packet; } + /** * Logs data packets * @@ -2957,8 +3427,19 @@ private function get_sftp_packet($request_id = null) */ private function append_log($message_number, $message) { - $this->append_log_helper(NET_SFTP_LOGGING, $message_number, $message, $this->packet_type_log, $this->packet_log, $this->log_size, $this->realtime_log_file, $this->realtime_log_wrap, $this->realtime_log_size); + $this->append_log_helper( + NET_SFTP_LOGGING, + $message_number, + $message, + $this->packet_type_log, + $this->packet_log, + $this->log_size, + $this->realtime_log_file, + $this->realtime_log_wrap, + $this->realtime_log_size + ); } + /** * Returns a log of the packets that have been sent and received. * @@ -2968,9 +3449,10 @@ private function append_log($message_number, $message) */ public function getSFTPLog() { - if (!\defined('NET_SFTP_LOGGING')) { - return \false; + if (!defined('NET_SFTP_LOGGING')) { + return false; } + switch (NET_SFTP_LOGGING) { case self::LOG_COMPLEX: return $this->format_log($this->packet_log, $this->packet_type_log); @@ -2980,6 +3462,7 @@ public function getSFTPLog() return $this->packet_type_log; } } + /** * Returns all errors on the SFTP layer * @@ -2989,6 +3472,7 @@ public function getSFTPErrors() { return $this->sftp_errors; } + /** * Returns the last error on the SFTP layer * @@ -2996,8 +3480,9 @@ public function getSFTPErrors() */ public function getLastSFTPError() { - return \count($this->sftp_errors) ? $this->sftp_errors[\count($this->sftp_errors) - 1] : ''; + return count($this->sftp_errors) ? $this->sftp_errors[count($this->sftp_errors) - 1] : ''; } + /** * Get supported SFTP versions * @@ -3006,17 +3491,20 @@ public function getLastSFTPError() public function getSupportedVersions() { if (!($this->bitmap & SSH2::MASK_LOGIN)) { - return \false; + return false; } + if (!$this->partial_init) { $this->partial_init_sftp_connection(); } + $temp = ['version' => $this->defaultVersion]; if (isset($this->extensions['versions'])) { $temp['extensions'] = $this->extensions['versions']; } return $temp; } + /** * Get supported SFTP extensions * @@ -3025,13 +3513,16 @@ public function getSupportedVersions() public function getSupportedExtensions() { if (!($this->bitmap & SSH2::MASK_LOGIN)) { - return \false; + return false; } + if (!$this->partial_init) { $this->partial_init_sftp_connection(); } + return $this->extensions; } + /** * Get supported SFTP versions * @@ -3040,10 +3531,12 @@ public function getSupportedExtensions() public function getNegotiatedVersion() { if (!$this->precheck()) { - return \false; + return false; } + return $this->version; } + /** * Set preferred version * @@ -3057,6 +3550,7 @@ public function setPreferredVersion($version) { $this->preferredVersion = $version; } + /** * Disconnect * @@ -3065,23 +3559,26 @@ public function setPreferredVersion($version) */ protected function disconnect_helper($reason) { - $this->pwd = \false; + $this->pwd = false; return parent::disconnect_helper($reason); } + /** * Enable Date Preservation */ public function enableDatePreservation() { - $this->preserveTime = \true; + $this->preserveTime = true; } + /** * Disable Date Preservation */ public function disableDatePreservation() { - $this->preserveTime = \false; + $this->preserveTime = false; } + /** * Copy * @@ -3094,61 +3591,83 @@ public function disableDatePreservation() public function copy($oldname, $newname) { if (!$this->precheck()) { - return \false; + return false; } + $oldname = $this->realpath($oldname); $newname = $this->realpath($newname); - if ($oldname === \false || $newname === \false) { - return \false; + if ($oldname === false || $newname === false) { + return false; } + if (!isset($this->extensions['copy-data']) || $this->extensions['copy-data'] !== '1') { - throw new \RuntimeException("Extension 'copy-data' is not supported by the server. " . "Call getSupportedVersions() to see a list of supported extension"); + throw new \RuntimeException( + "Extension 'copy-data' is not supported by the server. " . + "Call getSupportedVersions() to see a list of supported extension" + ); } + $size = $this->filesize($oldname); + $packet = Strings::packSSH2('s', $oldname); - $packet .= $this->version >= 5 ? \pack('N3', 0, NET_SFTP_OPEN_OPEN_EXISTING, 0) : \pack('N2', NET_SFTP_OPEN_READ, 0); + $packet .= $this->version >= 5 ? + pack('N3', 0, NET_SFTP_OPEN_OPEN_EXISTING, 0) : + pack('N2', NET_SFTP_OPEN_READ, 0); $this->send_sftp_packet(NET_SFTP_OPEN, $packet); + $response = $this->get_sftp_packet(); switch ($this->packet_type) { case NET_SFTP_HANDLE: - $oldhandle = \substr($response, 4); + $oldhandle = substr($response, 4); break; - case NET_SFTP_STATUS: - // presumably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED + case NET_SFTP_STATUS: // presumably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED $this->logError($response); - return \false; + return false; default: - throw new \UnexpectedValueException('Expected NET_SFTP_HANDLE or NET_SFTP_STATUS. ' . 'Got packet type: ' . $this->packet_type); + throw new \UnexpectedValueException('Expected NET_SFTP_HANDLE or NET_SFTP_STATUS. ' + . 'Got packet type: ' . $this->packet_type); } + if ($this->version >= 5) { $flags = NET_SFTP_OPEN_OPEN_OR_CREATE; } else { $flags = NET_SFTP_OPEN_WRITE | NET_SFTP_OPEN_CREATE; } + $packet = Strings::packSSH2('s', $newname); - $packet .= $this->version >= 5 ? \pack('N3', 0, $flags, 0) : \pack('N2', $flags, 0); + $packet .= $this->version >= 5 ? + pack('N3', 0, $flags, 0) : + pack('N2', $flags, 0); $this->send_sftp_packet(NET_SFTP_OPEN, $packet); + $response = $this->get_sftp_packet(); switch ($this->packet_type) { case NET_SFTP_HANDLE: - $newhandle = \substr($response, 4); + $newhandle = substr($response, 4); break; case NET_SFTP_STATUS: $this->logError($response); - return \false; + return false; default: - throw new \UnexpectedValueException('Expected NET_SFTP_HANDLE or NET_SFTP_STATUS. ' . 'Got packet type: ' . $this->packet_type); + throw new \UnexpectedValueException('Expected NET_SFTP_HANDLE or NET_SFTP_STATUS. ' + . 'Got packet type: ' . $this->packet_type); } + $packet = Strings::packSSH2('ssQQsQ', 'copy-data', $oldhandle, 0, $size, $newhandle, 0); $this->send_sftp_packet(NET_SFTP_EXTENDED, $packet); + $response = $this->get_sftp_packet(); if ($this->packet_type != NET_SFTP_STATUS) { - throw new \UnexpectedValueException('Expected NET_SFTP_STATUS. ' . 'Got packet type: ' . $this->packet_type); + throw new \UnexpectedValueException('Expected NET_SFTP_STATUS. ' + . 'Got packet type: ' . $this->packet_type); } + $this->close_handle($oldhandle); $this->close_handle($newhandle); - return \true; + + return true; } + /** * POSIX Rename * @@ -3164,40 +3683,50 @@ public function copy($oldname, $newname) public function posix_rename($oldname, $newname) { if (!$this->precheck()) { - return \false; + return false; } + $oldname = $this->realpath($oldname); $newname = $this->realpath($newname); - if ($oldname === \false || $newname === \false) { - return \false; + if ($oldname === false || $newname === false) { + return false; } + if ($this->version >= 5) { - $packet = Strings::packSSH2('ssN', $oldname, $newname, 2); - // 2 = SSH_FXP_RENAME_ATOMIC + $packet = Strings::packSSH2('ssN', $oldname, $newname, 2); // 2 = SSH_FXP_RENAME_ATOMIC $this->send_sftp_packet(NET_SFTP_RENAME, $packet); } elseif (isset($this->extensions['posix-rename@openssh.com']) && $this->extensions['posix-rename@openssh.com'] === '1') { $packet = Strings::packSSH2('sss', 'posix-rename@openssh.com', $oldname, $newname); $this->send_sftp_packet(NET_SFTP_EXTENDED, $packet); } else { - throw new \RuntimeException("Extension 'posix-rename@openssh.com' is not supported by the server. " . "Call getSupportedVersions() to see a list of supported extension"); + throw new \RuntimeException( + "Extension 'posix-rename@openssh.com' is not supported by the server. " . + "Call getSupportedVersions() to see a list of supported extension" + ); } + $response = $this->get_sftp_packet(); if ($this->packet_type != NET_SFTP_STATUS) { - throw new \UnexpectedValueException('Expected NET_SFTP_STATUS. ' . 'Got packet type: ' . $this->packet_type); + throw new \UnexpectedValueException('Expected NET_SFTP_STATUS. ' + . 'Got packet type: ' . $this->packet_type); } + // if $status isn't SSH_FX_OK it's probably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED list($status) = Strings::unpackSSH2('N', $response); if ($status != NET_SFTP_STATUS_OK) { $this->logError($response, $status); - return \false; + return false; } + // don't move the stat cache entry over since this operation could very well change the // atime and mtime attributes //$this->update_stat_cache($newname, $this->query_stat_cache($oldname)); $this->remove_from_stat_cache($oldname); $this->remove_from_stat_cache($newname); - return \true; + + return true; } + /** * Returns general information about a file system. * @@ -3210,21 +3739,32 @@ public function posix_rename($oldname, $newname) public function statvfs($path) { if (!$this->precheck()) { - return \false; + return false; } + if (!isset($this->extensions['statvfs@openssh.com']) || $this->extensions['statvfs@openssh.com'] !== '2') { - throw new \RuntimeException("Extension 'statvfs@openssh.com' is not supported by the server. " . "Call getSupportedVersions() to see a list of supported extension"); + throw new \RuntimeException( + "Extension 'statvfs@openssh.com' is not supported by the server. " . + "Call getSupportedVersions() to see a list of supported extension" + ); } + $realpath = $this->realpath($path); - if ($realpath === \false) { - return \false; + if ($realpath === false) { + return false; } + $packet = Strings::packSSH2('ss', 'statvfs@openssh.com', $realpath); $this->send_sftp_packet(NET_SFTP_EXTENDED, $packet); + $response = $this->get_sftp_packet(); if ($this->packet_type !== NET_SFTP_EXTENDED_REPLY) { - throw new \UnexpectedValueException('Expected SSH_FXP_EXTENDED_REPLY. ' . 'Got packet type: ' . $this->packet_type); + throw new \UnexpectedValueException( + 'Expected SSH_FXP_EXTENDED_REPLY. ' + . 'Got packet type: ' . $this->packet_type + ); } + /** * These requests return a SSH_FXP_STATUS reply on failure. On success they * return the following SSH_FXP_EXTENDED_REPLY reply: @@ -3242,6 +3782,9 @@ public function statvfs($path) * uint64 f_flag bit mask of f_flag values * uint64 f_namemax maximum filename length */ - return \array_combine(['bsize', 'frsize', 'blocks', 'bfree', 'bavail', 'files', 'ffree', 'favail', 'fsid', 'flag', 'namemax'], Strings::unpackSSH2('QQQQQQQQQQQ', $response)); + return array_combine( + ['bsize', 'frsize', 'blocks', 'bfree', 'bavail', 'files', 'ffree', 'favail', 'fsid', 'flag', 'namemax'], + Strings::unpackSSH2('QQQQQQQQQQQ', $response) + ); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Net/SFTP/Stream.php b/composer/phpseclib/phpseclib/phpseclib/Net/SFTP/Stream.php index 6c10b86..a77fa97 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Net/SFTP/Stream.php +++ b/composer/phpseclib/phpseclib/phpseclib/Net/SFTP/Stream.php @@ -12,16 +12,17 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Net\SFTP; use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\PrivateKey; use OCA\Libresign\Vendor\phpseclib3\Net\SFTP; use OCA\Libresign\Vendor\phpseclib3\Net\SSH2; + /** * SFTP Stream Wrapper * * @author Jim Wigginton - * @internal */ class Stream { @@ -33,48 +34,56 @@ class Stream * @var array */ public static $instances; + /** * SFTP instance * * @var object */ private $sftp; + /** * Path * * @var string */ private $path; + /** * Mode * * @var string */ private $mode; + /** * Position * * @var int */ private $pos; + /** * Size * * @var int */ private $size; + /** * Directory entries * * @var array */ private $entries; + /** * EOF flag * * @var bool */ private $eof; + /** * Context resource * @@ -83,12 +92,14 @@ class Stream * @var resource */ public $context; + /** * Notification callback function * * @var callable */ private $notification; + /** * Registers this class as a URL wrapper. * @@ -97,21 +108,23 @@ class Stream */ public static function register($protocol = 'sftp') { - if (\in_array($protocol, \stream_get_wrappers(), \true)) { - return \false; + if (in_array($protocol, stream_get_wrappers(), true)) { + return false; } - return \stream_wrapper_register($protocol, \get_called_class()); + return stream_wrapper_register($protocol, get_called_class()); } + /** * The Constructor * */ public function __construct() { - if (\defined('NET_SFTP_STREAM_LOGGING')) { + if (defined('NET_SFTP_STREAM_LOGGING')) { echo "__construct()\r\n"; } } + /** * Path Parser * @@ -126,41 +139,46 @@ public function __construct() protected function parse_path($path) { $orig = $path; - $url = \parse_url($path) + ['port' => 22]; + $url = parse_url($path) + ['port' => 22]; + $keys = ['scheme', 'host', 'port', 'user', 'pass', 'path', 'query', 'fragment']; foreach ($keys as $key) { if (isset($url[$key])) { - ${$key} = $url[$key]; + $$key = $url[$key]; } } + if (isset($query)) { $path .= '?' . $query; - } elseif (\preg_match('/(\\?|\\?#)$/', $orig)) { + } elseif (preg_match('/(\?|\?#)$/', $orig)) { $path .= '?'; } if (isset($fragment)) { $path .= '#' . $fragment; - } elseif ($orig[\strlen($orig) - 1] == '#') { + } elseif ($orig[strlen($orig) - 1] == '#') { $path .= '#'; } + if (!isset($host)) { - return \false; + return false; } + if (isset($this->context)) { - $context = \stream_context_get_params($this->context); + $context = stream_context_get_params($this->context); if (isset($context['notification'])) { $this->notification = $context['notification']; } } - if (\preg_match('/^{[a-z0-9]+}$/i', $host)) { + + if (preg_match('/^{[a-z0-9]+}$/i', $host)) { $host = SSH2::getConnectionByResourceId($host); - if ($host === \false) { - return \false; + if ($host === false) { + return false; } $this->sftp = $host; } else { if (isset($this->context)) { - $context = \stream_context_get_options($this->context); + $context = stream_context_get_options($this->context); } if (isset($context[$scheme]['session'])) { $sftp = $context[$scheme]['session']; @@ -181,42 +199,46 @@ protected function parse_path($path) if (isset($context[$scheme]['privkey']) && $context[$scheme]['privkey'] instanceof PrivateKey) { $pass = $context[$scheme]['privkey']; } + if (!isset($user) || !isset($pass)) { - return \false; + return false; } + // casting $pass to a string is necessary in the event that it's a \phpseclib3\Crypt\RSA object if (isset(self::$instances[$host][$port][$user][(string) $pass])) { $this->sftp = self::$instances[$host][$port][$user][(string) $pass]; } else { $this->sftp = new SFTP($host, $port); $this->sftp->disableStatCache(); - if (isset($this->notification) && \is_callable($this->notification)) { + if (isset($this->notification) && is_callable($this->notification)) { /* if !is_callable($this->notification) we could do this: - - user_error('fopen(): failed to call user notifier', E_USER_WARNING); - - the ftp wrapper gives errors like that when the notifier isn't callable. - i've opted not to do that, however, since the ftp wrapper gives the line - on which the fopen occurred as the line number - not the line that the - user_error is on. - */ - \call_user_func($this->notification, \STREAM_NOTIFY_CONNECT, \STREAM_NOTIFY_SEVERITY_INFO, '', 0, 0, 0); - \call_user_func($this->notification, \STREAM_NOTIFY_AUTH_REQUIRED, \STREAM_NOTIFY_SEVERITY_INFO, '', 0, 0, 0); + + user_error('fopen(): failed to call user notifier', E_USER_WARNING); + + the ftp wrapper gives errors like that when the notifier isn't callable. + i've opted not to do that, however, since the ftp wrapper gives the line + on which the fopen occurred as the line number - not the line that the + user_error is on. + */ + call_user_func($this->notification, STREAM_NOTIFY_CONNECT, STREAM_NOTIFY_SEVERITY_INFO, '', 0, 0, 0); + call_user_func($this->notification, STREAM_NOTIFY_AUTH_REQUIRED, STREAM_NOTIFY_SEVERITY_INFO, '', 0, 0, 0); if (!$this->sftp->login($user, $pass)) { - \call_user_func($this->notification, \STREAM_NOTIFY_AUTH_RESULT, \STREAM_NOTIFY_SEVERITY_ERR, 'Login Failure', NET_SSH2_MSG_USERAUTH_FAILURE, 0, 0); - return \false; + call_user_func($this->notification, STREAM_NOTIFY_AUTH_RESULT, STREAM_NOTIFY_SEVERITY_ERR, 'Login Failure', NET_SSH2_MSG_USERAUTH_FAILURE, 0, 0); + return false; } - \call_user_func($this->notification, \STREAM_NOTIFY_AUTH_RESULT, \STREAM_NOTIFY_SEVERITY_INFO, 'Login Success', NET_SSH2_MSG_USERAUTH_SUCCESS, 0, 0); + call_user_func($this->notification, STREAM_NOTIFY_AUTH_RESULT, STREAM_NOTIFY_SEVERITY_INFO, 'Login Success', NET_SSH2_MSG_USERAUTH_SUCCESS, 0, 0); } else { if (!$this->sftp->login($user, $pass)) { - return \false; + return false; } } self::$instances[$host][$port][$user][(string) $pass] = $this->sftp; } } + return $path; } + /** * Opens file or URL * @@ -229,16 +251,19 @@ protected function parse_path($path) private function _stream_open($path, $mode, $options, &$opened_path) { $path = $this->parse_path($path); - if ($path === \false) { - return \false; + + if ($path === false) { + return false; } $this->path = $path; + $this->size = $this->sftp->filesize($path); - $this->mode = \preg_replace('#[bt]$#', '', $mode); - $this->eof = \false; - if ($this->size === \false) { + $this->mode = preg_replace('#[bt]$#', '', $mode); + $this->eof = false; + + if ($this->size === false) { if ($this->mode[0] == 'r') { - return \false; + return false; } else { $this->sftp->touch($path); $this->size = 0; @@ -246,15 +271,18 @@ private function _stream_open($path, $mode, $options, &$opened_path) } else { switch ($this->mode[0]) { case 'x': - return \false; + return false; case 'w': $this->sftp->truncate($path, 0); $this->size = 0; } } + $this->pos = $this->mode[0] != 'a' ? 0 : $this->size; - return \true; + + return true; } + /** * Read from stream * @@ -268,30 +296,34 @@ private function _stream_read($count) case 'a': case 'x': case 'c': - return \false; + return false; } + // commented out because some files - eg. /dev/urandom - will say their size is 0 when in fact it's kinda infinite //if ($this->pos >= $this->size) { // $this->eof = true; // return false; //} - $result = $this->sftp->get($this->path, \false, $this->pos, $count); - if (isset($this->notification) && \is_callable($this->notification)) { - if ($result === \false) { - \call_user_func($this->notification, \STREAM_NOTIFY_FAILURE, \STREAM_NOTIFY_SEVERITY_ERR, $this->sftp->getLastSFTPError(), NET_SFTP_OPEN, 0, 0); + + $result = $this->sftp->get($this->path, false, $this->pos, $count); + if (isset($this->notification) && is_callable($this->notification)) { + if ($result === false) { + call_user_func($this->notification, STREAM_NOTIFY_FAILURE, STREAM_NOTIFY_SEVERITY_ERR, $this->sftp->getLastSFTPError(), NET_SFTP_OPEN, 0, 0); return 0; } // seems that PHP calls stream_read in 8k chunks - \call_user_func($this->notification, \STREAM_NOTIFY_PROGRESS, \STREAM_NOTIFY_SEVERITY_INFO, '', 0, \strlen($result), $this->size); + call_user_func($this->notification, STREAM_NOTIFY_PROGRESS, STREAM_NOTIFY_SEVERITY_INFO, '', 0, strlen($result), $this->size); } - if (empty($result)) { - // ie. false or empty string - $this->eof = \true; - return \false; + + if (empty($result)) { // ie. false or empty string + $this->eof = true; + return false; } - $this->pos += \strlen($result); + $this->pos += strlen($result); + return $result; } + /** * Write to stream * @@ -302,27 +334,30 @@ private function _stream_write($data) { switch ($this->mode) { case 'r': - return \false; + return false; } + $result = $this->sftp->put($this->path, $data, SFTP::SOURCE_STRING, $this->pos); - if (isset($this->notification) && \is_callable($this->notification)) { + if (isset($this->notification) && is_callable($this->notification)) { if (!$result) { - \call_user_func($this->notification, \STREAM_NOTIFY_FAILURE, \STREAM_NOTIFY_SEVERITY_ERR, $this->sftp->getLastSFTPError(), NET_SFTP_OPEN, 0, 0); + call_user_func($this->notification, STREAM_NOTIFY_FAILURE, STREAM_NOTIFY_SEVERITY_ERR, $this->sftp->getLastSFTPError(), NET_SFTP_OPEN, 0, 0); return 0; } // seems that PHP splits up strings into 8k blocks before calling stream_write - \call_user_func($this->notification, \STREAM_NOTIFY_PROGRESS, \STREAM_NOTIFY_SEVERITY_INFO, '', 0, \strlen($data), \strlen($data)); + call_user_func($this->notification, STREAM_NOTIFY_PROGRESS, STREAM_NOTIFY_SEVERITY_INFO, '', 0, strlen($data), strlen($data)); } - if ($result === \false) { - return \false; + + if ($result === false) { + return false; } - $this->pos += \strlen($data); + $this->pos += strlen($data); if ($this->pos > $this->size) { $this->size = $this->pos; } - $this->eof = \false; - return \strlen($data); + $this->eof = false; + return strlen($data); } + /** * Retrieve the current position of a stream * @@ -332,6 +367,7 @@ private function _stream_tell() { return $this->pos; } + /** * Tests for end-of-file on a file pointer * @@ -348,6 +384,7 @@ private function _stream_eof() { return $this->eof; } + /** * Seeks to specific location in a stream * @@ -358,21 +395,23 @@ private function _stream_eof() private function _stream_seek($offset, $whence) { switch ($whence) { - case \SEEK_SET: + case SEEK_SET: if ($offset < 0) { - return \false; + return false; } break; - case \SEEK_CUR: + case SEEK_CUR: $offset += $this->pos; break; - case \SEEK_END: + case SEEK_END: $offset += $this->size; } + $this->pos = $offset; - $this->eof = \false; - return \true; + $this->eof = false; + return true; } + /** * Change stream options * @@ -384,34 +423,30 @@ private function _stream_seek($offset, $whence) private function _stream_metadata($path, $option, $var) { $path = $this->parse_path($path); - if ($path === \false) { - return \false; + if ($path === false) { + return false; } + // stream_metadata was introduced in PHP 5.4.0 but as of 5.4.11 the constants haven't been defined // see http://www.php.net/streamwrapper.stream-metadata and https://bugs.php.net/64246 // and https://github.com/php/php-src/blob/master/main/php_streams.h#L592 switch ($option) { - case 1: - // PHP_STREAM_META_TOUCH + case 1: // PHP_STREAM_META_TOUCH $time = isset($var[0]) ? $var[0] : null; $atime = isset($var[1]) ? $var[1] : null; return $this->sftp->touch($path, $time, $atime); - case 2: - // PHP_STREAM_OWNER_NAME - case 3: - // PHP_STREAM_GROUP_NAME - return \false; - case 4: - // PHP_STREAM_META_OWNER + case 2: // PHP_STREAM_OWNER_NAME + case 3: // PHP_STREAM_GROUP_NAME + return false; + case 4: // PHP_STREAM_META_OWNER return $this->sftp->chown($path, $var); - case 5: - // PHP_STREAM_META_GROUP + case 5: // PHP_STREAM_META_GROUP return $this->sftp->chgrp($path, $var); - case 6: - // PHP_STREAM_META_ACCESS - return $this->sftp->chmod($path, $var) !== \false; + case 6: // PHP_STREAM_META_ACCESS + return $this->sftp->chmod($path, $var) !== false; } } + /** * Retrieve the underlaying resource * @@ -422,6 +457,7 @@ private function _stream_cast($cast_as) { return $this->sftp->fsock; } + /** * Advisory file locking * @@ -430,8 +466,9 @@ private function _stream_cast($cast_as) */ private function _stream_lock($operation) { - return \false; + return false; } + /** * Renames a file or directory * @@ -445,29 +482,32 @@ private function _stream_lock($operation) */ private function _rename($path_from, $path_to) { - $path1 = \parse_url($path_from); - $path2 = \parse_url($path_to); + $path1 = parse_url($path_from); + $path2 = parse_url($path_to); unset($path1['path'], $path2['path']); if ($path1 != $path2) { - return \false; + return false; } + $path_from = $this->parse_path($path_from); - $path_to = \parse_url($path_to); - if ($path_from === \false) { - return \false; + $path_to = parse_url($path_to); + if ($path_from === false) { + return false; } - $path_to = $path_to['path']; - // the $component part of parse_url() was added in PHP 5.1.2 + + $path_to = $path_to['path']; // the $component part of parse_url() was added in PHP 5.1.2 // "It is an error if there already exists a file with the name specified by newpath." // -- http://tools.ietf.org/html/draft-ietf-secsh-filexfer-02#section-6.5 if (!$this->sftp->rename($path_from, $path_to)) { if ($this->sftp->stat($path_to)) { - return $this->sftp->delete($path_to, \true) && $this->sftp->rename($path_from, $path_to); + return $this->sftp->delete($path_to, true) && $this->sftp->rename($path_from, $path_to); } - return \false; + return false; } - return \true; + + return true; } + /** * Open directory handle * @@ -494,13 +534,14 @@ private function _rename($path_from, $path_to) private function _dir_opendir($path, $options) { $path = $this->parse_path($path); - if ($path === \false) { - return \false; + if ($path === false) { + return false; } $this->pos = 0; $this->entries = $this->sftp->nlist($path); - return $this->entries !== \false; + return $this->entries !== false; } + /** * Read entry from directory handle * @@ -511,8 +552,9 @@ private function _dir_readdir() if (isset($this->entries[$this->pos])) { return $this->entries[$this->pos++]; } - return \false; + return false; } + /** * Rewind directory handle * @@ -521,8 +563,9 @@ private function _dir_readdir() private function _dir_rewinddir() { $this->pos = 0; - return \true; + return true; } + /** * Close directory handle * @@ -530,8 +573,9 @@ private function _dir_rewinddir() */ private function _dir_closedir() { - return \true; + return true; } + /** * Create a directory * @@ -545,11 +589,13 @@ private function _dir_closedir() private function _mkdir($path, $mode, $options) { $path = $this->parse_path($path); - if ($path === \false) { - return \false; + if ($path === false) { + return false; } - return $this->sftp->mkdir($path, $mode, $options & \STREAM_MKDIR_RECURSIVE); + + return $this->sftp->mkdir($path, $mode, $options & STREAM_MKDIR_RECURSIVE); } + /** * Removes a directory * @@ -565,11 +611,13 @@ private function _mkdir($path, $mode, $options) private function _rmdir($path, $options) { $path = $this->parse_path($path); - if ($path === \false) { - return \false; + if ($path === false) { + return false; } + return $this->sftp->rmdir($path); } + /** * Flushes the output * @@ -579,8 +627,9 @@ private function _rmdir($path, $options) */ private function _stream_flush() { - return \true; + return true; } + /** * Retrieve information about a file resource * @@ -589,11 +638,12 @@ private function _stream_flush() private function _stream_stat() { $results = $this->sftp->stat($this->path); - if ($results === \false) { - return \false; + if ($results === false) { + return false; } return $results; } + /** * Delete a file * @@ -603,11 +653,13 @@ private function _stream_stat() private function _unlink($path) { $path = $this->parse_path($path); - if ($path === \false) { - return \false; + if ($path === false) { + return false; } - return $this->sftp->delete($path, \false); + + return $this->sftp->delete($path, false); } + /** * Retrieve information about a file * @@ -622,15 +674,18 @@ private function _unlink($path) private function _url_stat($path, $flags) { $path = $this->parse_path($path); - if ($path === \false) { - return \false; + if ($path === false) { + return false; } - $results = $flags & \STREAM_URL_STAT_LINK ? $this->sftp->lstat($path) : $this->sftp->stat($path); - if ($results === \false) { - return \false; + + $results = $flags & STREAM_URL_STAT_LINK ? $this->sftp->lstat($path) : $this->sftp->stat($path); + if ($results === false) { + return false; } + return $results; } + /** * Truncate stream * @@ -640,12 +695,15 @@ private function _url_stat($path, $flags) private function _stream_truncate($new_size) { if (!$this->sftp->truncate($this->path, $new_size)) { - return \false; + return false; } - $this->eof = \false; + + $this->eof = false; $this->size = $new_size; - return \true; + + return true; } + /** * Change stream options * @@ -659,8 +717,9 @@ private function _stream_truncate($new_size) */ private function _stream_set_option($option, $arg1, $arg2) { - return \false; + return false; } + /** * Close an resource * @@ -668,6 +727,7 @@ private function _stream_set_option($option, $arg1, $arg2) private function _stream_close() { } + /** * __call Magic Method * @@ -684,11 +744,11 @@ private function _stream_close() */ public function __call($name, array $arguments) { - if (\defined('NET_SFTP_STREAM_LOGGING')) { + if (defined('NET_SFTP_STREAM_LOGGING')) { echo $name . '('; - $last = \count($arguments) - 1; + $last = count($arguments) - 1; foreach ($arguments as $i => $argument) { - \var_export($argument); + var_export($argument); if ($i != $last) { echo ','; } @@ -696,9 +756,9 @@ public function __call($name, array $arguments) echo ")\r\n"; } $name = '_' . $name; - if (!\method_exists($this, $name)) { - return \false; + if (!method_exists($this, $name)) { + return false; } - return $this->{$name}(...$arguments); + return $this->$name(...$arguments); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/Net/SSH2.php b/composer/phpseclib/phpseclib/phpseclib/Net/SSH2.php index 8579223..1da9e34 100644 --- a/composer/phpseclib/phpseclib/phpseclib/Net/SSH2.php +++ b/composer/phpseclib/phpseclib/phpseclib/Net/SSH2.php @@ -42,6 +42,7 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\Net; use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; @@ -59,8 +60,7 @@ use OCA\Libresign\Vendor\phpseclib3\Crypt\RC4; use OCA\Libresign\Vendor\phpseclib3\Crypt\Rijndael; use OCA\Libresign\Vendor\phpseclib3\Crypt\RSA; -use OCA\Libresign\Vendor\phpseclib3\Crypt\TripleDES; -// Used to do Diffie-Hellman key exchange and DSA/RSA signature verification. +use OCA\Libresign\Vendor\phpseclib3\Crypt\TripleDES; // Used to do Diffie-Hellman key exchange and DSA/RSA signature verification. use OCA\Libresign\Vendor\phpseclib3\Crypt\Twofish; use OCA\Libresign\Vendor\phpseclib3\Exception\ConnectionClosedException; use OCA\Libresign\Vendor\phpseclib3\Exception\InsufficientSetupException; @@ -72,11 +72,11 @@ use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedCurveException; use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; use OCA\Libresign\Vendor\phpseclib3\System\SSH\Agent; + /** * Pure-PHP implementation of SSHv2. * * @author Jim Wigginton - * @internal */ class SSH2 { @@ -97,13 +97,15 @@ class SSH2 */ const NET_SSH2_COMPRESSION_ZLIB_AT_OPENSSH = 3; /**#@-*/ + // Execution Bitmap Masks - const MASK_CONSTRUCTOR = 0x1; - const MASK_CONNECTED = 0x2; - const MASK_LOGIN_REQ = 0x4; - const MASK_LOGIN = 0x8; - const MASK_SHELL = 0x10; - const MASK_DISCONNECT = 0x20; + const MASK_CONSTRUCTOR = 0x00000001; + const MASK_CONNECTED = 0x00000002; + const MASK_LOGIN_REQ = 0x00000004; + const MASK_LOGIN = 0x00000008; + const MASK_SHELL = 0x00000010; + const MASK_DISCONNECT = 0x00000020; + /* * Channel constants * @@ -119,12 +121,12 @@ class SSH2 * @see \phpseclib3\Net\SSH2::send_channel_packet() * @see \phpseclib3\Net\SSH2::get_channel_packet() */ - const CHANNEL_EXEC = 1; - // PuTTy uses 0x100 - const CHANNEL_SHELL = 2; - const CHANNEL_SUBSYSTEM = 3; + const CHANNEL_EXEC = 1; // PuTTy uses 0x100 + const CHANNEL_SHELL = 2; + const CHANNEL_SUBSYSTEM = 3; const CHANNEL_AGENT_FORWARD = 4; - const CHANNEL_KEEP_ALIVE = 5; + const CHANNEL_KEEP_ALIVE = 5; + /** * Returns the message numbers * @@ -158,8 +160,8 @@ class SSH2 * * @see \phpseclib3\Net\SSH2::getLog() */ - const LOG_MAX_SIZE = 1048576; - // 1024 * 1024 + const LOG_MAX_SIZE = 1048576; // 1024 * 1024 + /** * Returns when a string matching $expect exactly is found * @@ -181,18 +183,21 @@ class SSH2 * @see \phpseclib3\Net\SSH2::read() */ const READ_NEXT = 3; + /** * The SSH identifier * * @var string */ private $identifier; + /** * The Socket Object * * @var resource|closed-resource|null */ public $fsock; + /** * Execution Bitmap * @@ -202,6 +207,7 @@ class SSH2 * @var int */ protected $bitmap = 0; + /** * Error information * @@ -210,27 +216,31 @@ class SSH2 * @var array */ private $errors = []; + /** * Server Identifier * * @see self::getServerIdentification() * @var string|false */ - protected $server_identifier = \false; + protected $server_identifier = false; + /** * Key Exchange Algorithms * * @see self::getKexAlgorithims() * @var array|false */ - private $kex_algorithms = \false; + private $kex_algorithms = false; + /** * Key Exchange Algorithm * * @see self::getMethodsNegotiated() * @var string|false */ - private $kex_algorithm = \false; + private $kex_algorithm = false; + /** * Minimum Diffie-Hellman Group Bit Size in RFC 4419 Key Exchange Methods * @@ -238,6 +248,7 @@ class SSH2 * @var int */ private $kex_dh_group_size_min = 1536; + /** * Preferred Diffie-Hellman Group Bit Size in RFC 4419 Key Exchange Methods * @@ -245,6 +256,7 @@ class SSH2 * @var int */ private $kex_dh_group_size_preferred = 2048; + /** * Maximum Diffie-Hellman Group Bit Size in RFC 4419 Key Exchange Methods * @@ -252,13 +264,15 @@ class SSH2 * @var int */ private $kex_dh_group_size_max = 4096; + /** * Server Host Key Algorithms * * @see self::getServerHostKeyAlgorithms() * @var array|false */ - private $server_host_key_algorithms = \false; + private $server_host_key_algorithms = false; + /** * Supported Private Key Algorithms * @@ -269,63 +283,72 @@ class SSH2 * @see self::privatekey_login() * @var array|false */ - private $supported_private_key_algorithms = \false; + private $supported_private_key_algorithms = false; + /** * Encryption Algorithms: Client to Server * * @see self::getEncryptionAlgorithmsClient2Server() * @var array|false */ - private $encryption_algorithms_client_to_server = \false; + private $encryption_algorithms_client_to_server = false; + /** * Encryption Algorithms: Server to Client * * @see self::getEncryptionAlgorithmsServer2Client() * @var array|false */ - private $encryption_algorithms_server_to_client = \false; + private $encryption_algorithms_server_to_client = false; + /** * MAC Algorithms: Client to Server * * @see self::getMACAlgorithmsClient2Server() * @var array|false */ - private $mac_algorithms_client_to_server = \false; + private $mac_algorithms_client_to_server = false; + /** * MAC Algorithms: Server to Client * * @see self::getMACAlgorithmsServer2Client() * @var array|false */ - private $mac_algorithms_server_to_client = \false; + private $mac_algorithms_server_to_client = false; + /** * Compression Algorithms: Client to Server * * @see self::getCompressionAlgorithmsClient2Server() * @var array|false */ - private $compression_algorithms_client_to_server = \false; + private $compression_algorithms_client_to_server = false; + /** * Compression Algorithms: Server to Client * * @see self::getCompressionAlgorithmsServer2Client() * @var array|false */ - private $compression_algorithms_server_to_client = \false; + private $compression_algorithms_server_to_client = false; + /** * Languages: Server to Client * * @see self::getLanguagesServer2Client() * @var array|false */ - private $languages_server_to_client = \false; + private $languages_server_to_client = false; + /** * Languages: Client to Server * * @see self::getLanguagesClient2Server() * @var array|false */ - private $languages_client_to_server = \false; + private $languages_client_to_server = false; + /** * Preferred Algorithms * @@ -333,6 +356,7 @@ class SSH2 * @var array */ private $preferred = []; + /** * Block Size for Server to Client Encryption * @@ -348,6 +372,7 @@ class SSH2 * @var int */ private $encrypt_block_size = 8; + /** * Block Size for Client to Server Encryption * @@ -356,19 +381,22 @@ class SSH2 * @var int */ private $decrypt_block_size = 8; + /** * Server to Client Encryption Object * * @see self::_get_binary_packet() * @var SymmetricKey|false */ - private $decrypt = \false; + private $decrypt = false; + /** * Decryption Algorithm Name * * @var string|null */ private $decryptName; + /** * Decryption Invocation Counter * @@ -377,6 +405,7 @@ class SSH2 * @var string|null */ private $decryptInvocationCounter; + /** * Fixed Part of Nonce * @@ -385,26 +414,30 @@ class SSH2 * @var string|null */ private $decryptFixedPart; + /** * Server to Client Length Encryption Object * * @see self::_get_binary_packet() * @var object */ - private $lengthDecrypt = \false; + private $lengthDecrypt = false; + /** * Client to Server Encryption Object * * @see self::_send_binary_packet() * @var SymmetricKey|false */ - private $encrypt = \false; + private $encrypt = false; + /** * Encryption Algorithm Name * * @var string|null */ private $encryptName; + /** * Encryption Invocation Counter * @@ -413,6 +446,7 @@ class SSH2 * @var string|null */ private $encryptInvocationCounter; + /** * Fixed Part of Nonce * @@ -421,51 +455,59 @@ class SSH2 * @var string|null */ private $encryptFixedPart; + /** * Client to Server Length Encryption Object * * @see self::_send_binary_packet() * @var object */ - private $lengthEncrypt = \false; + private $lengthEncrypt = false; + /** * Client to Server HMAC Object * * @see self::_send_binary_packet() * @var object */ - private $hmac_create = \false; + private $hmac_create = false; + /** * Client to Server HMAC Name * * @var string|false */ private $hmac_create_name; + /** * Client to Server ETM * * @var int|false */ private $hmac_create_etm; + /** * Server to Client HMAC Object * * @see self::_get_binary_packet() * @var object */ - private $hmac_check = \false; + private $hmac_check = false; + /** * Server to Client HMAC Name * * @var string|false */ private $hmac_check_name; + /** * Server to Client ETM * * @var int|false */ private $hmac_check_etm; + /** * Size of server to client HMAC * @@ -476,7 +518,8 @@ class SSH2 * @see self::_get_binary_packet() * @var int */ - private $hmac_size = \false; + private $hmac_size = false; + /** * Server Public Host Key * @@ -484,6 +527,7 @@ class SSH2 * @var string */ private $server_public_host_key; + /** * Session identifier * @@ -496,7 +540,8 @@ class SSH2 * @see self::_key_exchange() * @var string */ - private $session_id = \false; + private $session_id = false; + /** * Exchange hash * @@ -505,7 +550,8 @@ class SSH2 * @see self::_key_exchange() * @var string */ - private $exchange_hash = \false; + private $exchange_hash = false; + /** * Message Numbers * @@ -514,6 +560,7 @@ class SSH2 * @access private */ private static $message_numbers = []; + /** * Disconnection Message 'reason codes' defined in RFC4253 * @@ -522,6 +569,7 @@ class SSH2 * @access private */ private static $disconnect_reasons = []; + /** * SSH_MSG_CHANNEL_OPEN_FAILURE 'reason codes', defined in RFC4254 * @@ -530,6 +578,7 @@ class SSH2 * @access private */ private static $channel_open_failure_reasons = []; + /** * Terminal Modes * @@ -539,6 +588,7 @@ class SSH2 * @access private */ private static $terminal_modes = []; + /** * SSH_MSG_CHANNEL_EXTENDED_DATA's data_type_codes * @@ -548,6 +598,7 @@ class SSH2 * @access private */ private static $channel_extended_data_type_codes = []; + /** * Send Sequence Number * @@ -557,6 +608,7 @@ class SSH2 * @var int */ private $send_seq_no = 0; + /** * Get Sequence Number * @@ -566,6 +618,7 @@ class SSH2 * @var int */ private $get_seq_no = 0; + /** * Server Channels * @@ -576,6 +629,7 @@ class SSH2 * @var array */ protected $server_channels = []; + /** * Channel Read Buffers * @@ -587,6 +641,7 @@ class SSH2 * @var array */ private $channel_buffers = []; + /** * Channel Write Buffers * @@ -597,6 +652,7 @@ class SSH2 * @var array */ private $channel_buffers_write = []; + /** * Channel Status * @@ -606,6 +662,7 @@ class SSH2 * @var array */ protected $channel_status = []; + /** * The identifier of the interactive channel which was opened most recently * @@ -613,6 +670,7 @@ class SSH2 * @var int */ private $channel_id_last_interactive = 0; + /** * Packet Size * @@ -622,6 +680,7 @@ class SSH2 * @var array */ private $packet_size_client_to_server = []; + /** * Message Number Log * @@ -629,6 +688,7 @@ class SSH2 * @var array */ private $message_number_log = []; + /** * Message Log * @@ -636,6 +696,7 @@ class SSH2 * @var array */ private $message_log = []; + /** * The Window Size * @@ -645,7 +706,8 @@ class SSH2 * @see self::send_channel_packet() * @see self::exec() */ - protected $window_size = 0x7fffffff; + protected $window_size = 0x7FFFFFFF; + /** * What we resize the window to * @@ -658,6 +720,7 @@ class SSH2 * @see self::exec() */ private $window_resize = 0x40000000; + /** * Window size, server to client * @@ -667,6 +730,7 @@ class SSH2 * @var array */ protected $window_size_server_to_client = []; + /** * Window size, client to server * @@ -676,6 +740,7 @@ class SSH2 * @var array */ private $window_size_client_to_server = []; + /** * Server signature * @@ -685,6 +750,7 @@ class SSH2 * @var string */ private $signature = ''; + /** * Server signature format * @@ -694,6 +760,7 @@ class SSH2 * @var string */ private $signature_format = ''; + /** * Interactive Buffer * @@ -701,6 +768,7 @@ class SSH2 * @var string */ private $interactiveBuffer = ''; + /** * Current log size * @@ -711,24 +779,28 @@ class SSH2 * @var int */ private $log_size; + /** * Timeout * * @see self::setTimeout() */ protected $timeout; + /** * Current Timeout * * @see self::get_channel_packet() */ protected $curTimeout; + /** * Keep Alive Interval * * @see self::setKeepAlive() */ private $keepAlive; + /** * Real-time log file pointer * @@ -736,6 +808,7 @@ class SSH2 * @var resource|closed-resource */ private $realtime_log_file; + /** * Real-time log file size * @@ -743,13 +816,15 @@ class SSH2 * @var int */ private $realtime_log_size; + /** * Has the signature been validated? * * @see self::getServerPublicHostKey() * @var bool */ - private $signature_validated = \false; + private $signature_validated = false; + /** * Real-time log file wrap boolean * @@ -757,37 +832,43 @@ class SSH2 * @var bool */ private $realtime_log_wrap; + /** * Flag to suppress stderr from output * * @see self::enableQuietMode() */ - private $quiet_mode = \false; + private $quiet_mode = false; + /** * Time of last read/write network activity * * @var float */ private $last_packet = null; + /** * Exit status returned from ssh if any * * @var int */ private $exit_status; + /** * Flag to request a PTY when using exec() * * @var bool * @see self::enablePTY() */ - private $request_pty = \false; + private $request_pty = false; + /** * Contents of stdError * * @var string */ private $stdErrorLog; + /** * The Last Interactive Response * @@ -795,6 +876,7 @@ class SSH2 * @var string */ private $last_interactive_response = ''; + /** * Keyboard Interactive Request / Responses * @@ -802,6 +884,7 @@ class SSH2 * @var array */ private $keyboard_requests_responses = []; + /** * Banner Message * @@ -813,13 +896,15 @@ class SSH2 * @var string */ private $banner_message = ''; + /** * Did read() timeout or return normally? * * @see self::isTimeout() * @var bool */ - protected $is_timeout = \false; + protected $is_timeout = false; + /** * Log Boundary * @@ -827,6 +912,7 @@ class SSH2 * @var string */ private $log_boundary = ':'; + /** * Log Long Width * @@ -834,6 +920,7 @@ class SSH2 * @var int */ private $log_long_width = 65; + /** * Log Short Width * @@ -841,6 +928,7 @@ class SSH2 * @var int */ private $log_short_width = 16; + /** * Hostname * @@ -849,6 +937,7 @@ class SSH2 * @var string */ private $host; + /** * Port Number * @@ -857,6 +946,7 @@ class SSH2 * @var int */ private $port; + /** * Number of columns for terminal window size * @@ -866,6 +956,7 @@ class SSH2 * @var int */ private $windowColumns = 80; + /** * Number of columns for terminal window size * @@ -875,6 +966,7 @@ class SSH2 * @var int */ private $windowRows = 24; + /** * Crypto Engine * @@ -882,13 +974,15 @@ class SSH2 * @see self::_key_exchange() * @var int */ - private static $crypto_engine = \false; + private static $crypto_engine = false; + /** * A System_SSH_Agent for use in the SSH2 Agent Forwarding scenario * * @var Agent */ private $agent; + /** * Connection storage to replicates ssh2 extension functionality: * {@link http://php.net/manual/en/wrappers.ssh2.php#refsect1-wrappers.ssh2-examples} @@ -896,54 +990,63 @@ class SSH2 * @var array> */ private static $connections; + /** * Send the identification string first? * * @var bool */ - private $send_id_string_first = \true; + private $send_id_string_first = true; + /** * Send the key exchange initiation packet first? * * @var bool */ - private $send_kex_first = \true; + private $send_kex_first = true; + /** * Some versions of OpenSSH incorrectly calculate the key size * * @var bool */ - private $bad_key_size_fix = \false; + private $bad_key_size_fix = false; + /** * Should we try to re-connect to re-establish keys? * * @var bool */ - private $login_credentials_finalized = \false; + private $login_credentials_finalized = false; + /** * Binary Packet Buffer * * @var object|null */ private $binary_packet_buffer = null; + /** * Preferred Signature Format * * @var string|false */ - protected $preferred_signature_format = \false; + protected $preferred_signature_format = false; + /** * Authentication Credentials * * @var array */ protected $auth = []; + /** * Terminal * * @var string */ private $term = 'vt100'; + /** * The authentication methods that may productively continue authentication. * @@ -951,54 +1054,63 @@ class SSH2 * @var array|null */ private $auth_methods_to_continue = null; + /** * Compression method * * @var int */ private $compress = self::NET_SSH2_COMPRESSION_NONE; + /** * Decompression method * * @var int */ private $decompress = self::NET_SSH2_COMPRESSION_NONE; + /** * Compression context * * @var resource|false|null */ private $compress_context; + /** * Decompression context * * @var resource|object */ private $decompress_context; + /** * Regenerate Compression Context * * @var bool */ - private $regenerate_compression_context = \false; + private $regenerate_compression_context = false; + /** * Regenerate Decompression Context * * @var bool */ - private $regenerate_decompression_context = \false; + private $regenerate_decompression_context = false; + /** * Smart multi-factor authentication flag * * @var bool */ - private $smartMFA = \true; + private $smartMFA = true; + /** * How many channels are currently opened * * @var int */ private $channelCount = 0; + /** * Does the server support multiple channels? If not then error out * when multiple channels are attempted to be opened @@ -1006,6 +1118,7 @@ class SSH2 * @var bool */ private $errorOnMultipleChannels; + /** * Bytes Transferred Since Last Key Exchange * @@ -1014,19 +1127,22 @@ class SSH2 * @var int */ private $bytesTransferredSinceLastKEX = 0; + /** * After how many transferred byte should phpseclib initiate a key re-exchange? * * @var int */ private $doKeyReexchangeAfterXBytes = 1024 * 1024 * 1024; + /** * Has a key re-exchange been initialized? * * @var bool * @access private */ - private $keyExchangeInProgress = \false; + private $keyExchangeInProgress = false; + /** * KEX Buffer * @@ -1040,6 +1156,7 @@ class SSH2 * @access private */ private $kex_buffer = []; + /** * Strict KEX Flag * @@ -1051,7 +1168,8 @@ class SSH2 * @var array * @access private */ - private $strict_kex_flag = \false; + private $strict_kex_flag = false; + /** * Default Constructor. * @@ -1074,8 +1192,7 @@ public function __construct($host, $port = 22, $timeout = 10) 4 => 'NET_SSH2_MSG_DEBUG', 5 => 'NET_SSH2_MSG_SERVICE_REQUEST', 6 => 'NET_SSH2_MSG_SERVICE_ACCEPT', - 7 => 'NET_SSH2_MSG_EXT_INFO', - // RFC 8308 + 7 => 'NET_SSH2_MSG_EXT_INFO', // RFC 8308 20 => 'NET_SSH2_MSG_KEXINIT', 21 => 'NET_SSH2_MSG_NEWKEYS', 30 => 'NET_SSH2_MSG_KEXDH_INIT', @@ -1084,6 +1201,7 @@ public function __construct($host, $port = 22, $timeout = 10) 51 => 'NET_SSH2_MSG_USERAUTH_FAILURE', 52 => 'NET_SSH2_MSG_USERAUTH_SUCCESS', 53 => 'NET_SSH2_MSG_USERAUTH_BANNER', + 80 => 'NET_SSH2_MSG_GLOBAL_REQUEST', 81 => 'NET_SSH2_MSG_REQUEST_SUCCESS', 82 => 'NET_SSH2_MSG_REQUEST_FAILURE', @@ -1097,12 +1215,35 @@ public function __construct($host, $port = 22, $timeout = 10) 97 => 'NET_SSH2_MSG_CHANNEL_CLOSE', 98 => 'NET_SSH2_MSG_CHANNEL_REQUEST', 99 => 'NET_SSH2_MSG_CHANNEL_SUCCESS', - 100 => 'NET_SSH2_MSG_CHANNEL_FAILURE', + 100 => 'NET_SSH2_MSG_CHANNEL_FAILURE' ]; - self::$disconnect_reasons = [1 => 'NET_SSH2_DISCONNECT_HOST_NOT_ALLOWED_TO_CONNECT', 2 => 'NET_SSH2_DISCONNECT_PROTOCOL_ERROR', 3 => 'NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED', 4 => 'NET_SSH2_DISCONNECT_RESERVED', 5 => 'NET_SSH2_DISCONNECT_MAC_ERROR', 6 => 'NET_SSH2_DISCONNECT_COMPRESSION_ERROR', 7 => 'NET_SSH2_DISCONNECT_SERVICE_NOT_AVAILABLE', 8 => 'NET_SSH2_DISCONNECT_PROTOCOL_VERSION_NOT_SUPPORTED', 9 => 'NET_SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE', 10 => 'NET_SSH2_DISCONNECT_CONNECTION_LOST', 11 => 'NET_SSH2_DISCONNECT_BY_APPLICATION', 12 => 'NET_SSH2_DISCONNECT_TOO_MANY_CONNECTIONS', 13 => 'NET_SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER', 14 => 'NET_SSH2_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE', 15 => 'NET_SSH2_DISCONNECT_ILLEGAL_USER_NAME']; - self::$channel_open_failure_reasons = [1 => 'NET_SSH2_OPEN_ADMINISTRATIVELY_PROHIBITED']; - self::$terminal_modes = [0 => 'NET_SSH2_TTY_OP_END']; - self::$channel_extended_data_type_codes = [1 => 'NET_SSH2_EXTENDED_DATA_STDERR']; + self::$disconnect_reasons = [ + 1 => 'NET_SSH2_DISCONNECT_HOST_NOT_ALLOWED_TO_CONNECT', + 2 => 'NET_SSH2_DISCONNECT_PROTOCOL_ERROR', + 3 => 'NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED', + 4 => 'NET_SSH2_DISCONNECT_RESERVED', + 5 => 'NET_SSH2_DISCONNECT_MAC_ERROR', + 6 => 'NET_SSH2_DISCONNECT_COMPRESSION_ERROR', + 7 => 'NET_SSH2_DISCONNECT_SERVICE_NOT_AVAILABLE', + 8 => 'NET_SSH2_DISCONNECT_PROTOCOL_VERSION_NOT_SUPPORTED', + 9 => 'NET_SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE', + 10 => 'NET_SSH2_DISCONNECT_CONNECTION_LOST', + 11 => 'NET_SSH2_DISCONNECT_BY_APPLICATION', + 12 => 'NET_SSH2_DISCONNECT_TOO_MANY_CONNECTIONS', + 13 => 'NET_SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER', + 14 => 'NET_SSH2_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE', + 15 => 'NET_SSH2_DISCONNECT_ILLEGAL_USER_NAME' + ]; + self::$channel_open_failure_reasons = [ + 1 => 'NET_SSH2_OPEN_ADMINISTRATIVELY_PROHIBITED' + ]; + self::$terminal_modes = [ + 0 => 'NET_SSH2_TTY_OP_END' + ]; + self::$channel_extended_data_type_codes = [ + 1 => 'NET_SSH2_EXTENDED_DATA_STDERR' + ]; + self::define_array( self::$message_numbers, self::$disconnect_reasons, @@ -1111,28 +1252,41 @@ public function __construct($host, $port = 22, $timeout = 10) self::$channel_extended_data_type_codes, [60 => 'NET_SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ'], [60 => 'NET_SSH2_MSG_USERAUTH_PK_OK'], - [60 => 'NET_SSH2_MSG_USERAUTH_INFO_REQUEST', 61 => 'NET_SSH2_MSG_USERAUTH_INFO_RESPONSE'], + [60 => 'NET_SSH2_MSG_USERAUTH_INFO_REQUEST', + 61 => 'NET_SSH2_MSG_USERAUTH_INFO_RESPONSE'], // RFC 4419 - diffie-hellman-group-exchange-sha{1,256} - [30 => 'NET_SSH2_MSG_KEXDH_GEX_REQUEST_OLD', 31 => 'NET_SSH2_MSG_KEXDH_GEX_GROUP', 32 => 'NET_SSH2_MSG_KEXDH_GEX_INIT', 33 => 'NET_SSH2_MSG_KEXDH_GEX_REPLY', 34 => 'NET_SSH2_MSG_KEXDH_GEX_REQUEST'], + [30 => 'NET_SSH2_MSG_KEXDH_GEX_REQUEST_OLD', + 31 => 'NET_SSH2_MSG_KEXDH_GEX_GROUP', + 32 => 'NET_SSH2_MSG_KEXDH_GEX_INIT', + 33 => 'NET_SSH2_MSG_KEXDH_GEX_REPLY', + 34 => 'NET_SSH2_MSG_KEXDH_GEX_REQUEST'], // RFC 5656 - Elliptic Curves (for curve25519-sha256@libssh.org) - [30 => 'NET_SSH2_MSG_KEX_ECDH_INIT', 31 => 'NET_SSH2_MSG_KEX_ECDH_REPLY'] + [30 => 'NET_SSH2_MSG_KEX_ECDH_INIT', + 31 => 'NET_SSH2_MSG_KEX_ECDH_REPLY'] ); } + /** * Typehint is required due to a bug in Psalm: https://github.com/vimeo/psalm/issues/7508 * @var \WeakReference|SSH2 */ - self::$connections[$this->getResourceId()] = \class_exists('WeakReference') ? \WeakReference::create($this) : $this; + self::$connections[$this->getResourceId()] = class_exists('WeakReference') + ? \WeakReference::create($this) + : $this; + $this->timeout = $timeout; - if (\is_resource($host)) { + + if (is_resource($host)) { $this->fsock = $host; return; } + if (Strings::is_stringable($host)) { $this->host = $host; $this->port = $port; } } + /** * Set Crypto Engine Mode * @@ -1145,6 +1299,7 @@ public static function setCryptoEngine($engine) { self::$crypto_engine = $engine; } + /** * Send Identification String First * @@ -1155,8 +1310,9 @@ public static function setCryptoEngine($engine) */ public function sendIdentificationStringFirst() { - $this->send_id_string_first = \true; + $this->send_id_string_first = true; } + /** * Send Identification String Last * @@ -1167,8 +1323,9 @@ public function sendIdentificationStringFirst() */ public function sendIdentificationStringLast() { - $this->send_id_string_first = \false; + $this->send_id_string_first = false; } + /** * Send SSH_MSG_KEXINIT First * @@ -1179,8 +1336,9 @@ public function sendIdentificationStringLast() */ public function sendKEXINITFirst() { - $this->send_kex_first = \true; + $this->send_kex_first = true; } + /** * Send SSH_MSG_KEXINIT Last * @@ -1191,8 +1349,9 @@ public function sendKEXINITFirst() */ public function sendKEXINITLast() { - $this->send_kex_first = \false; + $this->send_kex_first = false; } + /** * stream_select wrapper * @@ -1204,20 +1363,21 @@ public function sendKEXINITLast() private static function stream_select(&$read, &$write, &$except, $seconds, $microseconds = null) { $remaining = $seconds + $microseconds / 1000000; - $start = \microtime(\true); - while (\true) { - $result = @\stream_select($read, $write, $except, $seconds, $microseconds); - if ($result !== \false) { + $start = microtime(true); + while (true) { + $result = @stream_select($read, $write, $except, $seconds, $microseconds); + if ($result !== false) { return $result; } - $elapsed = \microtime(\true) - $start; - $seconds = (int) ($remaining - \floor($elapsed)); + $elapsed = microtime(true) - $start; + $seconds = (int) ($remaining - floor($elapsed)); $microseconds = (int) (1000000 * ($remaining - $seconds)); if ($elapsed >= $remaining) { - return \false; + return false; } } } + /** * Connect to an SSHv2 server * @@ -1229,131 +1389,157 @@ private function connect() if ($this->bitmap & self::MASK_CONSTRUCTOR) { return; } + $this->bitmap |= self::MASK_CONSTRUCTOR; + $this->curTimeout = $this->timeout; - if (!\is_resource($this->fsock)) { - $start = \microtime(\true); + + if (!is_resource($this->fsock)) { + $start = microtime(true); // with stream_select a timeout of 0 means that no timeout takes place; // with fsockopen a timeout of 0 means that you instantly timeout // to resolve this incompatibility a timeout of 100,000 will be used for fsockopen if timeout is 0 - $this->fsock = @\fsockopen($this->host, $this->port, $errno, $errstr, $this->curTimeout == 0 ? 100000 : $this->curTimeout); + $this->fsock = @fsockopen($this->host, $this->port, $errno, $errstr, $this->curTimeout == 0 ? 100000 : $this->curTimeout); if (!$this->fsock) { $host = $this->host . ':' . $this->port; - throw new UnableToConnectException(\rtrim("Cannot connect to {$host}. Error {$errno}. {$errstr}")); + throw new UnableToConnectException(rtrim("Cannot connect to $host. Error $errno. $errstr")); } - $elapsed = \microtime(\true) - $start; + $elapsed = microtime(true) - $start; + if ($this->curTimeout) { $this->curTimeout -= $elapsed; if ($this->curTimeout < 0) { throw new \RuntimeException('Connection timed out whilst attempting to open socket connection'); } } - if (\defined('NET_SSH2_LOGGING')) { - $this->append_log('(fsockopen took ' . \round($elapsed, 4) . 's)', ''); + + if (defined('NET_SSH2_LOGGING')) { + $this->append_log('(fsockopen took ' . round($elapsed, 4) . 's)', ''); } } + $this->identifier = $this->generate_identifier(); + if ($this->send_id_string_first) { - $start = \microtime(\true); - \fputs($this->fsock, $this->identifier . "\r\n"); - $elapsed = \round(\microtime(\true) - $start, 4); - if (\defined('NET_SSH2_LOGGING')) { - $this->append_log("-> (network: {$elapsed})", $this->identifier . "\r\n"); + $start = microtime(true); + fputs($this->fsock, $this->identifier . "\r\n"); + $elapsed = round(microtime(true) - $start, 4); + if (defined('NET_SSH2_LOGGING')) { + $this->append_log("-> (network: $elapsed)", $this->identifier . "\r\n"); } } + /* According to the SSH2 specs, - - "The server MAY send other lines of data before sending the version - string. Each line SHOULD be terminated by a Carriage Return and Line - Feed. Such lines MUST NOT begin with "SSH-", and SHOULD be encoded - in ISO-10646 UTF-8 [RFC3629] (language is not specified). Clients - MUST be able to process such lines." */ + + "The server MAY send other lines of data before sending the version + string. Each line SHOULD be terminated by a Carriage Return and Line + Feed. Such lines MUST NOT begin with "SSH-", and SHOULD be encoded + in ISO-10646 UTF-8 [RFC3629] (language is not specified). Clients + MUST be able to process such lines." */ $data = ''; $totalElapsed = 0; - while (!\feof($this->fsock) && !\preg_match('#(.*)^(SSH-(\\d\\.\\d+).*)#ms', $data, $matches)) { + while (!feof($this->fsock) && !preg_match('#(.*)^(SSH-(\d\.\d+).*)#ms', $data, $matches)) { $line = ''; - while (\true) { + while (true) { if ($this->curTimeout) { if ($this->curTimeout < 0) { throw new \RuntimeException('Connection timed out whilst receiving server identification string'); } $read = [$this->fsock]; $write = $except = null; - $start = \microtime(\true); - $sec = (int) \floor($this->curTimeout); + $start = microtime(true); + $sec = (int) floor($this->curTimeout); $usec = (int) (1000000 * ($this->curTimeout - $sec)); - if (static::stream_select($read, $write, $except, $sec, $usec) === \false) { + if (static::stream_select($read, $write, $except, $sec, $usec) === false) { throw new \RuntimeException('Connection timed out whilst receiving server identification string'); } - $elapsed = \microtime(\true) - $start; + $elapsed = microtime(true) - $start; $totalElapsed += $elapsed; $this->curTimeout -= $elapsed; } - $temp = \stream_get_line($this->fsock, 255, "\n"); - if ($temp === \false) { + + $temp = stream_get_line($this->fsock, 255, "\n"); + if ($temp === false) { throw new \RuntimeException('Error reading SSH identification string; are you sure you\'re connecting to an SSH server?'); } + $line .= $temp; - if (\strlen($temp) == 255) { + if (strlen($temp) == 255) { continue; } + $line .= "\n"; + break; } + $data .= $line; } - if (\defined('NET_SSH2_LOGGING')) { - $this->append_log('<- (network: ' . \round($totalElapsed, 4) . ')', $data); + + if (defined('NET_SSH2_LOGGING')) { + $this->append_log('<- (network: ' . round($totalElapsed, 4) . ')', $data); } - if (\feof($this->fsock)) { + + if (feof($this->fsock)) { $this->bitmap = 0; throw new ConnectionClosedException('Connection closed by server; are you sure you\'re connected to an SSH server?'); } + $extra = $matches[1]; + // earlier the SSH specs were quoted. // "The server MAY send other lines of data before sending the version string." they said. // the implication of this is that the lines of data before the server string are *not* a part of it // getting this right is important because the correct server identifier needs to be fed into the // exchange hash for the shared keys to be calculated correctly - $data = \explode("\r\n", \trim($data, "\r\n")); - $this->server_identifier = $data[\count($data) - 1]; - if (\strlen($extra)) { + $data = explode("\r\n", trim($data, "\r\n")); + $this->server_identifier = $data[count($data) - 1]; + if (strlen($extra)) { $this->errors[] = $data; } - if (\version_compare($matches[3], '1.99', '<')) { + + if (version_compare($matches[3], '1.99', '<')) { $this->bitmap = 0; - throw new UnableToConnectException("Cannot connect to SSH {$matches[3]} servers"); + throw new UnableToConnectException("Cannot connect to SSH $matches[3] servers"); } + // Ubuntu's OpenSSH from 5.8 to 6.9 didn't work with multiple channels. see // https://bugs.launchpad.net/ubuntu/+source/openssh/+bug/1334916 for more info. // https://lists.ubuntu.com/archives/oneiric-changes/2011-July/005772.html discusses // when consolekit was incorporated. // https://marc.info/?l=openssh-unix-dev&m=163409903417589&w=2 discusses some of the // issues with how Ubuntu incorporated consolekit - $pattern = '#^SSH-2\\.0-OpenSSH_([\\d.]+)[^ ]* Ubuntu-.*$#'; - $match = \preg_match($pattern, $this->server_identifier, $matches); - $match = $match && \version_compare('5.8', $matches[1], '<='); - $match = $match && \version_compare('6.9', $matches[1], '>='); + $pattern = '#^SSH-2\.0-OpenSSH_([\d.]+)[^ ]* Ubuntu-.*$#'; + $match = preg_match($pattern, $this->server_identifier, $matches); + $match = $match && version_compare('5.8', $matches[1], '<='); + $match = $match && version_compare('6.9', $matches[1], '>='); $this->errorOnMultipleChannels = $match; + if (!$this->send_id_string_first) { - $start = \microtime(\true); - \fputs($this->fsock, $this->identifier . "\r\n"); - $elapsed = \round(\microtime(\true) - $start, 4); - if (\defined('NET_SSH2_LOGGING')) { - $this->append_log("-> (network: {$elapsed})", $this->identifier . "\r\n"); + $start = microtime(true); + fputs($this->fsock, $this->identifier . "\r\n"); + $elapsed = round(microtime(true) - $start, 4); + if (defined('NET_SSH2_LOGGING')) { + $this->append_log("-> (network: $elapsed)", $this->identifier . "\r\n"); } } - $this->last_packet = \microtime(\true); + + $this->last_packet = microtime(true); + if (!$this->send_kex_first) { $response = $this->get_binary_packet_or_close(NET_SSH2_MSG_KEXINIT); $this->key_exchange($response); } + if ($this->send_kex_first) { $this->key_exchange(); } + $this->bitmap |= self::MASK_CONNECTED; - return \true; + + return true; } + /** * Generates the SSH identifier * @@ -1364,25 +1550,31 @@ private function connect() private function generate_identifier() { $identifier = 'SSH-2.0-phpseclib_3.0'; + $ext = []; - if (\extension_loaded('sodium')) { + if (extension_loaded('sodium')) { $ext[] = 'libsodium'; } - if (\extension_loaded('openssl')) { + + if (extension_loaded('openssl')) { $ext[] = 'openssl'; - } elseif (\extension_loaded('mcrypt')) { + } elseif (extension_loaded('mcrypt')) { $ext[] = 'mcrypt'; } - if (\extension_loaded('gmp')) { + + if (extension_loaded('gmp')) { $ext[] = 'gmp'; - } elseif (\extension_loaded('bcmath')) { + } elseif (extension_loaded('bcmath')) { $ext[] = 'bcmath'; } + if (!empty($ext)) { - $identifier .= ' (' . \implode(', ', $ext) . ')'; + $identifier .= ' (' . implode(', ', $ext) . ')'; } + return $identifier; } + /** * Key Exchange * @@ -1392,44 +1584,78 @@ private function generate_identifier() * @throws \RuntimeException on other errors * @throws NoSupportedAlgorithmsException when none of the algorithms phpseclib has loaded are compatible */ - private function key_exchange($kexinit_payload_server = \false) + private function key_exchange($kexinit_payload_server = false) { $this->bytesTransferredSinceLastKEX = 0; + $preferred = $this->preferred; // for the initial key exchange $send_kex is true (no key re-exchange has been started) // for phpseclib initiated key exchanges $send_kex is false $send_kex = !$this->keyExchangeInProgress; - $this->keyExchangeInProgress = \true; - $kex_algorithms = isset($preferred['kex']) ? $preferred['kex'] : SSH2::getSupportedKEXAlgorithms(); - $server_host_key_algorithms = isset($preferred['hostkey']) ? $preferred['hostkey'] : SSH2::getSupportedHostKeyAlgorithms(); - $s2c_encryption_algorithms = isset($preferred['server_to_client']['crypt']) ? $preferred['server_to_client']['crypt'] : SSH2::getSupportedEncryptionAlgorithms(); - $c2s_encryption_algorithms = isset($preferred['client_to_server']['crypt']) ? $preferred['client_to_server']['crypt'] : SSH2::getSupportedEncryptionAlgorithms(); - $s2c_mac_algorithms = isset($preferred['server_to_client']['mac']) ? $preferred['server_to_client']['mac'] : SSH2::getSupportedMACAlgorithms(); - $c2s_mac_algorithms = isset($preferred['client_to_server']['mac']) ? $preferred['client_to_server']['mac'] : SSH2::getSupportedMACAlgorithms(); - $s2c_compression_algorithms = isset($preferred['server_to_client']['comp']) ? $preferred['server_to_client']['comp'] : SSH2::getSupportedCompressionAlgorithms(); - $c2s_compression_algorithms = isset($preferred['client_to_server']['comp']) ? $preferred['client_to_server']['comp'] : SSH2::getSupportedCompressionAlgorithms(); - $kex_algorithms = \array_merge($kex_algorithms, ['ext-info-c', 'kex-strict-c-v00@openssh.com']); + $this->keyExchangeInProgress = true; + + $kex_algorithms = isset($preferred['kex']) ? + $preferred['kex'] : + SSH2::getSupportedKEXAlgorithms(); + $server_host_key_algorithms = isset($preferred['hostkey']) ? + $preferred['hostkey'] : + SSH2::getSupportedHostKeyAlgorithms(); + $s2c_encryption_algorithms = isset($preferred['server_to_client']['crypt']) ? + $preferred['server_to_client']['crypt'] : + SSH2::getSupportedEncryptionAlgorithms(); + $c2s_encryption_algorithms = isset($preferred['client_to_server']['crypt']) ? + $preferred['client_to_server']['crypt'] : + SSH2::getSupportedEncryptionAlgorithms(); + $s2c_mac_algorithms = isset($preferred['server_to_client']['mac']) ? + $preferred['server_to_client']['mac'] : + SSH2::getSupportedMACAlgorithms(); + $c2s_mac_algorithms = isset($preferred['client_to_server']['mac']) ? + $preferred['client_to_server']['mac'] : + SSH2::getSupportedMACAlgorithms(); + $s2c_compression_algorithms = isset($preferred['server_to_client']['comp']) ? + $preferred['server_to_client']['comp'] : + SSH2::getSupportedCompressionAlgorithms(); + $c2s_compression_algorithms = isset($preferred['client_to_server']['comp']) ? + $preferred['client_to_server']['comp'] : + SSH2::getSupportedCompressionAlgorithms(); + + $kex_algorithms = array_merge($kex_algorithms, ['ext-info-c', 'kex-strict-c-v00@openssh.com']); + // some SSH servers have buggy implementations of some of the above algorithms - switch (\true) { + switch (true) { case $this->server_identifier == 'SSH-2.0-SSHD': - case \substr($this->server_identifier, 0, 13) == 'SSH-2.0-DLINK': + case substr($this->server_identifier, 0, 13) == 'SSH-2.0-DLINK': if (!isset($preferred['server_to_client']['mac'])) { - $s2c_mac_algorithms = \array_values(\array_diff($s2c_mac_algorithms, ['hmac-sha1-96', 'hmac-md5-96'])); + $s2c_mac_algorithms = array_values(array_diff( + $s2c_mac_algorithms, + ['hmac-sha1-96', 'hmac-md5-96'] + )); } if (!isset($preferred['client_to_server']['mac'])) { - $c2s_mac_algorithms = \array_values(\array_diff($c2s_mac_algorithms, ['hmac-sha1-96', 'hmac-md5-96'])); + $c2s_mac_algorithms = array_values(array_diff( + $c2s_mac_algorithms, + ['hmac-sha1-96', 'hmac-md5-96'] + )); } break; - case \substr($this->server_identifier, 0, 24) == 'SSH-2.0-TurboFTP_SERVER_': + case substr($this->server_identifier, 0, 24) == 'SSH-2.0-TurboFTP_SERVER_': if (!isset($preferred['server_to_client']['crypt'])) { - $s2c_encryption_algorithms = \array_values(\array_diff($s2c_encryption_algorithms, ['aes128-gcm@openssh.com', 'aes256-gcm@openssh.com'])); + $s2c_encryption_algorithms = array_values(array_diff( + $s2c_encryption_algorithms, + ['aes128-gcm@openssh.com', 'aes256-gcm@openssh.com'] + )); } if (!isset($preferred['client_to_server']['crypt'])) { - $c2s_encryption_algorithms = \array_values(\array_diff($c2s_encryption_algorithms, ['aes128-gcm@openssh.com', 'aes256-gcm@openssh.com'])); + $c2s_encryption_algorithms = array_values(array_diff( + $c2s_encryption_algorithms, + ['aes128-gcm@openssh.com', 'aes256-gcm@openssh.com'] + )); } } + $client_cookie = Random::string(16); - $kexinit_payload_client = \pack('Ca*', NET_SSH2_MSG_KEXINIT, $client_cookie); + + $kexinit_payload_client = pack('Ca*', NET_SSH2_MSG_KEXINIT, $client_cookie); $kexinit_payload_client .= Strings::packSSH2( 'L10bN', $kex_algorithms, @@ -1440,19 +1666,18 @@ private function key_exchange($kexinit_payload_server = \false) $s2c_mac_algorithms, $c2s_compression_algorithms, $s2c_compression_algorithms, - [], - // language, client to server - [], - // language, server to client - \false, - // first_kex_packet_follows - 0 + [], // language, client to server + [], // language, server to client + false, // first_kex_packet_follows + 0 // reserved for future extension ); - if ($kexinit_payload_server === \false && $send_kex) { + + if ($kexinit_payload_server === false && $send_kex) { $this->send_binary_packet($kexinit_payload_client); - while (\true) { + + while (true) { $kexinit_payload_server = $this->get_binary_packet(); - switch (\ord($kexinit_payload_server[0])) { + switch (ord($kexinit_payload_server[0])) { case NET_SSH2_MSG_KEXINIT: break 2; case NET_SSH2_MSG_DISCONNECT: @@ -1460,28 +1685,46 @@ private function key_exchange($kexinit_payload_server = \false) } $this->kex_buffer[] = $kexinit_payload_server; } - $send_kex = \false; + + $send_kex = false; } + $response = $kexinit_payload_server; - Strings::shift($response, 1); - // skip past the message number (it should be SSH_MSG_KEXINIT) + Strings::shift($response, 1); // skip past the message number (it should be SSH_MSG_KEXINIT) $server_cookie = Strings::shift($response, 16); - list($this->kex_algorithms, $this->server_host_key_algorithms, $this->encryption_algorithms_client_to_server, $this->encryption_algorithms_server_to_client, $this->mac_algorithms_client_to_server, $this->mac_algorithms_server_to_client, $this->compression_algorithms_client_to_server, $this->compression_algorithms_server_to_client, $this->languages_client_to_server, $this->languages_server_to_client, $first_kex_packet_follows) = Strings::unpackSSH2('L10C', $response); - if (\in_array('kex-strict-s-v00@openssh.com', $this->kex_algorithms)) { - if ($this->session_id === \false) { + + list( + $this->kex_algorithms, + $this->server_host_key_algorithms, + $this->encryption_algorithms_client_to_server, + $this->encryption_algorithms_server_to_client, + $this->mac_algorithms_client_to_server, + $this->mac_algorithms_server_to_client, + $this->compression_algorithms_client_to_server, + $this->compression_algorithms_server_to_client, + $this->languages_client_to_server, + $this->languages_server_to_client, + $first_kex_packet_follows + ) = Strings::unpackSSH2('L10C', $response); + if (in_array('kex-strict-s-v00@openssh.com', $this->kex_algorithms)) { + if ($this->session_id === false) { // [kex-strict-s-v00@openssh.com is] only valid in the initial SSH2_MSG_KEXINIT and MUST be ignored // if [it is] present in subsequent SSH2_MSG_KEXINIT packets - $this->strict_kex_flag = \true; - if (\count($this->kex_buffer)) { + $this->strict_kex_flag = true; + if (count($this->kex_buffer)) { throw new \UnexpectedValueException('Possible Terrapin Attack detected'); } } } + $this->supported_private_key_algorithms = $this->server_host_key_algorithms; + if ($send_kex) { $this->send_binary_packet($kexinit_payload_client); } + // we need to decide upon the symmetric encryption algorithms before we do the diffie-hellman key exchange + // we don't initialize any crypto-objects, yet - we do that, later. for now, we need the lengths to make the // diffie-hellman key exchange as fast as possible $decrypt = self::array_intersect_first($s2c_encryption_algorithms, $this->encryption_algorithms_server_to_client); @@ -1489,45 +1732,58 @@ private function key_exchange($kexinit_payload_server = \false) $this->disconnect_helper(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); throw new NoSupportedAlgorithmsException('No compatible server to client encryption algorithms found'); } + $encrypt = self::array_intersect_first($c2s_encryption_algorithms, $this->encryption_algorithms_client_to_server); if (!$encrypt || ($encryptKeyLength = $this->encryption_algorithm_to_key_size($encrypt)) === null) { $this->disconnect_helper(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); throw new NoSupportedAlgorithmsException('No compatible client to server encryption algorithms found'); } + // through diffie-hellman key exchange a symmetric key is obtained $this->kex_algorithm = self::array_intersect_first($kex_algorithms, $this->kex_algorithms); - if ($this->kex_algorithm === \false) { + if ($this->kex_algorithm === false) { $this->disconnect_helper(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); throw new NoSupportedAlgorithmsException('No compatible key exchange algorithms found'); } + $server_host_key_algorithm = self::array_intersect_first($server_host_key_algorithms, $this->server_host_key_algorithms); - if ($server_host_key_algorithm === \false) { + if ($server_host_key_algorithm === false) { $this->disconnect_helper(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); throw new NoSupportedAlgorithmsException('No compatible server host key algorithms found'); } + $mac_algorithm_out = self::array_intersect_first($c2s_mac_algorithms, $this->mac_algorithms_client_to_server); - if ($mac_algorithm_out === \false) { + if ($mac_algorithm_out === false) { $this->disconnect_helper(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); throw new NoSupportedAlgorithmsException('No compatible client to server message authentication algorithms found'); } + $mac_algorithm_in = self::array_intersect_first($s2c_mac_algorithms, $this->mac_algorithms_server_to_client); - if ($mac_algorithm_in === \false) { + if ($mac_algorithm_in === false) { $this->disconnect_helper(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); throw new NoSupportedAlgorithmsException('No compatible server to client message authentication algorithms found'); } - $compression_map = ['none' => self::NET_SSH2_COMPRESSION_NONE, 'zlib' => self::NET_SSH2_COMPRESSION_ZLIB, 'zlib@openssh.com' => self::NET_SSH2_COMPRESSION_ZLIB_AT_OPENSSH]; + + $compression_map = [ + 'none' => self::NET_SSH2_COMPRESSION_NONE, + 'zlib' => self::NET_SSH2_COMPRESSION_ZLIB, + 'zlib@openssh.com' => self::NET_SSH2_COMPRESSION_ZLIB_AT_OPENSSH + ]; + $compression_algorithm_in = self::array_intersect_first($s2c_compression_algorithms, $this->compression_algorithms_server_to_client); - if ($compression_algorithm_in === \false) { + if ($compression_algorithm_in === false) { $this->disconnect_helper(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); throw new NoSupportedAlgorithmsException('No compatible server to client compression algorithms found'); } $this->decompress = $compression_map[$compression_algorithm_in]; + $compression_algorithm_out = self::array_intersect_first($c2s_compression_algorithms, $this->compression_algorithms_client_to_server); - if ($compression_algorithm_out === \false) { + if ($compression_algorithm_out === false) { $this->disconnect_helper(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); throw new NoSupportedAlgorithmsException('No compatible client to server compression algorithms found'); } $this->compress = $compression_map[$compression_algorithm_out]; + switch ($this->kex_algorithm) { case 'diffie-hellman-group15-sha512': case 'diffie-hellman-group16-sha512': @@ -1549,26 +1805,47 @@ private function key_exchange($kexinit_payload_server = \false) default: $kexHash = new Hash('sha1'); } + // Only relevant in diffie-hellman-group-exchange-sha{1,256}, otherwise empty. + $exchange_hash_rfc4419 = ''; - if (\strpos($this->kex_algorithm, 'curve25519-sha256') === 0 || \strpos($this->kex_algorithm, 'ecdh-sha2-nistp') === 0) { - $curve = \strpos($this->kex_algorithm, 'curve25519-sha256') === 0 ? 'Curve25519' : \substr($this->kex_algorithm, 10); + + if (strpos($this->kex_algorithm, 'curve25519-sha256') === 0 || strpos($this->kex_algorithm, 'ecdh-sha2-nistp') === 0) { + $curve = strpos($this->kex_algorithm, 'curve25519-sha256') === 0 ? + 'Curve25519' : + substr($this->kex_algorithm, 10); $ourPrivate = EC::createKey($curve); $ourPublicBytes = $ourPrivate->getPublicKey()->getEncodedCoordinates(); $clientKexInitMessage = 'NET_SSH2_MSG_KEX_ECDH_INIT'; $serverKexReplyMessage = 'NET_SSH2_MSG_KEX_ECDH_REPLY'; } else { - if (\strpos($this->kex_algorithm, 'diffie-hellman-group-exchange') === 0) { - $dh_group_sizes_packed = \pack('NNN', $this->kex_dh_group_size_min, $this->kex_dh_group_size_preferred, $this->kex_dh_group_size_max); - $packet = \pack('Ca*', NET_SSH2_MSG_KEXDH_GEX_REQUEST, $dh_group_sizes_packed); + if (strpos($this->kex_algorithm, 'diffie-hellman-group-exchange') === 0) { + $dh_group_sizes_packed = pack( + 'NNN', + $this->kex_dh_group_size_min, + $this->kex_dh_group_size_preferred, + $this->kex_dh_group_size_max + ); + $packet = pack( + 'Ca*', + NET_SSH2_MSG_KEXDH_GEX_REQUEST, + $dh_group_sizes_packed + ); $this->send_binary_packet($packet); $this->updateLogHistory('UNKNOWN (34)', 'NET_SSH2_MSG_KEXDH_GEX_REQUEST'); + $response = $this->get_binary_packet_or_close(NET_SSH2_MSG_KEXDH_GEX_GROUP); list($type, $primeBytes, $gBytes) = Strings::unpackSSH2('Css', $response); $this->updateLogHistory('NET_SSH2_MSG_KEXDH_REPLY', 'NET_SSH2_MSG_KEXDH_GEX_GROUP'); $prime = new BigInteger($primeBytes, -256); $g = new BigInteger($gBytes, -256); - $exchange_hash_rfc4419 = $dh_group_sizes_packed . Strings::packSSH2('ss', $primeBytes, $gBytes); + + $exchange_hash_rfc4419 = $dh_group_sizes_packed . Strings::packSSH2( + 'ss', + $primeBytes, + $gBytes + ); + $params = DH::createParameters($prime, $g); $clientKexInitMessage = 'NET_SSH2_MSG_KEXDH_GEX_INIT'; $serverKexReplyMessage = 'NET_SSH2_MSG_KEXDH_GEX_REPLY'; @@ -1577,14 +1854,18 @@ private function key_exchange($kexinit_payload_server = \false) $clientKexInitMessage = 'NET_SSH2_MSG_KEXDH_INIT'; $serverKexReplyMessage = 'NET_SSH2_MSG_KEXDH_REPLY'; } - $keyLength = \min($kexHash->getLengthInBytes(), \max($encryptKeyLength, $decryptKeyLength)); - $ourPrivate = DH::createKey($params, 16 * $keyLength); - // 2 * 8 * $keyLength + + $keyLength = min($kexHash->getLengthInBytes(), max($encryptKeyLength, $decryptKeyLength)); + + $ourPrivate = DH::createKey($params, 16 * $keyLength); // 2 * 8 * $keyLength $ourPublic = $ourPrivate->getPublicKey()->toBigInteger(); - $ourPublicBytes = $ourPublic->toBytes(\true); + $ourPublicBytes = $ourPublic->toBytes(true); } - $data = \pack('CNa*', \constant($clientKexInitMessage), \strlen($ourPublicBytes), $ourPublicBytes); + + $data = pack('CNa*', constant($clientKexInitMessage), strlen($ourPublicBytes), $ourPublicBytes); + $this->send_binary_packet($data); + switch ($clientKexInitMessage) { case 'NET_SSH2_MSG_KEX_ECDH_INIT': $this->updateLogHistory('NET_SSH2_MSG_KEXDH_INIT', 'NET_SSH2_MSG_KEX_ECDH_INIT'); @@ -1592,8 +1873,16 @@ private function key_exchange($kexinit_payload_server = \false) case 'NET_SSH2_MSG_KEXDH_GEX_INIT': $this->updateLogHistory('UNKNOWN (32)', 'NET_SSH2_MSG_KEXDH_GEX_INIT'); } - $response = $this->get_binary_packet_or_close(\constant($serverKexReplyMessage)); - list($type, $server_public_host_key, $theirPublicBytes, $this->signature) = Strings::unpackSSH2('Csss', $response); + + $response = $this->get_binary_packet_or_close(constant($serverKexReplyMessage)); + + list( + $type, + $server_public_host_key, + $theirPublicBytes, + $this->signature + ) = Strings::unpackSSH2('Csss', $response); + switch ($serverKexReplyMessage) { case 'NET_SSH2_MSG_KEX_ECDH_REPLY': $this->updateLogHistory('NET_SSH2_MSG_KEXDH_REPLY', 'NET_SSH2_MSG_KEX_ECDH_REPLY'); @@ -1601,37 +1890,55 @@ private function key_exchange($kexinit_payload_server = \false) case 'NET_SSH2_MSG_KEXDH_GEX_REPLY': $this->updateLogHistory('UNKNOWN (33)', 'NET_SSH2_MSG_KEXDH_GEX_REPLY'); } + $this->server_public_host_key = $server_public_host_key; list($public_key_format) = Strings::unpackSSH2('s', $server_public_host_key); - if (\strlen($this->signature) < 4) { + if (strlen($this->signature) < 4) { throw new \LengthException('The signature needs at least four bytes'); } - $temp = \unpack('Nlength', \substr($this->signature, 0, 4)); - $this->signature_format = \substr($this->signature, 4, $temp['length']); + $temp = unpack('Nlength', substr($this->signature, 0, 4)); + $this->signature_format = substr($this->signature, 4, $temp['length']); + $keyBytes = DH::computeSecret($ourPrivate, $theirPublicBytes); - if (($keyBytes & "\xff\x80") === "\x00\x00") { - $keyBytes = \substr($keyBytes, 1); + if (($keyBytes & "\xFF\x80") === "\x00\x00") { + $keyBytes = substr($keyBytes, 1); } elseif (($keyBytes[0] & "\x80") === "\x80") { - $keyBytes = "\x00{$keyBytes}"; + $keyBytes = "\0$keyBytes"; } - $this->exchange_hash = Strings::packSSH2('s5', $this->identifier, $this->server_identifier, $kexinit_payload_client, $kexinit_payload_server, $this->server_public_host_key); + + $this->exchange_hash = Strings::packSSH2( + 's5', + $this->identifier, + $this->server_identifier, + $kexinit_payload_client, + $kexinit_payload_server, + $this->server_public_host_key + ); $this->exchange_hash .= $exchange_hash_rfc4419; - $this->exchange_hash .= Strings::packSSH2('s3', $ourPublicBytes, $theirPublicBytes, $keyBytes); + $this->exchange_hash .= Strings::packSSH2( + 's3', + $ourPublicBytes, + $theirPublicBytes, + $keyBytes + ); + $this->exchange_hash = $kexHash->hash($this->exchange_hash); - if ($this->session_id === \false) { + + if ($this->session_id === false) { $this->session_id = $this->exchange_hash; } + switch ($server_host_key_algorithm) { case 'rsa-sha2-256': case 'rsa-sha2-512': - //case 'ssh-rsa': + //case 'ssh-rsa': $expected_key_format = 'ssh-rsa'; break; default: $expected_key_format = $server_host_key_algorithm; } if ($public_key_format != $expected_key_format || $this->signature_format != $server_host_key_algorithm) { - switch (\true) { + switch (true) { case $this->signature_format == $server_host_key_algorithm: case $server_host_key_algorithm != 'rsa-sha2-256' && $server_host_key_algorithm != 'rsa-sha2-512': case $this->signature_format != 'ssh-rsa': @@ -1639,14 +1946,19 @@ private function key_exchange($kexinit_payload_server = \false) throw new \RuntimeException('Server Host Key Algorithm Mismatch (' . $this->signature_format . ' vs ' . $server_host_key_algorithm . ')'); } } - $packet = \pack('C', NET_SSH2_MSG_NEWKEYS); + + $packet = pack('C', NET_SSH2_MSG_NEWKEYS); $this->send_binary_packet($packet); $this->get_binary_packet_or_close(NET_SSH2_MSG_NEWKEYS); - $this->keyExchangeInProgress = \false; + + $this->keyExchangeInProgress = false; + if ($this->strict_kex_flag) { $this->get_seq_no = $this->send_seq_no = 0; } - $keyBytes = \pack('Na*', \strlen($keyBytes), $keyBytes); + + $keyBytes = pack('Na*', strlen($keyBytes), $keyBytes); + $this->encrypt = self::encryption_algorithm_to_crypt_instance($encrypt); if ($this->encrypt) { if (self::$crypto_engine) { @@ -1656,38 +1968,42 @@ private function key_exchange($kexinit_payload_server = \false) $this->encrypt_block_size = $this->encrypt->getBlockLengthInBytes(); } $this->encrypt->disablePadding(); + if ($this->encrypt->usesIV()) { $iv = $kexHash->hash($keyBytes . $this->exchange_hash . 'A' . $this->session_id); - while ($this->encrypt_block_size > \strlen($iv)) { + while ($this->encrypt_block_size > strlen($iv)) { $iv .= $kexHash->hash($keyBytes . $this->exchange_hash . $iv); } - $this->encrypt->setIV(\substr($iv, 0, $this->encrypt_block_size)); + $this->encrypt->setIV(substr($iv, 0, $this->encrypt_block_size)); } + switch ($encrypt) { case 'aes128-gcm@openssh.com': case 'aes256-gcm@openssh.com': $nonce = $kexHash->hash($keyBytes . $this->exchange_hash . 'A' . $this->session_id); - $this->encryptFixedPart = \substr($nonce, 0, 4); - $this->encryptInvocationCounter = \substr($nonce, 4, 8); - // fall-through + $this->encryptFixedPart = substr($nonce, 0, 4); + $this->encryptInvocationCounter = substr($nonce, 4, 8); + // fall-through case 'chacha20-poly1305@openssh.com': break; default: $this->encrypt->enableContinuousBuffer(); } + $key = $kexHash->hash($keyBytes . $this->exchange_hash . 'C' . $this->session_id); - while ($encryptKeyLength > \strlen($key)) { + while ($encryptKeyLength > strlen($key)) { $key .= $kexHash->hash($keyBytes . $this->exchange_hash . $key); } switch ($encrypt) { case 'chacha20-poly1305@openssh.com': $encryptKeyLength = 32; $this->lengthEncrypt = self::encryption_algorithm_to_crypt_instance($encrypt); - $this->lengthEncrypt->setKey(\substr($key, 32, 32)); + $this->lengthEncrypt->setKey(substr($key, 32, 32)); } - $this->encrypt->setKey(\substr($key, 0, $encryptKeyLength)); + $this->encrypt->setKey(substr($key, 0, $encryptKeyLength)); $this->encryptName = $encrypt; } + $this->decrypt = self::encryption_algorithm_to_crypt_instance($decrypt); if ($this->decrypt) { if (self::$crypto_engine) { @@ -1697,52 +2013,57 @@ private function key_exchange($kexinit_payload_server = \false) $this->decrypt_block_size = $this->decrypt->getBlockLengthInBytes(); } $this->decrypt->disablePadding(); + if ($this->decrypt->usesIV()) { $iv = $kexHash->hash($keyBytes . $this->exchange_hash . 'B' . $this->session_id); - while ($this->decrypt_block_size > \strlen($iv)) { + while ($this->decrypt_block_size > strlen($iv)) { $iv .= $kexHash->hash($keyBytes . $this->exchange_hash . $iv); } - $this->decrypt->setIV(\substr($iv, 0, $this->decrypt_block_size)); + $this->decrypt->setIV(substr($iv, 0, $this->decrypt_block_size)); } + switch ($decrypt) { case 'aes128-gcm@openssh.com': case 'aes256-gcm@openssh.com': // see https://tools.ietf.org/html/rfc5647#section-7.1 $nonce = $kexHash->hash($keyBytes . $this->exchange_hash . 'B' . $this->session_id); - $this->decryptFixedPart = \substr($nonce, 0, 4); - $this->decryptInvocationCounter = \substr($nonce, 4, 8); - // fall-through + $this->decryptFixedPart = substr($nonce, 0, 4); + $this->decryptInvocationCounter = substr($nonce, 4, 8); + // fall-through case 'chacha20-poly1305@openssh.com': break; default: $this->decrypt->enableContinuousBuffer(); } + $key = $kexHash->hash($keyBytes . $this->exchange_hash . 'D' . $this->session_id); - while ($decryptKeyLength > \strlen($key)) { + while ($decryptKeyLength > strlen($key)) { $key .= $kexHash->hash($keyBytes . $this->exchange_hash . $key); } switch ($decrypt) { case 'chacha20-poly1305@openssh.com': $decryptKeyLength = 32; $this->lengthDecrypt = self::encryption_algorithm_to_crypt_instance($decrypt); - $this->lengthDecrypt->setKey(\substr($key, 32, 32)); + $this->lengthDecrypt->setKey(substr($key, 32, 32)); } - $this->decrypt->setKey(\substr($key, 0, $decryptKeyLength)); + $this->decrypt->setKey(substr($key, 0, $decryptKeyLength)); $this->decryptName = $decrypt; } + /* The "arcfour128" algorithm is the RC4 cipher, as described in - [SCHNEIER], using a 128-bit key. The first 1536 bytes of keystream - generated by the cipher MUST be discarded, and the first byte of the - first encrypted packet MUST be encrypted using the 1537th byte of - keystream. - - -- http://tools.ietf.org/html/rfc4345#section-4 */ + [SCHNEIER], using a 128-bit key. The first 1536 bytes of keystream + generated by the cipher MUST be discarded, and the first byte of the + first encrypted packet MUST be encrypted using the 1537th byte of + keystream. + + -- http://tools.ietf.org/html/rfc4345#section-4 */ if ($encrypt == 'arcfour128' || $encrypt == 'arcfour256') { - $this->encrypt->encrypt(\str_repeat("\x00", 1536)); + $this->encrypt->encrypt(str_repeat("\0", 1536)); } if ($decrypt == 'arcfour128' || $decrypt == 'arcfour256') { - $this->decrypt->decrypt(\str_repeat("\x00", 1536)); + $this->decrypt->decrypt(str_repeat("\0", 1536)); } + if (!$this->encrypt->usesNonce()) { list($this->hmac_create, $createKeyLength) = self::mac_algorithm_to_hash_instance($mac_algorithm_out); } else { @@ -1751,15 +2072,17 @@ private function key_exchange($kexinit_payload_server = \false) //$mac_algorithm_out = 'none'; $createKeyLength = 0; } + if ($this->hmac_create instanceof Hash) { $key = $kexHash->hash($keyBytes . $this->exchange_hash . 'E' . $this->session_id); - while ($createKeyLength > \strlen($key)) { + while ($createKeyLength > strlen($key)) { $key .= $kexHash->hash($keyBytes . $this->exchange_hash . $key); } - $this->hmac_create->setKey(\substr($key, 0, $createKeyLength)); + $this->hmac_create->setKey(substr($key, 0, $createKeyLength)); $this->hmac_create_name = $mac_algorithm_out; - $this->hmac_create_etm = \preg_match('#-etm@openssh\\.com$#', $mac_algorithm_out); + $this->hmac_create_etm = preg_match('#-etm@openssh\.com$#', $mac_algorithm_out); } + if (!$this->decrypt->usesNonce()) { list($this->hmac_check, $checkKeyLength) = self::mac_algorithm_to_hash_instance($mac_algorithm_in); $this->hmac_size = $this->hmac_check->getLengthInBytes(); @@ -1770,18 +2093,22 @@ private function key_exchange($kexinit_payload_server = \false) $checkKeyLength = 0; $this->hmac_size = 0; } + if ($this->hmac_check instanceof Hash) { $key = $kexHash->hash($keyBytes . $this->exchange_hash . 'F' . $this->session_id); - while ($checkKeyLength > \strlen($key)) { + while ($checkKeyLength > strlen($key)) { $key .= $kexHash->hash($keyBytes . $this->exchange_hash . $key); } - $this->hmac_check->setKey(\substr($key, 0, $checkKeyLength)); + $this->hmac_check->setKey(substr($key, 0, $checkKeyLength)); $this->hmac_check_name = $mac_algorithm_in; - $this->hmac_check_etm = \preg_match('#-etm@openssh\\.com$#', $mac_algorithm_in); + $this->hmac_check_etm = preg_match('#-etm@openssh\.com$#', $mac_algorithm_in); } - $this->regenerate_compression_context = $this->regenerate_decompression_context = \true; - return \true; + + $this->regenerate_compression_context = $this->regenerate_decompression_context = true; + + return true; } + /** * Maps an encryption algorithm name to the number of key bytes. * @@ -1793,6 +2120,7 @@ private function encryption_algorithm_to_key_size($algorithm) if ($this->bad_key_size_fix && self::bad_algorithm_candidate($algorithm)) { return 16; } + switch ($algorithm) { case 'none': return 0; @@ -1826,6 +2154,7 @@ private function encryption_algorithm_to_key_size($algorithm) } return null; } + /** * Maps an encryption algorithm name to an instance of a subclass of * \phpseclib3\Crypt\Common\SymmetricKey. @@ -1873,6 +2202,7 @@ private static function encryption_algorithm_to_crypt_instance($algorithm) } return null; } + /** * Maps an encryption algorithm name to an instance of a subclass of * \phpseclib3\Crypt\Hash. @@ -1906,6 +2236,7 @@ private static function mac_algorithm_to_hash_instance($algorithm) return [new Hash('md5-96'), 16]; } } + /** * Tests whether or not proposed algorithm has a potential for issues * @@ -1920,10 +2251,12 @@ private static function bad_algorithm_candidate($algorithm) case 'arcfour256': case 'aes192-ctr': case 'aes256-ctr': - return \true; + return true; } - return \false; + + return false; } + /** * Login * @@ -1937,20 +2270,22 @@ private static function bad_algorithm_candidate($algorithm) public function login($username, ...$args) { if (!$this->login_credentials_finalized) { - $this->auth[] = \func_get_args(); + $this->auth[] = func_get_args(); } + // try logging with 'none' as an authentication method first since that's what // PuTTY does - if (\substr($this->server_identifier, 0, 15) != 'SSH-2.0-CoreFTP' && $this->auth_methods_to_continue === null) { + if (substr($this->server_identifier, 0, 15) != 'SSH-2.0-CoreFTP' && $this->auth_methods_to_continue === null) { if ($this->sublogin($username)) { - return \true; + return true; } - if (!\count($args)) { - return \false; + if (!count($args)) { + return false; } } return $this->sublogin($username, ...$args); } + /** * Login Helper * @@ -1964,23 +2299,26 @@ protected function sublogin($username, ...$args) if (!($this->bitmap & self::MASK_CONSTRUCTOR)) { $this->connect(); } + if (empty($args)) { return $this->login_helper($username); } + foreach ($args as $arg) { - switch (\true) { + switch (true) { case $arg instanceof PublicKey: throw new \UnexpectedValueException('A PublicKey object was passed to the login method instead of a PrivateKey object'); case $arg instanceof PrivateKey: case $arg instanceof Agent: - case \is_array($arg): + case is_array($arg): case Strings::is_stringable($arg): break; default: - throw new \UnexpectedValueException('$password needs to either be an instance of \\phpseclib3\\Crypt\\Common\\PrivateKey, \\System\\SSH\\Agent, an array or a string'); + throw new \UnexpectedValueException('$password needs to either be an instance of \phpseclib3\Crypt\Common\PrivateKey, \System\SSH\Agent, an array or a string'); } } - while (\count($args)) { + + while (count($args)) { if (!$this->auth_methods_to_continue || !$this->smartMFA) { $newargs = $args; $args = []; @@ -1998,26 +2336,26 @@ protected function sublogin($username, ...$args) } break; case 'keyboard-interactive': - $hasArray = $hasString = \false; + $hasArray = $hasString = false; foreach ($args as $arg) { - if ($hasArray || \is_array($arg)) { - $hasArray = \true; + if ($hasArray || is_array($arg)) { + $hasArray = true; break; } if ($hasString || Strings::is_stringable($arg)) { - $hasString = \true; + $hasString = true; break; } } if ($hasArray && $hasString) { foreach ($args as $key => $arg) { - if (\is_array($arg)) { + if (is_array($arg)) { $newargs[] = $arg; break 2; } } } - // fall-through + // fall-through case 'password': foreach ($args as $key => $arg) { $newargs[] = $arg; @@ -2027,18 +2365,21 @@ protected function sublogin($username, ...$args) } } } - if (!\count($newargs)) { - return \false; + + if (!count($newargs)) { + return false; } + foreach ($newargs as $arg) { if ($this->login_helper($username, $arg)) { - $this->login_credentials_finalized = \true; - return \true; + $this->login_credentials_finalized = true; + return true; } } } - return \false; + return false; } + /** * Login Helper * @@ -2054,11 +2395,13 @@ protected function sublogin($username, ...$args) private function login_helper($username, $password = null) { if (!($this->bitmap & self::MASK_CONNECTED)) { - return \false; + return false; } + if (!($this->bitmap & self::MASK_LOGIN_REQ)) { $packet = Strings::packSSH2('Cs', NET_SSH2_MSG_SERVICE_REQUEST, 'ssh-userauth'); $this->send_binary_packet($packet); + try { $response = $this->get_binary_packet_or_close(NET_SSH2_MSG_SERVICE_ACCEPT); } catch (InvalidPacketLengthException $e) { @@ -2067,88 +2410,127 @@ private function login_helper($username, $password = null) // bad_key_size_fix is only ever re-assigned to true here // retry the connection with that new setting but we'll // only try it once. - $this->bad_key_size_fix = \true; + $this->bad_key_size_fix = true; return $this->reconnect(); } throw $e; } + list($type) = Strings::unpackSSH2('C', $response); list($service) = Strings::unpackSSH2('s', $response); + if ($service != 'ssh-userauth') { $this->disconnect_helper(NET_SSH2_DISCONNECT_PROTOCOL_ERROR); throw new \UnexpectedValueException('Expected SSH_MSG_SERVICE_ACCEPT'); } $this->bitmap |= self::MASK_LOGIN_REQ; } - if (\strlen($this->last_interactive_response)) { - return !Strings::is_stringable($password) && !\is_array($password) ? \false : $this->keyboard_interactive_process($password); + + if (strlen($this->last_interactive_response)) { + return !Strings::is_stringable($password) && !is_array($password) ? false : $this->keyboard_interactive_process($password); } + if ($password instanceof PrivateKey) { return $this->privatekey_login($username, $password); } + if ($password instanceof Agent) { return $this->ssh_agent_login($username, $password); } - if (\is_array($password)) { + + if (is_array($password)) { if ($this->keyboard_interactive_login($username, $password)) { $this->bitmap |= self::MASK_LOGIN; - return \true; + return true; } - return \false; + return false; } + if (!isset($password)) { - $packet = Strings::packSSH2('Cs3', NET_SSH2_MSG_USERAUTH_REQUEST, $username, 'ssh-connection', 'none'); + $packet = Strings::packSSH2( + 'Cs3', + NET_SSH2_MSG_USERAUTH_REQUEST, + $username, + 'ssh-connection', + 'none' + ); + $this->send_binary_packet($packet); + $response = $this->get_binary_packet_or_close(); + list($type) = Strings::unpackSSH2('C', $response); switch ($type) { case NET_SSH2_MSG_USERAUTH_SUCCESS: $this->bitmap |= self::MASK_LOGIN; - return \true; + return true; case NET_SSH2_MSG_USERAUTH_FAILURE: list($auth_methods) = Strings::unpackSSH2('L', $response); $this->auth_methods_to_continue = $auth_methods; - // fall-through + // fall-through default: - return \false; + return false; } } - $packet = Strings::packSSH2('Cs3bs', NET_SSH2_MSG_USERAUTH_REQUEST, $username, 'ssh-connection', 'password', \false, $password); + + $packet = Strings::packSSH2( + 'Cs3bs', + NET_SSH2_MSG_USERAUTH_REQUEST, + $username, + 'ssh-connection', + 'password', + false, + $password + ); + // remove the username and password from the logged packet - if (!\defined('NET_SSH2_LOGGING')) { + if (!defined('NET_SSH2_LOGGING')) { $logged = null; } else { - $logged = Strings::packSSH2('Cs3bs', NET_SSH2_MSG_USERAUTH_REQUEST, $username, 'ssh-connection', 'password', \false, 'password'); + $logged = Strings::packSSH2( + 'Cs3bs', + NET_SSH2_MSG_USERAUTH_REQUEST, + $username, + 'ssh-connection', + 'password', + false, + 'password' + ); } + $this->send_binary_packet($packet, $logged); + $response = $this->get_binary_packet_or_close(); list($type) = Strings::unpackSSH2('C', $response); switch ($type) { - case NET_SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ: - // in theory, the password can be changed + case NET_SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ: // in theory, the password can be changed $this->updateLogHistory('UNKNOWN (60)', 'NET_SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ'); + list($message) = Strings::unpackSSH2('s', $response); $this->errors[] = 'SSH_MSG_USERAUTH_PASSWD_CHANGEREQ: ' . $message; + return $this->disconnect_helper(NET_SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER); case NET_SSH2_MSG_USERAUTH_FAILURE: // can we use keyboard-interactive authentication? if not then either the login is bad or the server employees // multi-factor authentication list($auth_methods, $partial_success) = Strings::unpackSSH2('Lb', $response); $this->auth_methods_to_continue = $auth_methods; - if (!$partial_success && \in_array('keyboard-interactive', $auth_methods)) { + if (!$partial_success && in_array('keyboard-interactive', $auth_methods)) { if ($this->keyboard_interactive_login($username, $password)) { $this->bitmap |= self::MASK_LOGIN; - return \true; + return true; } - return \false; + return false; } - return \false; + return false; case NET_SSH2_MSG_USERAUTH_SUCCESS: $this->bitmap |= self::MASK_LOGIN; - return \true; + return true; } - return \false; + + return false; } + /** * Login via keyboard-interactive authentication * @@ -2166,13 +2548,14 @@ private function keyboard_interactive_login($username, $password) $username, 'ssh-connection', 'keyboard-interactive', - '', - // language tag - '' + '', // language tag + '' // submethods ); $this->send_binary_packet($packet); + return $this->keyboard_interactive_process($password); } + /** * Handle the keyboard-interactive requests / responses. * @@ -2182,57 +2565,74 @@ private function keyboard_interactive_login($username, $password) */ private function keyboard_interactive_process(...$responses) { - if (\strlen($this->last_interactive_response)) { + if (strlen($this->last_interactive_response)) { $response = $this->last_interactive_response; } else { $orig = $response = $this->get_binary_packet_or_close(); } + list($type) = Strings::unpackSSH2('C', $response); switch ($type) { case NET_SSH2_MSG_USERAUTH_INFO_REQUEST: - list(, , , $num_prompts) = Strings::unpackSSH2('s3N', $response); - for ($i = 0; $i < \count($responses); $i++) { - if (\is_array($responses[$i])) { + list( + , // name; may be empty + , // instruction; may be empty + , // language tag; may be empty + $num_prompts + ) = Strings::unpackSSH2('s3N', $response); + + for ($i = 0; $i < count($responses); $i++) { + if (is_array($responses[$i])) { foreach ($responses[$i] as $key => $value) { $this->keyboard_requests_responses[$key] = $value; } unset($responses[$i]); } } - $responses = \array_values($responses); + $responses = array_values($responses); + if (isset($this->keyboard_requests_responses)) { for ($i = 0; $i < $num_prompts; $i++) { - list($prompt, ) = Strings::unpackSSH2('sC', $response); + list( + $prompt, // prompt - ie. "Password: "; must not be empty + // echo + ) = Strings::unpackSSH2('sC', $response); foreach ($this->keyboard_requests_responses as $key => $value) { - if (\substr($prompt, 0, \strlen($key)) == $key) { + if (substr($prompt, 0, strlen($key)) == $key) { $responses[] = $value; break; } } } } + // see http://tools.ietf.org/html/rfc4256#section-3.2 - if (\strlen($this->last_interactive_response)) { + if (strlen($this->last_interactive_response)) { $this->last_interactive_response = ''; } else { $this->updateLogHistory('UNKNOWN (60)', 'NET_SSH2_MSG_USERAUTH_INFO_REQUEST'); } - if (!\count($responses) && $num_prompts) { + + if (!count($responses) && $num_prompts) { $this->last_interactive_response = $orig; - return \false; + return false; } + /* After obtaining the requested information from the user, the client MUST respond with an SSH_MSG_USERAUTH_INFO_RESPONSE message. */ // see http://tools.ietf.org/html/rfc4256#section-3.4 - $packet = $logged = \pack('CN', NET_SSH2_MSG_USERAUTH_INFO_RESPONSE, \count($responses)); - for ($i = 0; $i < \count($responses); $i++) { + $packet = $logged = pack('CN', NET_SSH2_MSG_USERAUTH_INFO_RESPONSE, count($responses)); + for ($i = 0; $i < count($responses); $i++) { $packet .= Strings::packSSH2('s', $responses[$i]); $logged .= Strings::packSSH2('s', 'dummy-answer'); } + $this->send_binary_packet($packet, $logged); + $this->updateLogHistory('UNKNOWN (61)', 'NET_SSH2_MSG_USERAUTH_INFO_RESPONSE'); + /* After receiving the response, the server MUST send either an SSH_MSG_USERAUTH_SUCCESS, SSH_MSG_USERAUTH_FAILURE, or another @@ -2242,14 +2642,16 @@ private function keyboard_interactive_process(...$responses) // there could be an infinite loop of request / responses. return $this->keyboard_interactive_process(); case NET_SSH2_MSG_USERAUTH_SUCCESS: - return \true; + return true; case NET_SSH2_MSG_USERAUTH_FAILURE: list($auth_methods) = Strings::unpackSSH2('L', $response); $this->auth_methods_to_continue = $auth_methods; - return \false; + return false; } - return \false; + + return false; } + /** * Login with an ssh-agent provided key * @@ -2264,12 +2666,14 @@ private function ssh_agent_login($username, Agent $agent) $orig_algorithms = $this->supported_private_key_algorithms; foreach ($keys as $key) { if ($this->privatekey_login($username, $key)) { - return \true; + return true; } $this->supported_private_key_algorithms = $orig_algorithms; } - return \false; + + return false; } + /** * Login with an RSA private key * @@ -2284,11 +2688,12 @@ private function ssh_agent_login($username, Agent $agent) private function privatekey_login($username, PrivateKey $privatekey) { $publickey = $privatekey->getPublicKey(); + if ($publickey instanceof RSA) { $privatekey = $privatekey->withPadding(RSA::SIGNATURE_PKCS1); $algos = ['rsa-sha2-256', 'rsa-sha2-512', 'ssh-rsa']; if (isset($this->preferred['hostkey'])) { - $algos = \array_intersect($algos, $this->preferred['hostkey']); + $algos = array_intersect($algos, $this->preferred['hostkey']); } $algo = self::array_intersect_first($algos, $this->supported_private_key_algorithms); switch ($algo) { @@ -2313,23 +2718,20 @@ private function privatekey_login($username, PrivateKey $privatekey) $hash = 'sha512'; $signatureType = 'ssh-ed25519'; break; - case 'secp256r1': - // nistp256 + case 'secp256r1': // nistp256 $hash = 'sha256'; $signatureType = 'ecdsa-sha2-nistp256'; break; - case 'secp384r1': - // nistp384 + case 'secp384r1': // nistp384 $hash = 'sha384'; $signatureType = 'ecdsa-sha2-nistp384'; break; - case 'secp521r1': - // nistp521 + case 'secp521r1': // nistp521 $hash = 'sha512'; $signatureType = 'ecdsa-sha2-nistp521'; break; default: - if (\is_array($curveName)) { + if (is_array($curveName)) { throw new UnsupportedCurveException('Specified Curves are not supported by SSH2'); } throw new UnsupportedCurveException('Named Curve of ' . $curveName . ' is not supported by phpseclib3\'s SSH2 implementation'); @@ -2341,23 +2743,38 @@ private function privatekey_login($username, PrivateKey $privatekey) } else { throw new UnsupportedAlgorithmException('Please use either an RSA key, an EC one or a DSA key'); } - $publickeyStr = $publickey->toString('OpenSSH', ['binary' => \true]); - $part1 = Strings::packSSH2('Csss', NET_SSH2_MSG_USERAUTH_REQUEST, $username, 'ssh-connection', 'publickey'); + + $publickeyStr = $publickey->toString('OpenSSH', ['binary' => true]); + + $part1 = Strings::packSSH2( + 'Csss', + NET_SSH2_MSG_USERAUTH_REQUEST, + $username, + 'ssh-connection', + 'publickey' + ); $part2 = Strings::packSSH2('ss', $signatureType, $publickeyStr); - $packet = $part1 . \chr(0) . $part2; + + $packet = $part1 . chr(0) . $part2; $this->send_binary_packet($packet); - $response = $this->get_binary_packet_or_close(NET_SSH2_MSG_USERAUTH_SUCCESS, NET_SSH2_MSG_USERAUTH_FAILURE, NET_SSH2_MSG_USERAUTH_PK_OK); + + $response = $this->get_binary_packet_or_close( + NET_SSH2_MSG_USERAUTH_SUCCESS, + NET_SSH2_MSG_USERAUTH_FAILURE, + NET_SSH2_MSG_USERAUTH_PK_OK + ); + list($type) = Strings::unpackSSH2('C', $response); switch ($type) { case NET_SSH2_MSG_USERAUTH_FAILURE: list($auth_methods) = Strings::unpackSSH2('L', $response); - if (\in_array('publickey', $auth_methods) && \substr($signatureType, 0, 9) == 'rsa-sha2-') { - $this->supported_private_key_algorithms = \array_diff($this->supported_private_key_algorithms, ['rsa-sha2-256', 'rsa-sha2-512']); + if (in_array('publickey', $auth_methods) && substr($signatureType, 0, 9) == 'rsa-sha2-') { + $this->supported_private_key_algorithms = array_diff($this->supported_private_key_algorithms, ['rsa-sha2-256', 'rsa-sha2-512']); return $this->privatekey_login($username, $privatekey); } $this->auth_methods_to_continue = $auth_methods; $this->errors[] = 'SSH_MSG_USERAUTH_FAILURE'; - return \false; + return false; case NET_SSH2_MSG_USERAUTH_PK_OK: // we'll just take it on faith that the public key blob and the public key algorithm name are as // they should be @@ -2365,29 +2782,37 @@ private function privatekey_login($username, PrivateKey $privatekey) break; case NET_SSH2_MSG_USERAUTH_SUCCESS: $this->bitmap |= self::MASK_LOGIN; - return \true; + return true; } - $packet = $part1 . \chr(1) . $part2; + + $packet = $part1 . chr(1) . $part2; $privatekey = $privatekey->withHash($hash); $signature = $privatekey->sign(Strings::packSSH2('s', $this->session_id) . $packet); if ($publickey instanceof RSA) { $signature = Strings::packSSH2('ss', $signatureType, $signature); } $packet .= Strings::packSSH2('s', $signature); + $this->send_binary_packet($packet); - $response = $this->get_binary_packet_or_close(NET_SSH2_MSG_USERAUTH_SUCCESS, NET_SSH2_MSG_USERAUTH_FAILURE); + + $response = $this->get_binary_packet_or_close( + NET_SSH2_MSG_USERAUTH_SUCCESS, + NET_SSH2_MSG_USERAUTH_FAILURE + ); + list($type) = Strings::unpackSSH2('C', $response); switch ($type) { case NET_SSH2_MSG_USERAUTH_FAILURE: // either the login is bad or the server employs multi-factor authentication list($auth_methods) = Strings::unpackSSH2('L', $response); $this->auth_methods_to_continue = $auth_methods; - return \false; + return false; case NET_SSH2_MSG_USERAUTH_SUCCESS: $this->bitmap |= self::MASK_LOGIN; - return \true; + return true; } } + /** * Return the currently configured timeout * @@ -2397,6 +2822,7 @@ public function getTimeout() { return $this->timeout; } + /** * Set Timeout * @@ -2409,6 +2835,7 @@ public function setTimeout($timeout) { $this->timeout = $this->curTimeout = $timeout; } + /** * Set Keep Alive * @@ -2420,6 +2847,7 @@ public function setKeepAlive($interval) { $this->keepAlive = $interval; } + /** * Get the output from stdError * @@ -2428,6 +2856,7 @@ public function getStdError() { return $this->stdErrorLog; } + /** * Execute Command * @@ -2443,57 +2872,89 @@ public function getStdError() public function exec($command, $callback = null) { $this->curTimeout = $this->timeout; - $this->is_timeout = \false; + $this->is_timeout = false; $this->stdErrorLog = ''; + if (!$this->isAuthenticated()) { - return \false; + return false; } + //if ($this->isPTYOpen()) { // throw new \RuntimeException('If you want to run multiple exec()\'s you will need to disable (and re-enable if appropriate) a PTY for each one.'); //} + $this->open_channel(self::CHANNEL_EXEC); - if ($this->request_pty === \true) { - $terminal_modes = \pack('C', NET_SSH2_TTY_OP_END); - $packet = Strings::packSSH2('CNsCsN4s', NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[self::CHANNEL_EXEC], 'pty-req', 1, $this->term, $this->windowColumns, $this->windowRows, 0, 0, $terminal_modes); + + if ($this->request_pty === true) { + $terminal_modes = pack('C', NET_SSH2_TTY_OP_END); + $packet = Strings::packSSH2( + 'CNsCsN4s', + NET_SSH2_MSG_CHANNEL_REQUEST, + $this->server_channels[self::CHANNEL_EXEC], + 'pty-req', + 1, + $this->term, + $this->windowColumns, + $this->windowRows, + 0, + 0, + $terminal_modes + ); + $this->send_binary_packet($packet); + $this->channel_status[self::CHANNEL_EXEC] = NET_SSH2_MSG_CHANNEL_REQUEST; if (!$this->get_channel_packet(self::CHANNEL_EXEC)) { $this->disconnect_helper(NET_SSH2_DISCONNECT_BY_APPLICATION); throw new \RuntimeException('Unable to request pseudo-terminal'); } } + // sending a pty-req SSH_MSG_CHANNEL_REQUEST message is unnecessary and, in fact, in most cases, slows things // down. the one place where it might be desirable is if you're doing something like \phpseclib3\Net\SSH2::exec('ping localhost &'). // with a pty-req SSH_MSG_CHANNEL_REQUEST, exec() will return immediately and the ping process will then // then immediately terminate. without such a request exec() will loop indefinitely. the ping process won't end but // neither will your script. + // although, in theory, the size of SSH_MSG_CHANNEL_REQUEST could exceed the maximum packet size established by // SSH_MSG_CHANNEL_OPEN_CONFIRMATION, RFC4254#section-5.1 states that the "maximum packet size" refers to the // "maximum size of an individual data packet". ie. SSH_MSG_CHANNEL_DATA. RFC4254#section-5.2 corroborates. - $packet = Strings::packSSH2('CNsCs', NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[self::CHANNEL_EXEC], 'exec', 1, $command); + $packet = Strings::packSSH2( + 'CNsCs', + NET_SSH2_MSG_CHANNEL_REQUEST, + $this->server_channels[self::CHANNEL_EXEC], + 'exec', + 1, + $command + ); $this->send_binary_packet($packet); + $this->channel_status[self::CHANNEL_EXEC] = NET_SSH2_MSG_CHANNEL_REQUEST; + if (!$this->get_channel_packet(self::CHANNEL_EXEC)) { - return \false; + return false; } + $this->channel_status[self::CHANNEL_EXEC] = NET_SSH2_MSG_CHANNEL_DATA; - if ($this->request_pty === \true) { + + if ($this->request_pty === true) { $this->channel_id_last_interactive = self::CHANNEL_EXEC; - return \true; + return true; } + $output = ''; - while (\true) { + while (true) { $temp = $this->get_channel_packet(self::CHANNEL_EXEC); - switch (\true) { - case $temp === \true: - return \is_callable($callback) ? \true : $output; - case $temp === \false: - return \false; + switch (true) { + case $temp === true: + return is_callable($callback) ? true : $output; + case $temp === false: + return false; default: - if (\is_callable($callback)) { - if ($callback($temp) === \true) { + if (is_callable($callback)) { + if ($callback($temp) === true) { $this->close_channel(self::CHANNEL_EXEC); - return \true; + return true; } } else { $output .= $temp; @@ -2501,6 +2962,7 @@ public function exec($command, $callback = null) } } } + /** * How many channels are currently open? * @@ -2510,6 +2972,7 @@ public function getOpenChannelCount() { return $this->channelCount; } + /** * Opens a channel * @@ -2517,15 +2980,18 @@ public function getOpenChannelCount() * @param bool $skip_extended * @return bool */ - protected function open_channel($channel, $skip_extended = \false) + protected function open_channel($channel, $skip_extended = false) { if (isset($this->channel_status[$channel])) { throw new \RuntimeException('Please close the channel (' . $channel . ') before trying to open it again'); } + $this->channelCount++; + if ($this->channelCount > 1 && $this->errorOnMultipleChannels) { throw new \RuntimeException("Ubuntu's OpenSSH from 5.8 to 6.9 doesn't work with multiple channels"); } + // RFC4254 defines the (client) window size as "bytes the other party can send before it must wait for the window to // be adjusted". 0x7FFFFFFF is, at 2GB, the max size. technically, it should probably be decremented, but, // honestly, if you're transferring more than 2GB, you probably shouldn't be using phpseclib, anyway. @@ -2534,11 +3000,23 @@ protected function open_channel($channel, $skip_extended = \false) // 0x8000 is the maximum max packet size, per http://tools.ietf.org/html/rfc4253#section-6.1, although since PuTTy // uses 0x4000, that's what will be used here, as well. $packet_size = 0x4000; - $packet = Strings::packSSH2('CsN3', NET_SSH2_MSG_CHANNEL_OPEN, 'session', $channel, $this->window_size_server_to_client[$channel], $packet_size); + + $packet = Strings::packSSH2( + 'CsN3', + NET_SSH2_MSG_CHANNEL_OPEN, + 'session', + $channel, + $this->window_size_server_to_client[$channel], + $packet_size + ); + $this->send_binary_packet($packet); + $this->channel_status[$channel] = NET_SSH2_MSG_CHANNEL_OPEN; + return $this->get_channel_packet($channel, $skip_extended); } + /** * Creates an interactive shell * @@ -2558,15 +3036,16 @@ public function openShell() if (!$this->isAuthenticated()) { throw new InsufficientSetupException('Operation disallowed prior to login()'); } + $this->open_channel(self::CHANNEL_SHELL); - $terminal_modes = \pack('C', NET_SSH2_TTY_OP_END); + + $terminal_modes = pack('C', NET_SSH2_TTY_OP_END); $packet = Strings::packSSH2( 'CNsbsN4s', NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[self::CHANNEL_SHELL], 'pty-req', - \true, - // want reply + true, // want reply $this->term, $this->windowColumns, $this->windowRows, @@ -2574,22 +3053,38 @@ public function openShell() 0, $terminal_modes ); + $this->send_binary_packet($packet); + $this->channel_status[self::CHANNEL_SHELL] = NET_SSH2_MSG_CHANNEL_REQUEST; + if (!$this->get_channel_packet(self::CHANNEL_SHELL)) { throw new \RuntimeException('Unable to request pty'); } - $packet = Strings::packSSH2('CNsb', NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[self::CHANNEL_SHELL], 'shell', \true); + + $packet = Strings::packSSH2( + 'CNsb', + NET_SSH2_MSG_CHANNEL_REQUEST, + $this->server_channels[self::CHANNEL_SHELL], + 'shell', + true // want reply + ); $this->send_binary_packet($packet); + $response = $this->get_channel_packet(self::CHANNEL_SHELL); - if ($response === \false) { + if ($response === false) { throw new \RuntimeException('Unable to request shell'); } + $this->channel_status[self::CHANNEL_SHELL] = NET_SSH2_MSG_CHANNEL_DATA; + $this->channel_id_last_interactive = self::CHANNEL_SHELL; + $this->bitmap |= self::MASK_SHELL; - return \true; + + return true; } + /** * Return the channel to be used with read(), write(), and reset(), if none were specified * @deprecated for lack of transparency in intended channel target, to be potentially replaced @@ -2601,7 +3096,7 @@ public function openShell() */ private function get_interactive_channel() { - switch (\true) { + switch (true) { case $this->is_channel_status_data(self::CHANNEL_SUBSYSTEM): return self::CHANNEL_SUBSYSTEM; case $this->is_channel_status_data(self::CHANNEL_EXEC): @@ -2610,6 +3105,7 @@ private function get_interactive_channel() return self::CHANNEL_SHELL; } } + /** * Indicates the DATA status on the given channel * @@ -2620,6 +3116,7 @@ private function is_channel_status_data($channel) { return isset($this->channel_status[$channel]) && $this->channel_status[$channel] == NET_SSH2_MSG_CHANNEL_DATA; } + /** * Return an available open channel * @@ -2633,8 +3130,10 @@ private function get_open_channel() return $channel; } } while ($channel++ < self::CHANNEL_SUBSYSTEM); - return \false; + + return false; } + /** * Request agent forwarding of remote server * @@ -2643,18 +3142,31 @@ private function get_open_channel() public function requestAgentForwarding() { $request_channel = $this->get_open_channel(); - if ($request_channel === \false) { - return \false; + if ($request_channel === false) { + return false; } - $packet = Strings::packSSH2('CNsC', NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[$request_channel], 'auth-agent-req@openssh.com', 1); + + $packet = Strings::packSSH2( + 'CNsC', + NET_SSH2_MSG_CHANNEL_REQUEST, + $this->server_channels[$request_channel], + 'auth-agent-req@openssh.com', + 1 + ); + $this->channel_status[$request_channel] = NET_SSH2_MSG_CHANNEL_REQUEST; + $this->send_binary_packet($packet); + if (!$this->get_channel_packet($request_channel)) { - return \false; + return false; } + $this->channel_status[$request_channel] = NET_SSH2_MSG_CHANNEL_OPEN; - return \true; + + return true; } + /** * Returns the output of an interactive shell * @@ -2681,11 +3193,14 @@ public function read($expect = '', $mode = self::READ_SIMPLE, $channel = null) if (!$this->isAuthenticated()) { throw new InsufficientSetupException('Operation disallowed prior to login()'); } + $this->curTimeout = $this->timeout; - $this->is_timeout = \false; + $this->is_timeout = false; + if ($channel === null) { $channel = $this->get_interactive_channel(); } + if (!$this->is_channel_status_data($channel) && empty($this->channel_buffers[$channel])) { if ($channel != self::CHANNEL_SHELL) { throw new InsufficientSetupException('Data is not available on channel'); @@ -2693,26 +3208,30 @@ public function read($expect = '', $mode = self::READ_SIMPLE, $channel = null) throw new \RuntimeException('Unable to initiate an interactive shell session'); } } + if ($mode == self::READ_NEXT) { return $this->get_channel_packet($channel); } + $match = $expect; - while (\true) { + while (true) { if ($mode == self::READ_REGEX) { - \preg_match($expect, \substr($this->interactiveBuffer, -1024), $matches); + preg_match($expect, substr($this->interactiveBuffer, -1024), $matches); $match = isset($matches[0]) ? $matches[0] : ''; } - $pos = \strlen($match) ? \strpos($this->interactiveBuffer, $match) : \false; - if ($pos !== \false) { - return Strings::shift($this->interactiveBuffer, $pos + \strlen($match)); + $pos = strlen($match) ? strpos($this->interactiveBuffer, $match) : false; + if ($pos !== false) { + return Strings::shift($this->interactiveBuffer, $pos + strlen($match)); } $response = $this->get_channel_packet($channel); - if ($response === \true) { - return Strings::shift($this->interactiveBuffer, \strlen($this->interactiveBuffer)); + if ($response === true) { + return Strings::shift($this->interactiveBuffer, strlen($this->interactiveBuffer)); } + $this->interactiveBuffer .= $response; } } + /** * Inputs a command into an interactive shell. * @@ -2736,9 +3255,11 @@ public function write($cmd, $channel = null) if (!$this->isAuthenticated()) { throw new InsufficientSetupException('Operation disallowed prior to login()'); } + if ($channel === null) { $channel = $this->get_interactive_channel(); } + if (!$this->is_channel_status_data($channel)) { if ($channel != self::CHANNEL_SHELL) { throw new InsufficientSetupException('Data is not available on channel'); @@ -2746,10 +3267,12 @@ public function write($cmd, $channel = null) throw new \RuntimeException('Unable to initiate an interactive shell session'); } } + $this->curTimeout = $this->timeout; - $this->is_timeout = \false; + $this->is_timeout = false; $this->send_channel_packet($channel, $cmd); } + /** * Start a subsystem. * @@ -2766,16 +3289,30 @@ public function write($cmd, $channel = null) public function startSubsystem($subsystem) { $this->open_channel(self::CHANNEL_SUBSYSTEM); - $packet = Strings::packSSH2('CNsCs', NET_SSH2_MSG_CHANNEL_REQUEST, $this->server_channels[self::CHANNEL_SUBSYSTEM], 'subsystem', 1, $subsystem); + + $packet = Strings::packSSH2( + 'CNsCs', + NET_SSH2_MSG_CHANNEL_REQUEST, + $this->server_channels[self::CHANNEL_SUBSYSTEM], + 'subsystem', + 1, + $subsystem + ); $this->send_binary_packet($packet); + $this->channel_status[self::CHANNEL_SUBSYSTEM] = NET_SSH2_MSG_CHANNEL_REQUEST; + if (!$this->get_channel_packet(self::CHANNEL_SUBSYSTEM)) { - return \false; + return false; } + $this->channel_status[self::CHANNEL_SUBSYSTEM] = NET_SSH2_MSG_CHANNEL_DATA; + $this->channel_id_last_interactive = self::CHANNEL_SUBSYSTEM; - return \true; + + return true; } + /** * Stops a subsystem. * @@ -2787,8 +3324,9 @@ public function stopSubsystem() if ($this->isInteractiveChannelOpen(self::CHANNEL_SUBSYSTEM)) { $this->close_channel(self::CHANNEL_SUBSYSTEM); } - return \true; + return true; } + /** * Closes a channel * @@ -2812,6 +3350,7 @@ public function reset($channel = null) $this->close_channel($channel); } } + /** * Send EOF on a channel * @@ -2826,11 +3365,13 @@ public function sendEOF($channel = null) if ($channel === null) { $channel = $this->get_interactive_channel(); } + $excludeStatuses = [NET_SSH2_MSG_CHANNEL_EOF, NET_SSH2_MSG_CHANNEL_CLOSE]; - if (isset($this->channel_status[$channel]) && !\in_array($this->channel_status[$channel], $excludeStatuses)) { - $this->send_binary_packet(\pack('CN', NET_SSH2_MSG_CHANNEL_EOF, $this->server_channels[$channel])); + if (isset($this->channel_status[$channel]) && !in_array($this->channel_status[$channel], $excludeStatuses)) { + $this->send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_EOF, $this->server_channels[$channel])); } } + /** * Is timeout? * @@ -2841,6 +3382,7 @@ public function isTimeout() { return $this->is_timeout; } + /** * Disconnect * @@ -2848,11 +3390,12 @@ public function isTimeout() public function disconnect() { $this->disconnect_helper(NET_SSH2_DISCONNECT_BY_APPLICATION); - if (isset($this->realtime_log_file) && \is_resource($this->realtime_log_file)) { - \fclose($this->realtime_log_file); + if (isset($this->realtime_log_file) && is_resource($this->realtime_log_file)) { + fclose($this->realtime_log_file); } unset(self::$connections[$this->getResourceId()]); } + /** * Destructor. * @@ -2864,6 +3407,7 @@ public function __destruct() { $this->disconnect(); } + /** * Is the connection still active? * @@ -2881,24 +3425,26 @@ public function __destruct() */ public function isConnected($level = 0) { - if (!\is_int($level) || $level < 0 || $level > 2) { + if (!is_int($level) || $level < 0 || $level > 2) { throw new \InvalidArgumentException('$level must be 0, 1 or 2'); } + if ($level == 0) { - return $this->bitmap & self::MASK_CONNECTED && \is_resource($this->fsock) && !\feof($this->fsock); + return ($this->bitmap & self::MASK_CONNECTED) && is_resource($this->fsock) && !feof($this->fsock); } try { if ($level == 1) { - $this->send_binary_packet(\pack('CN', NET_SSH2_MSG_IGNORE, 0)); + $this->send_binary_packet(pack('CN', NET_SSH2_MSG_IGNORE, 0)); } else { $this->open_channel(self::CHANNEL_KEEP_ALIVE); $this->close_channel(self::CHANNEL_KEEP_ALIVE); } - return \true; + return true; } catch (\Exception $e) { - return \false; + return false; } } + /** * Have you successfully been logged in? * @@ -2908,6 +3454,7 @@ public function isAuthenticated() { return (bool) ($this->bitmap & self::MASK_LOGIN); } + /** * Is the interactive shell active? * @@ -2917,6 +3464,7 @@ public function isShellOpen() { return $this->isInteractiveChannelOpen(self::CHANNEL_SHELL); } + /** * Is the exec pty active? * @@ -2926,6 +3474,7 @@ public function isPTYOpen() { return $this->isInteractiveChannelOpen(self::CHANNEL_EXEC); } + /** * Is the given interactive channel active? * @@ -2936,6 +3485,7 @@ public function isInteractiveChannelOpen($channel) { return $this->isAuthenticated() && $this->is_channel_status_data($channel); } + /** * Returns a channel identifier, presently of the last interactive channel opened, regardless of current status. * Returns 0 if no interactive channel has been opened. @@ -2947,6 +3497,7 @@ public function getInteractiveChannelId() { return $this->channel_id_last_interactive; } + /** * Pings a server connection, or tries to reconnect if the connection has gone down * @@ -2960,16 +3511,19 @@ public function ping() if (!empty($this->auth)) { return $this->reconnect(); } - return \false; + return false; } + try { $this->open_channel(self::CHANNEL_KEEP_ALIVE); } catch (\RuntimeException $e) { return $this->reconnect(); } + $this->close_channel(self::CHANNEL_KEEP_ALIVE); - return \true; + return true; } + /** * In situ reconnect method * @@ -2984,22 +3538,23 @@ private function reconnect() } return $result; } + /** * Resets a connection for re-use */ protected function reset_connection() { - if (\is_resource($this->fsock) && \get_resource_type($this->fsock) === 'stream') { - \fclose($this->fsock); + if (is_resource($this->fsock) && get_resource_type($this->fsock) === 'stream') { + fclose($this->fsock); } $this->fsock = null; $this->bitmap = 0; $this->binary_packet_buffer = null; - $this->decrypt = $this->encrypt = \false; + $this->decrypt = $this->encrypt = false; $this->decrypt_block_size = $this->encrypt_block_size = 8; - $this->hmac_check = $this->hmac_create = \false; - $this->hmac_size = \false; - $this->session_id = \false; + $this->hmac_check = $this->hmac_create = false; + $this->hmac_size = false; + $this->session_id = false; $this->last_packet = null; $this->get_seq_no = $this->send_seq_no = 0; $this->channel_status = []; @@ -3007,27 +3562,29 @@ protected function reset_connection() $this->channel_buffers = []; $this->channel_buffers_write = []; } + /** * @return int[] second and microsecond stream timeout options based on user-requested timeout and keep-alive, or the default socket timeout by default, which mirrors PHP socket streams. */ private function get_stream_timeout() { - $sec = \ini_get('default_socket_timeout'); + $sec = ini_get('default_socket_timeout'); $usec = 0; if ($this->curTimeout > 0) { - $sec = (int) \floor($this->curTimeout); + $sec = (int) floor($this->curTimeout); $usec = (int) (1000000 * ($this->curTimeout - $sec)); } if ($this->keepAlive > 0) { - $elapsed = \microtime(\true) - $this->last_packet; - $timeout = \max($this->keepAlive - $elapsed, 0); + $elapsed = microtime(true) - $this->last_packet; + $timeout = max($this->keepAlive - $elapsed, 0); if (!$this->curTimeout || $timeout < $this->curTimeout) { - $sec = (int) \floor($timeout); + $sec = (int) floor($timeout); $usec = (int) (1000000 * ($timeout - $sec)); } } return [$sec, $usec]; } + /** * Retrieves the next packet with added timeout and type handling * @@ -3039,9 +3596,10 @@ private function get_binary_packet_or_close(...$message_types) { try { $packet = $this->get_binary_packet(); - if (\count($message_types) > 0 && !\in_array(\ord($packet[0]), $message_types)) { + if (count($message_types) > 0 && !in_array(ord($packet[0]), $message_types)) { $this->disconnect_helper(NET_SSH2_DISCONNECT_PROTOCOL_ERROR); - throw new ConnectionClosedException('Bad message type. Expected: #' . \implode(', #', $message_types) . '. Got: #' . \ord($packet[0])); + throw new ConnectionClosedException('Bad message type. Expected: #' + . implode(', #', $message_types) . '. Got: #' . ord($packet[0])); } return $packet; } catch (TimeoutException $e) { @@ -3049,6 +3607,7 @@ private function get_binary_packet_or_close(...$message_types) throw new ConnectionClosedException('Connection closed due to timeout'); } } + /** * Gets Binary Packets * @@ -3061,50 +3620,48 @@ private function get_binary_packet_or_close(...$message_types) */ private function get_binary_packet() { - if (!\is_resource($this->fsock)) { + if (!is_resource($this->fsock)) { throw new \InvalidArgumentException('fsock is not a resource.'); } - if (!$this->keyExchangeInProgress && \count($this->kex_buffer)) { - return $this->filter(\array_shift($this->kex_buffer)); + if (!$this->keyExchangeInProgress && count($this->kex_buffer)) { + return $this->filter(array_shift($this->kex_buffer)); } if ($this->binary_packet_buffer == null) { // buffer the packet to permit continued reads across timeouts $this->binary_packet_buffer = (object) [ - 'read_time' => 0, - // the time to read the packet from the socket - 'raw' => '', - // the raw payload read from the socket - 'plain' => '', - // the packet in plain text, excluding packet_length header - 'packet_length' => null, - // the packet_length value pulled from the payload - 'size' => $this->decrypt_block_size, + 'read_time' => 0, // the time to read the packet from the socket + 'raw' => '', // the raw payload read from the socket + 'plain' => '', // the packet in plain text, excluding packet_length header + 'packet_length' => null, // the packet_length value pulled from the payload + 'size' => $this->decrypt_block_size, // the total size of this packet to be read from the socket + // initialize to read single block until packet_length is available ]; } $packet = $this->binary_packet_buffer; - while (\strlen($packet->raw) < $packet->size) { - if (\feof($this->fsock)) { + while (strlen($packet->raw) < $packet->size) { + if (feof($this->fsock)) { $this->disconnect_helper(NET_SSH2_DISCONNECT_CONNECTION_LOST); throw new ConnectionClosedException('Connection closed by server'); } if ($this->curTimeout < 0) { - $this->is_timeout = \true; + $this->is_timeout = true; throw new TimeoutException('Timed out waiting for server'); } $this->send_keep_alive(); + list($sec, $usec) = $this->get_stream_timeout(); - \stream_set_timeout($this->fsock, $sec, $usec); - $start = \microtime(\true); - $raw = \stream_get_contents($this->fsock, $packet->size - \strlen($packet->raw)); - $elapsed = \microtime(\true) - $start; + stream_set_timeout($this->fsock, $sec, $usec); + $start = microtime(true); + $raw = stream_get_contents($this->fsock, $packet->size - strlen($packet->raw)); + $elapsed = microtime(true) - $start; $packet->read_time += $elapsed; if ($this->curTimeout > 0) { $this->curTimeout -= $elapsed; } - if ($raw === \false) { + if ($raw === false) { $this->disconnect_helper(NET_SSH2_DISCONNECT_CONNECTION_LOST); throw new ConnectionClosedException('Connection closed by server'); - } elseif (!\strlen($raw)) { + } elseif (!strlen($raw)) { continue; } $packet->raw .= $raw; @@ -3112,7 +3669,8 @@ private function get_binary_packet() $this->get_binary_packet_size($packet); } } - if (\strlen($packet->raw) != $packet->size) { + + if (strlen($packet->raw) != $packet->size) { throw new \RuntimeException('Size of packet was not expected length'); } // destroy buffer as packet represents the entire payload and should be processed in full @@ -3127,7 +3685,10 @@ private function get_binary_packet() switch ($this->decryptName) { case 'aes128-gcm@openssh.com': case 'aes256-gcm@openssh.com': - $this->decrypt->setNonce($this->decryptFixedPart . $this->decryptInvocationCounter); + $this->decrypt->setNonce( + $this->decryptFixedPart . + $this->decryptInvocationCounter + ); Strings::increment_str($this->decryptInvocationCounter); $this->decrypt->setAAD(Strings::shift($raw, $packet_length_header_size)); $this->decrypt->setTag(Strings::pop($raw, $this->decrypt_block_size)); @@ -3135,15 +3696,17 @@ private function get_binary_packet() break; case 'chacha20-poly1305@openssh.com': // This should be impossible, but we are checking anyway to narrow the type for Psalm. - if (!$this->decrypt instanceof ChaCha20) { + if (!($this->decrypt instanceof ChaCha20)) { throw new \LogicException('$this->decrypt is not a ' . ChaCha20::class); } - $this->decrypt->setNonce(\pack('N2', 0, $this->get_seq_no)); + $this->decrypt->setNonce(pack('N2', 0, $this->get_seq_no)); $this->decrypt->setCounter(0); // this is the same approach that's implemented in Salsa20::createPoly1305Key() // but we don't want to use the same AEAD construction that RFC8439 describes // for ChaCha20-Poly1305 so we won't rely on it (see Salsa20::poly1305()) - $this->decrypt->setPoly1305Key($this->decrypt->encrypt(\str_repeat("\x00", 32))); + $this->decrypt->setPoly1305Key( + $this->decrypt->encrypt(str_repeat("\0", 32)) + ); $this->decrypt->setAAD(Strings::shift($raw, $packet_length_header_size)); $this->decrypt->setCounter(1); $this->decrypt->setTag(Strings::pop($raw, 16)); @@ -3153,7 +3716,7 @@ private function get_binary_packet() if (!$this->hmac_check instanceof Hash || !$this->hmac_check_etm) { // first block was already decrypted for contained packet_length header Strings::shift($raw, $this->decrypt_block_size); - if (\strlen($raw) > 0) { + if (strlen($raw) > 0) { $packet->plain .= $this->decrypt->decrypt($raw); } } else { @@ -3167,15 +3730,17 @@ private function get_binary_packet() $packet->plain = $raw; } if ($this->hmac_check instanceof Hash) { - $reconstructed = !$this->hmac_check_etm ? \pack('Na*', $packet->packet_length, $packet->plain) : \substr($packet->raw, 0, -$this->hmac_size); - if (($this->hmac_check->getHash() & "\xff\xff\xff\xff") == 'umac') { - $this->hmac_check->setNonce("\x00\x00\x00\x00" . \pack('N', $this->get_seq_no)); + $reconstructed = !$this->hmac_check_etm ? + pack('Na*', $packet->packet_length, $packet->plain) : + substr($packet->raw, 0, -$this->hmac_size); + if (($this->hmac_check->getHash() & "\xFF\xFF\xFF\xFF") == 'umac') { + $this->hmac_check->setNonce("\0\0\0\0" . pack('N', $this->get_seq_no)); if ($hmac != $this->hmac_check->hash($reconstructed)) { $this->disconnect_helper(NET_SSH2_DISCONNECT_MAC_ERROR); throw new ConnectionClosedException('Invalid UMAC'); } } else { - if ($hmac != $this->hmac_check->hash(\pack('Na*', $this->get_seq_no, $reconstructed))) { + if ($hmac != $this->hmac_check->hash(pack('Na*', $this->get_seq_no, $reconstructed))) { $this->disconnect_helper(NET_SSH2_DISCONNECT_MAC_ERROR); throw new ConnectionClosedException('Invalid HMAC'); } @@ -3183,64 +3748,75 @@ private function get_binary_packet() } $padding_length = 0; $payload = $packet->plain; - $padding_length = \unpack('Cpadding_length', Strings::shift($payload, 1))['padding_length']; + $padding_length = unpack('Cpadding_length', Strings::shift($payload, 1))['padding_length']; if ($padding_length > 0) { Strings::pop($payload, $padding_length); } + if (!$this->keyExchangeInProgress) { $this->bytesTransferredSinceLastKEX += $packet->packet_length + $padding_length + 5; } + if (empty($payload)) { $this->disconnect_helper(NET_SSH2_DISCONNECT_PROTOCOL_ERROR); throw new ConnectionClosedException('Plaintext is too short'); } + switch ($this->decompress) { case self::NET_SSH2_COMPRESSION_ZLIB_AT_OPENSSH: if (!$this->isAuthenticated()) { break; } - // fall-through + // fall-through case self::NET_SSH2_COMPRESSION_ZLIB: if ($this->regenerate_decompression_context) { - $this->regenerate_decompression_context = \false; - $cmf = \ord($payload[0]); - $cm = $cmf & 0xf; - if ($cm != 8) { - // deflate - throw new UnsupportedAlgorithmException("Only CM = 8 ('deflate') is supported ({$cm})"); + $this->regenerate_decompression_context = false; + + $cmf = ord($payload[0]); + $cm = $cmf & 0x0F; + if ($cm != 8) { // deflate + throw new UnsupportedAlgorithmException("Only CM = 8 ('deflate') is supported ($cm)"); } - $cinfo = ($cmf & 0xf0) >> 4; + $cinfo = ($cmf & 0xF0) >> 4; if ($cinfo > 7) { - throw new \RuntimeException("CINFO above 7 is not allowed ({$cinfo})"); + throw new \RuntimeException("CINFO above 7 is not allowed ($cinfo)"); } - $windowSize = 1 << $cinfo + 8; - $flg = \ord($payload[1]); + $windowSize = 1 << ($cinfo + 8); + + $flg = ord($payload[1]); //$fcheck = $flg && 0x0F; - if (($cmf << 8 | $flg) % 31) { + if ((($cmf << 8) | $flg) % 31) { throw new \RuntimeException('fcheck failed'); } - $fdict = \boolval($flg & 0x20); - $flevel = ($flg & 0xc0) >> 6; - $this->decompress_context = \inflate_init(\ZLIB_ENCODING_RAW, ['window' => $cinfo + 8]); - $payload = \substr($payload, 2); + $fdict = boolval($flg & 0x20); + $flevel = ($flg & 0xC0) >> 6; + + $this->decompress_context = inflate_init(ZLIB_ENCODING_RAW, ['window' => $cinfo + 8]); + $payload = substr($payload, 2); } if ($this->decompress_context) { - $payload = \inflate_add($this->decompress_context, $payload, \ZLIB_PARTIAL_FLUSH); + $payload = inflate_add($this->decompress_context, $payload, ZLIB_PARTIAL_FLUSH); } } + $this->get_seq_no++; - if (\defined('NET_SSH2_LOGGING')) { - $current = \microtime(\true); - $message_number = isset(self::$message_numbers[\ord($payload[0])]) ? self::$message_numbers[\ord($payload[0])] : 'UNKNOWN (' . \ord($payload[0]) . ')'; - $message_number = '<- ' . $message_number . ' (since last: ' . \round($current - $this->last_packet, 4) . ', network: ' . \round($packet->read_time, 4) . 's)'; + + if (defined('NET_SSH2_LOGGING')) { + $current = microtime(true); + $message_number = isset(self::$message_numbers[ord($payload[0])]) ? self::$message_numbers[ord($payload[0])] : 'UNKNOWN (' . ord($payload[0]) . ')'; + $message_number = '<- ' . $message_number . + ' (since last: ' . round($current - $this->last_packet, 4) . ', network: ' . round($packet->read_time, 4) . 's)'; $this->append_log($message_number, $payload); } - $this->last_packet = \microtime(\true); + $this->last_packet = microtime(true); + if ($this->bytesTransferredSinceLastKEX > $this->doKeyReexchangeAfterXBytes) { $this->key_exchange(); } + return $this->filter($payload); } + /** * @param object $packet The packet object being constructed, passed by reference * The size, packet_length, and plain properties of this object may be modified in processing @@ -3249,51 +3825,51 @@ private function get_binary_packet() private function get_binary_packet_size(&$packet) { $packet_length_header_size = 4; - if (\strlen($packet->raw) < $packet_length_header_size) { + if (strlen($packet->raw) < $packet_length_header_size) { return; } $packet_length = 0; - $added_validation_length = 0; - // indicates when the packet length header is included when validating packet length against block size + $added_validation_length = 0; // indicates when the packet length header is included when validating packet length against block size if ($this->decrypt) { switch ($this->decryptName) { case 'aes128-gcm@openssh.com': case 'aes256-gcm@openssh.com': - $packet_length = \unpack('Npacket_length', \substr($packet->raw, 0, $packet_length_header_size))['packet_length']; - $packet->size = $packet_length_header_size + $packet_length + $this->decrypt_block_size; - // expect tag + $packet_length = unpack('Npacket_length', substr($packet->raw, 0, $packet_length_header_size))['packet_length']; + $packet->size = $packet_length_header_size + $packet_length + $this->decrypt_block_size; // expect tag break; case 'chacha20-poly1305@openssh.com': - $this->lengthDecrypt->setNonce(\pack('N2', 0, $this->get_seq_no)); - $packet_length_header = $this->lengthDecrypt->decrypt(\substr($packet->raw, 0, $packet_length_header_size)); - $packet_length = \unpack('Npacket_length', $packet_length_header)['packet_length']; - $packet->size = $packet_length_header_size + $packet_length + 16; - // expect tag + $this->lengthDecrypt->setNonce(pack('N2', 0, $this->get_seq_no)); + $packet_length_header = $this->lengthDecrypt->decrypt(substr($packet->raw, 0, $packet_length_header_size)); + $packet_length = unpack('Npacket_length', $packet_length_header)['packet_length']; + $packet->size = $packet_length_header_size + $packet_length + 16; // expect tag break; default: if (!$this->hmac_check instanceof Hash || !$this->hmac_check_etm) { - if (\strlen($packet->raw) < $this->decrypt_block_size) { + if (strlen($packet->raw) < $this->decrypt_block_size) { return; } - $packet->plain = $this->decrypt->decrypt(\substr($packet->raw, 0, $this->decrypt_block_size)); - $packet_length = \unpack('Npacket_length', Strings::shift($packet->plain, $packet_length_header_size))['packet_length']; + $packet->plain = $this->decrypt->decrypt(substr($packet->raw, 0, $this->decrypt_block_size)); + $packet_length = unpack('Npacket_length', Strings::shift($packet->plain, $packet_length_header_size))['packet_length']; $packet->size = $packet_length_header_size + $packet_length; $added_validation_length = $packet_length_header_size; } else { - $packet_length = \unpack('Npacket_length', \substr($packet->raw, 0, $packet_length_header_size))['packet_length']; + $packet_length = unpack('Npacket_length', substr($packet->raw, 0, $packet_length_header_size))['packet_length']; $packet->size = $packet_length_header_size + $packet_length; } break; } } else { - $packet_length = \unpack('Npacket_length', \substr($packet->raw, 0, $packet_length_header_size))['packet_length']; + $packet_length = unpack('Npacket_length', substr($packet->raw, 0, $packet_length_header_size))['packet_length']; $packet->size = $packet_length_header_size + $packet_length; $added_validation_length = $packet_length_header_size; } // quoting , // "implementations SHOULD check that the packet length is reasonable" // PuTTY uses 0x9000 as the actual max packet size and so to shall we - if ($packet_length <= 0 || $packet_length > 0x9000 || ($packet_length + $added_validation_length) % $this->decrypt_block_size != 0) { + if ( + $packet_length <= 0 || $packet_length > 0x9000 + || ($packet_length + $added_validation_length) % $this->decrypt_block_size != 0 + ) { $this->disconnect_helper(NET_SSH2_DISCONNECT_PROTOCOL_ERROR); throw new InvalidPacketLengthException('Invalid packet length'); } @@ -3302,6 +3878,7 @@ private function get_binary_packet_size(&$packet) } $packet->packet_length = $packet_length; } + /** * Handle Disconnect * @@ -3316,10 +3893,11 @@ private function handleDisconnect($payload) { Strings::shift($payload, 1); list($reason_code, $message) = Strings::unpackSSH2('Ns', $payload); - $this->errors[] = 'SSH_MSG_DISCONNECT: ' . self::$disconnect_reasons[$reason_code] . "\r\n{$message}"; + $this->errors[] = 'SSH_MSG_DISCONNECT: ' . self::$disconnect_reasons[$reason_code] . "\r\n$message"; $this->disconnect_helper(NET_SSH2_DISCONNECT_CONNECTION_LOST); throw new ConnectionClosedException('Connection closed by server'); } + /** * Filter Binary Packets * @@ -3331,29 +3909,29 @@ private function handleDisconnect($payload) */ private function filter($payload) { - if (\ord($payload[0]) == NET_SSH2_MSG_DISCONNECT) { + if (ord($payload[0]) == NET_SSH2_MSG_DISCONNECT) { return $this->handleDisconnect($payload); } - if ($this->session_id === \false && $this->keyExchangeInProgress) { + + if ($this->session_id === false && $this->keyExchangeInProgress) { return $payload; } - switch (\ord($payload[0])) { + + switch (ord($payload[0])) { case NET_SSH2_MSG_IGNORE: $payload = $this->get_binary_packet(); break; case NET_SSH2_MSG_DEBUG: - Strings::shift($payload, 2); - // second byte is "always_display" + Strings::shift($payload, 2); // second byte is "always_display" list($message) = Strings::unpackSSH2('s', $payload); - $this->errors[] = "SSH_MSG_DEBUG: {$message}"; + $this->errors[] = "SSH_MSG_DEBUG: $message"; $payload = $this->get_binary_packet(); break; case NET_SSH2_MSG_UNIMPLEMENTED: - break; - // return payload + break; // return payload case NET_SSH2_MSG_KEXINIT: // this is here for server initiated key re-exchanges after the initial key exchange - if (!$this->keyExchangeInProgress && $this->session_id !== \false) { + if (!$this->keyExchangeInProgress && $this->session_id !== false) { if (!$this->key_exchange($payload)) { $this->disconnect_helper(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); throw new ConnectionClosedException('Key exchange failed'); @@ -3367,64 +3945,64 @@ private function filter($payload) for ($i = 0; $i < $nr_extensions; $i++) { list($extension_name, $extension_value) = Strings::unpackSSH2('ss', $payload); if ($extension_name == 'server-sig-algs') { - $this->supported_private_key_algorithms = \explode(',', $extension_value); + $this->supported_private_key_algorithms = explode(',', $extension_value); } } $payload = $this->get_binary_packet(); } + /* Once a party has sent a SSH_MSG_KEXINIT message for key exchange or re-exchange, until it has sent a SSH_MSG_NEWKEYS message (Section 7.3), it MUST NOT send any messages other than: - + o Transport layer generic messages (1 to 19) (but SSH_MSG_SERVICE_REQUEST and SSH_MSG_SERVICE_ACCEPT MUST NOT be sent); - + o Algorithm negotiation messages (20 to 29) (but further SSH_MSG_KEXINIT messages MUST NOT be sent); - + o Specific key exchange method messages (30 to 49). - + -- https://www.rfc-editor.org/rfc/rfc4253#section-7.1 */ if ($this->keyExchangeInProgress) { return $payload; } + // see http://tools.ietf.org/html/rfc4252#section-5.4; only called when the encryption has been activated and when we haven't already logged in - if ($this->bitmap & self::MASK_CONNECTED && !$this->isAuthenticated() && \ord($payload[0]) == NET_SSH2_MSG_USERAUTH_BANNER) { + if (($this->bitmap & self::MASK_CONNECTED) && !$this->isAuthenticated() && ord($payload[0]) == NET_SSH2_MSG_USERAUTH_BANNER) { Strings::shift($payload, 1); list($this->banner_message) = Strings::unpackSSH2('s', $payload); $payload = $this->get_binary_packet(); } + // only called when we've already logged in - if ($this->bitmap & self::MASK_CONNECTED && $this->isAuthenticated()) { - switch (\ord($payload[0])) { + if (($this->bitmap & self::MASK_CONNECTED) && $this->isAuthenticated()) { + switch (ord($payload[0])) { case NET_SSH2_MSG_CHANNEL_REQUEST: - if (\strlen($payload) == 31) { - $unpacked = \unpack('cpacket_type/Nchannel/Nlength', $payload); + if (strlen($payload) == 31) { + $unpacked = unpack('cpacket_type/Nchannel/Nlength', $payload); $packet_type = $unpacked['packet_type']; $channel = $unpacked['channel']; $length = $unpacked['length']; - if (\substr($payload, 9, $length) == 'keepalive@openssh.com' && isset($this->server_channels[$channel])) { - if (\ord(\substr($payload, 9 + $length))) { - // want reply - $this->send_binary_packet(\pack('CN', NET_SSH2_MSG_CHANNEL_SUCCESS, $this->server_channels[$channel])); + if (substr($payload, 9, $length) == 'keepalive@openssh.com' && isset($this->server_channels[$channel])) { + if (ord(substr($payload, 9 + $length))) { // want reply + $this->send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_SUCCESS, $this->server_channels[$channel])); } $payload = $this->get_binary_packet(); } } break; - case NET_SSH2_MSG_GLOBAL_REQUEST: - // see http://tools.ietf.org/html/rfc4254#section-4 + case NET_SSH2_MSG_GLOBAL_REQUEST: // see http://tools.ietf.org/html/rfc4254#section-4 Strings::shift($payload, 1); list($request_name) = Strings::unpackSSH2('s', $payload); - $this->errors[] = "SSH_MSG_GLOBAL_REQUEST: {$request_name}"; - $this->send_binary_packet(\pack('C', NET_SSH2_MSG_REQUEST_FAILURE)); + $this->errors[] = "SSH_MSG_GLOBAL_REQUEST: $request_name"; + $this->send_binary_packet(pack('C', NET_SSH2_MSG_REQUEST_FAILURE)); $payload = $this->get_binary_packet(); break; - case NET_SSH2_MSG_CHANNEL_OPEN: - // see http://tools.ietf.org/html/rfc4254#section-5.1 + case NET_SSH2_MSG_CHANNEL_OPEN: // see http://tools.ietf.org/html/rfc4254#section-5.1 Strings::shift($payload, 1); list($data, $server_channel) = Strings::unpackSSH2('sN', $payload); switch ($data) { @@ -3432,12 +4010,27 @@ private function filter($payload) case 'auth-agent@openssh.com': if (isset($this->agent)) { $new_channel = self::CHANNEL_AGENT_FORWARD; - list($remote_window_size, $remote_maximum_packet_size) = Strings::unpackSSH2('NN', $payload); + + list( + $remote_window_size, + $remote_maximum_packet_size + ) = Strings::unpackSSH2('NN', $payload); + $this->packet_size_client_to_server[$new_channel] = $remote_window_size; $this->window_size_server_to_client[$new_channel] = $remote_maximum_packet_size; $this->window_size_client_to_server[$new_channel] = $this->window_size; + $packet_size = 0x4000; - $packet = \pack('CN4', NET_SSH2_MSG_CHANNEL_OPEN_CONFIRMATION, $server_channel, $new_channel, $packet_size, $packet_size); + + $packet = pack( + 'CN4', + NET_SSH2_MSG_CHANNEL_OPEN_CONFIRMATION, + $server_channel, + $new_channel, + $packet_size, + $packet_size + ); + $this->server_channels[$new_channel] = $server_channel; $this->channel_status[$new_channel] = NET_SSH2_MSG_CHANNEL_OPEN_CONFIRMATION; $this->send_binary_packet($packet); @@ -3449,18 +4042,20 @@ private function filter($payload) NET_SSH2_MSG_CHANNEL_OPEN_FAILURE, $server_channel, NET_SSH2_OPEN_ADMINISTRATIVELY_PROHIBITED, - '', - // description - '' + '', // description + '' // language tag ); $this->send_binary_packet($packet); } + $payload = $this->get_binary_packet(); break; } } + return $payload; } + /** * Enable Quiet Mode * @@ -3469,8 +4064,9 @@ private function filter($payload) */ public function enableQuietMode() { - $this->quiet_mode = \true; + $this->quiet_mode = true; } + /** * Disable Quiet Mode * @@ -3479,8 +4075,9 @@ public function enableQuietMode() */ public function disableQuietMode() { - $this->quiet_mode = \false; + $this->quiet_mode = false; } + /** * Returns whether Quiet Mode is enabled or not * @@ -3492,14 +4089,16 @@ public function isQuietModeEnabled() { return $this->quiet_mode; } + /** * Enable request-pty when using exec() * */ public function enablePTY() { - $this->request_pty = \true; + $this->request_pty = true; } + /** * Disable request-pty when using exec() * @@ -3509,8 +4108,9 @@ public function disablePTY() if ($this->isPTYOpen()) { $this->close_channel(self::CHANNEL_EXEC); } - $this->request_pty = \false; + $this->request_pty = false; } + /** * Returns whether request-pty is enabled or not * @@ -3522,6 +4122,7 @@ public function isPTYEnabled() { return $this->request_pty; } + /** * Gets channel data * @@ -3546,53 +4147,58 @@ public function isPTYEnabled() * @return mixed * @throws \RuntimeException on connection error */ - protected function get_channel_packet($client_channel, $skip_extended = \false) + protected function get_channel_packet($client_channel, $skip_extended = false) { if (!empty($this->channel_buffers[$client_channel])) { // in phpseclib 4.0 this should be changed to $this->channel_status[$client_channel] ?? null switch (isset($this->channel_status[$client_channel]) ? $this->channel_status[$client_channel] : null) { case NET_SSH2_MSG_CHANNEL_REQUEST: foreach ($this->channel_buffers[$client_channel] as $i => $packet) { - switch (\ord($packet[0])) { + switch (ord($packet[0])) { case NET_SSH2_MSG_CHANNEL_SUCCESS: case NET_SSH2_MSG_CHANNEL_FAILURE: unset($this->channel_buffers[$client_channel][$i]); - return \substr($packet, 1); + return substr($packet, 1); } } break; default: - return \substr(\array_shift($this->channel_buffers[$client_channel]), 1); + return substr(array_shift($this->channel_buffers[$client_channel]), 1); } } - while (\true) { + + while (true) { try { $response = $this->get_binary_packet(); } catch (TimeoutException $e) { - return \true; + return true; } list($type) = Strings::unpackSSH2('C', $response); - if (\strlen($response) >= 4) { + if (strlen($response) >= 4) { list($channel) = Strings::unpackSSH2('N', $response); } + // will not be setup yet on incoming channel open request if (isset($channel) && isset($this->channel_status[$channel]) && isset($this->window_size_server_to_client[$channel])) { - $this->window_size_server_to_client[$channel] -= \strlen($response); + $this->window_size_server_to_client[$channel] -= strlen($response); + // resize the window, if appropriate if ($this->window_size_server_to_client[$channel] < 0) { - // PuTTY does something more analogous to the following: - //if ($this->window_size_server_to_client[$channel] < 0x3FFFFFFF) { - $packet = \pack('CNN', NET_SSH2_MSG_CHANNEL_WINDOW_ADJUST, $this->server_channels[$channel], $this->window_resize); + // PuTTY does something more analogous to the following: + //if ($this->window_size_server_to_client[$channel] < 0x3FFFFFFF) { + $packet = pack('CNN', NET_SSH2_MSG_CHANNEL_WINDOW_ADJUST, $this->server_channels[$channel], $this->window_resize); $this->send_binary_packet($packet); $this->window_size_server_to_client[$channel] += $this->window_resize; } + switch ($type) { case NET_SSH2_MSG_CHANNEL_WINDOW_ADJUST: list($window_size) = Strings::unpackSSH2('N', $response); $this->window_size_client_to_server[$channel] += $window_size; if ($channel == -$client_channel) { - return \true; + return true; } + continue 2; case NET_SSH2_MSG_CHANNEL_EXTENDED_DATA: /* @@ -3609,7 +4215,8 @@ protected function get_channel_packet($client_channel, $skip_extended = \false) if ($client_channel == $channel && $this->channel_status[$channel] == NET_SSH2_MSG_CHANNEL_DATA) { return $data; } - $this->channel_buffers[$channel][] = \chr($type) . $data; + $this->channel_buffers[$channel][] = chr($type) . $data; + continue 2; case NET_SSH2_MSG_CHANNEL_REQUEST: if (!isset($this->channel_status[$channel])) { @@ -3618,23 +4225,34 @@ protected function get_channel_packet($client_channel, $skip_extended = \false) list($value) = Strings::unpackSSH2('s', $response); switch ($value) { case 'exit-signal': - list(, $signal_name, , $error_message) = Strings::unpackSSH2('bsbs', $response); - $this->errors[] = "SSH_MSG_CHANNEL_REQUEST (exit-signal): {$signal_name}"; - if (\strlen($error_message)) { - $this->errors[\count($this->errors) - 1] .= "\r\n{$error_message}"; + list( + , // FALSE + $signal_name, + , // core dumped + $error_message + ) = Strings::unpackSSH2('bsbs', $response); + + $this->errors[] = "SSH_MSG_CHANNEL_REQUEST (exit-signal): $signal_name"; + if (strlen($error_message)) { + $this->errors[count($this->errors) - 1] .= "\r\n$error_message"; } + if (isset($this->channel_status[$channel]) && $this->channel_status[$channel] != NET_SSH2_MSG_CHANNEL_CLOSE) { if ($this->channel_status[$channel] != NET_SSH2_MSG_CHANNEL_EOF) { - $this->send_binary_packet(\pack('CN', NET_SSH2_MSG_CHANNEL_EOF, $this->server_channels[$channel])); + $this->send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_EOF, $this->server_channels[$channel])); } - $this->send_binary_packet(\pack('CN', NET_SSH2_MSG_CHANNEL_CLOSE, $this->server_channels[$channel])); + $this->send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_CLOSE, $this->server_channels[$channel])); + $this->channel_status[$channel] = NET_SSH2_MSG_CHANNEL_CLOSE; } + continue 3; case 'exit-status': list(, $this->exit_status) = Strings::unpackSSH2('CN', $response); + // "The client MAY ignore these messages." // -- http://tools.ietf.org/html/rfc4254#section-6.10 + continue 3; default: // "Some systems may not implement signals, in which case they SHOULD ignore this message." @@ -3642,17 +4260,23 @@ protected function get_channel_packet($client_channel, $skip_extended = \false) continue 3; } } + switch ($this->channel_status[$channel]) { case NET_SSH2_MSG_CHANNEL_OPEN: switch ($type) { case NET_SSH2_MSG_CHANNEL_OPEN_CONFIRMATION: - list($this->server_channels[$channel], $window_size, $this->packet_size_client_to_server[$channel]) = Strings::unpackSSH2('NNN', $response); + list( + $this->server_channels[$channel], + $window_size, + $this->packet_size_client_to_server[$channel] + ) = Strings::unpackSSH2('NNN', $response); + if ($window_size < 0) { - $window_size &= 0x7fffffff; + $window_size &= 0x7FFFFFFF; $window_size += 0x80000000; } $this->window_size_client_to_server[$channel] = $window_size; - $result = $client_channel == $channel ? \true : $this->get_channel_packet($client_channel, $skip_extended); + $result = $client_channel == $channel ? true : $this->get_channel_packet($client_channel, $skip_extended); $this->on_channel_open(); return $result; case NET_SSH2_MSG_CHANNEL_OPEN_FAILURE: @@ -3669,12 +4293,12 @@ protected function get_channel_packet($client_channel, $skip_extended = \false) case NET_SSH2_MSG_CHANNEL_REQUEST: switch ($type) { case NET_SSH2_MSG_CHANNEL_SUCCESS: - return \true; + return true; case NET_SSH2_MSG_CHANNEL_FAILURE: - return \false; + return false; case NET_SSH2_MSG_CHANNEL_DATA: list($data) = Strings::unpackSSH2('s', $response); - $this->channel_buffers[$channel][] = \chr($type) . $data; + $this->channel_buffers[$channel][] = chr($type) . $data; return $this->get_channel_packet($client_channel, $skip_extended); default: $this->disconnect_helper(NET_SSH2_DISCONNECT_BY_APPLICATION); @@ -3682,12 +4306,14 @@ protected function get_channel_packet($client_channel, $skip_extended = \false) } case NET_SSH2_MSG_CHANNEL_CLOSE: if ($client_channel == $channel && $type == NET_SSH2_MSG_CHANNEL_CLOSE) { - return \true; + return true; } return $this->get_channel_packet($client_channel, $skip_extended); } } + // ie. $this->channel_status[$channel] == NET_SSH2_MSG_CHANNEL_DATA + switch ($type) { case NET_SSH2_MSG_CHANNEL_DATA: /* @@ -3700,38 +4326,45 @@ protected function get_channel_packet($client_channel, $skip_extended = \false) } */ list($data) = Strings::unpackSSH2('s', $response); + if ($channel == self::CHANNEL_AGENT_FORWARD) { $agent_response = $this->agent->forwardData($data); - if (!\is_bool($agent_response)) { + if (!is_bool($agent_response)) { $this->send_channel_packet($channel, $agent_response); } break; } + if ($client_channel == $channel) { return $data; } - $this->channel_buffers[$channel][] = \chr($type) . $data; + $this->channel_buffers[$channel][] = chr($type) . $data; break; case NET_SSH2_MSG_CHANNEL_CLOSE: $this->curTimeout = 5; + $this->close_channel_bitmap($channel); + if ($this->channel_status[$channel] != NET_SSH2_MSG_CHANNEL_CLOSE) { - $this->send_binary_packet(\pack('CN', NET_SSH2_MSG_CHANNEL_CLOSE, $this->server_channels[$channel])); + $this->send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_CLOSE, $this->server_channels[$channel])); } + unset($this->channel_status[$channel]); $this->channelCount--; + if ($client_channel == $channel) { - return \true; + return true; } - // fall-through + // fall-through case NET_SSH2_MSG_CHANNEL_EOF: break; default: $this->disconnect_helper(NET_SSH2_DISCONNECT_BY_APPLICATION); - throw new \RuntimeException("Error reading channel data ({$type})"); + throw new \RuntimeException("Error reading channel data ($type)"); } } } + /** * Sends Binary Packets * @@ -3744,133 +4377,164 @@ protected function get_channel_packet($client_channel, $skip_extended = \false) */ protected function send_binary_packet($data, $logged = null) { - if (!\is_resource($this->fsock) || \feof($this->fsock)) { + if (!is_resource($this->fsock) || feof($this->fsock)) { $this->disconnect_helper(NET_SSH2_DISCONNECT_CONNECTION_LOST); throw new ConnectionClosedException('Connection closed prematurely'); } + if (!isset($logged)) { $logged = $data; } + switch ($this->compress) { case self::NET_SSH2_COMPRESSION_ZLIB_AT_OPENSSH: if (!$this->isAuthenticated()) { break; } - // fall-through + // fall-through case self::NET_SSH2_COMPRESSION_ZLIB: if (!$this->regenerate_compression_context) { $header = ''; } else { - $this->regenerate_compression_context = \false; - $this->compress_context = \deflate_init(\ZLIB_ENCODING_RAW, ['window' => 15]); - $header = "x\x9c"; + $this->regenerate_compression_context = false; + $this->compress_context = deflate_init(ZLIB_ENCODING_RAW, ['window' => 15]); + $header = "\x78\x9C"; } if ($this->compress_context) { - $data = $header . \deflate_add($this->compress_context, $data, \ZLIB_PARTIAL_FLUSH); + $data = $header . deflate_add($this->compress_context, $data, ZLIB_PARTIAL_FLUSH); } } + // 4 (packet length) + 1 (padding length) + 4 (minimal padding amount) == 9 - $packet_length = \strlen($data) + 9; + $packet_length = strlen($data) + 9; if ($this->encrypt && $this->encrypt->usesNonce()) { $packet_length -= 4; } // round up to the nearest $this->encrypt_block_size - $packet_length += ($this->encrypt_block_size - 1) * $packet_length % $this->encrypt_block_size; + $packet_length += (($this->encrypt_block_size - 1) * $packet_length) % $this->encrypt_block_size; // subtracting strlen($data) is obvious - subtracting 5 is necessary because of packet_length and padding_length - $padding_length = $packet_length - \strlen($data) - 5; - switch (\true) { + $padding_length = $packet_length - strlen($data) - 5; + switch (true) { case $this->encrypt && $this->encrypt->usesNonce(): case $this->hmac_create instanceof Hash && $this->hmac_create_etm: $padding_length += 4; $packet_length += 4; } + $padding = Random::string($padding_length); + // we subtract 4 from packet_length because the packet_length field isn't supposed to include itself - $packet = \pack('NCa*', $packet_length - 4, $padding_length, $data . $padding); + $packet = pack('NCa*', $packet_length - 4, $padding_length, $data . $padding); + $hmac = ''; if ($this->hmac_create instanceof Hash && !$this->hmac_create_etm) { - if (($this->hmac_create->getHash() & "\xff\xff\xff\xff") == 'umac') { - $this->hmac_create->setNonce("\x00\x00\x00\x00" . \pack('N', $this->send_seq_no)); + if (($this->hmac_create->getHash() & "\xFF\xFF\xFF\xFF") == 'umac') { + $this->hmac_create->setNonce("\0\0\0\0" . pack('N', $this->send_seq_no)); $hmac = $this->hmac_create->hash($packet); } else { - $hmac = $this->hmac_create->hash(\pack('Na*', $this->send_seq_no, $packet)); + $hmac = $this->hmac_create->hash(pack('Na*', $this->send_seq_no, $packet)); } } + if ($this->encrypt) { switch ($this->encryptName) { case 'aes128-gcm@openssh.com': case 'aes256-gcm@openssh.com': - $this->encrypt->setNonce($this->encryptFixedPart . $this->encryptInvocationCounter); + $this->encrypt->setNonce( + $this->encryptFixedPart . + $this->encryptInvocationCounter + ); Strings::increment_str($this->encryptInvocationCounter); - $this->encrypt->setAAD($temp = $packet & "\xff\xff\xff\xff"); - $packet = $temp . $this->encrypt->encrypt(\substr($packet, 4)); + $this->encrypt->setAAD($temp = ($packet & "\xFF\xFF\xFF\xFF")); + $packet = $temp . $this->encrypt->encrypt(substr($packet, 4)); break; case 'chacha20-poly1305@openssh.com': // This should be impossible, but we are checking anyway to narrow the type for Psalm. - if (!$this->encrypt instanceof ChaCha20) { + if (!($this->encrypt instanceof ChaCha20)) { throw new \LogicException('$this->encrypt is not a ' . ChaCha20::class); } - $nonce = \pack('N2', 0, $this->send_seq_no); + + $nonce = pack('N2', 0, $this->send_seq_no); + $this->encrypt->setNonce($nonce); $this->lengthEncrypt->setNonce($nonce); - $length = $this->lengthEncrypt->encrypt($packet & "\xff\xff\xff\xff"); + + $length = $this->lengthEncrypt->encrypt($packet & "\xFF\xFF\xFF\xFF"); + $this->encrypt->setCounter(0); // this is the same approach that's implemented in Salsa20::createPoly1305Key() // but we don't want to use the same AEAD construction that RFC8439 describes // for ChaCha20-Poly1305 so we won't rely on it (see Salsa20::poly1305()) - $this->encrypt->setPoly1305Key($this->encrypt->encrypt(\str_repeat("\x00", 32))); + $this->encrypt->setPoly1305Key( + $this->encrypt->encrypt(str_repeat("\0", 32)) + ); $this->encrypt->setAAD($length); $this->encrypt->setCounter(1); - $packet = $length . $this->encrypt->encrypt(\substr($packet, 4)); + $packet = $length . $this->encrypt->encrypt(substr($packet, 4)); break; default: - $packet = $this->hmac_create instanceof Hash && $this->hmac_create_etm ? ($packet & "\xff\xff\xff\xff") . $this->encrypt->encrypt(\substr($packet, 4)) : $this->encrypt->encrypt($packet); + $packet = $this->hmac_create instanceof Hash && $this->hmac_create_etm ? + ($packet & "\xFF\xFF\xFF\xFF") . $this->encrypt->encrypt(substr($packet, 4)) : + $this->encrypt->encrypt($packet); } } + if ($this->hmac_create instanceof Hash && $this->hmac_create_etm) { - if (($this->hmac_create->getHash() & "\xff\xff\xff\xff") == 'umac') { - $this->hmac_create->setNonce("\x00\x00\x00\x00" . \pack('N', $this->send_seq_no)); + if (($this->hmac_create->getHash() & "\xFF\xFF\xFF\xFF") == 'umac') { + $this->hmac_create->setNonce("\0\0\0\0" . pack('N', $this->send_seq_no)); $hmac = $this->hmac_create->hash($packet); } else { - $hmac = $this->hmac_create->hash(\pack('Na*', $this->send_seq_no, $packet)); + $hmac = $this->hmac_create->hash(pack('Na*', $this->send_seq_no, $packet)); } } + $this->send_seq_no++; + $packet .= $this->encrypt && $this->encrypt->usesNonce() ? $this->encrypt->getTag() : $hmac; + if (!$this->keyExchangeInProgress) { - $this->bytesTransferredSinceLastKEX += \strlen($packet); - } - $start = \microtime(\true); - $sent = @\fputs($this->fsock, $packet); - $stop = \microtime(\true); - if (\defined('NET_SSH2_LOGGING')) { - $current = \microtime(\true); - $message_number = isset(self::$message_numbers[\ord($logged[0])]) ? self::$message_numbers[\ord($logged[0])] : 'UNKNOWN (' . \ord($logged[0]) . ')'; - $message_number = '-> ' . $message_number . ' (since last: ' . \round($current - $this->last_packet, 4) . ', network: ' . \round($stop - $start, 4) . 's)'; + $this->bytesTransferredSinceLastKEX += strlen($packet); + } + + $start = microtime(true); + $sent = @fputs($this->fsock, $packet); + $stop = microtime(true); + + if (defined('NET_SSH2_LOGGING')) { + $current = microtime(true); + $message_number = isset(self::$message_numbers[ord($logged[0])]) ? self::$message_numbers[ord($logged[0])] : 'UNKNOWN (' . ord($logged[0]) . ')'; + $message_number = '-> ' . $message_number . + ' (since last: ' . round($current - $this->last_packet, 4) . ', network: ' . round($stop - $start, 4) . 's)'; $this->append_log($message_number, $logged); } - $this->last_packet = \microtime(\true); - if (\strlen($packet) != $sent) { + $this->last_packet = microtime(true); + + if (strlen($packet) != $sent) { $this->disconnect_helper(NET_SSH2_DISCONNECT_BY_APPLICATION); - $message = $sent === \false ? 'Unable to write ' . \strlen($packet) . ' bytes' : "Only {$sent} of " . \strlen($packet) . " bytes were sent"; + $message = $sent === false ? + 'Unable to write ' . strlen($packet) . ' bytes' : + "Only $sent of " . strlen($packet) . " bytes were sent"; throw new \RuntimeException($message); } + if ($this->bytesTransferredSinceLastKEX > $this->doKeyReexchangeAfterXBytes) { $this->key_exchange(); } } + /** * Sends a keep-alive message, if keep-alive is enabled and interval is met */ private function send_keep_alive() { if ($this->bitmap & self::MASK_CONNECTED) { - $elapsed = \microtime(\true) - $this->last_packet; + $elapsed = microtime(true) - $this->last_packet; if ($this->keepAlive > 0 && $elapsed >= $this->keepAlive) { - $this->send_binary_packet(\pack('CN', NET_SSH2_MSG_IGNORE, 0)); + $this->send_binary_packet(pack('CN', NET_SSH2_MSG_IGNORE, 0)); } } } + /** * Logs data packets * @@ -3881,8 +4545,19 @@ private function send_keep_alive() */ private function append_log($message_number, $message) { - $this->append_log_helper(NET_SSH2_LOGGING, $message_number, $message, $this->message_number_log, $this->message_log, $this->log_size, $this->realtime_log_file, $this->realtime_log_wrap, $this->realtime_log_size); + $this->append_log_helper( + NET_SSH2_LOGGING, + $message_number, + $message, + $this->message_number_log, + $this->message_log, + $this->log_size, + $this->realtime_log_file, + $this->realtime_log_wrap, + $this->realtime_log_size + ); } + /** * Logs data packet helper * @@ -3899,9 +4574,10 @@ private function append_log($message_number, $message) protected function append_log_helper($constant, $message_number, $message, array &$message_number_log, array &$message_log, &$log_size, &$realtime_log_file, &$realtime_log_wrap, &$realtime_log_size) { // remove the byte identifying the message type from all but the first two messages (ie. the identification strings) - if (!\in_array(\substr($message_number, 0, 4), ['<- (', '-> (']) && \strlen($message_number) > 2) { + if (!in_array(substr($message_number, 0, 4), ['<- (', '-> (']) && strlen($message_number) > 2) { Strings::shift($message); } + switch ($constant) { // useful for benchmarks case self::LOG_SIMPLE: @@ -3909,25 +4585,25 @@ protected function append_log_helper($constant, $message_number, $message, array break; case self::LOG_SIMPLE_REALTIME: echo $message_number; - echo \PHP_SAPI == 'cli' ? "\r\n" : '
'; - @\flush(); - @\ob_flush(); + echo PHP_SAPI == 'cli' ? "\r\n" : '
'; + @flush(); + @ob_flush(); break; // the most useful log for SSH2 case self::LOG_COMPLEX: $message_number_log[] = $message_number; - $log_size += \strlen($message); + $log_size += strlen($message); $message_log[] = $message; while ($log_size > self::LOG_MAX_SIZE) { - $log_size -= \strlen(\array_shift($message_log)); - \array_shift($message_number_log); + $log_size -= strlen(array_shift($message_log)); + array_shift($message_number_log); } break; // dump the output out realtime; packets may be interspersed with non packets, // passwords won't be filtered out and select other packets may not be correctly // identified case self::LOG_REALTIME: - switch (\PHP_SAPI) { + switch (PHP_SAPI) { case 'cli': $start = $stop = "\r\n"; break; @@ -3936,8 +4612,8 @@ protected function append_log_helper($constant, $message_number, $message, array $stop = ''; } echo $start . $this->format_log([$message], [$message_number]) . $stop; - @\flush(); - @\ob_flush(); + @flush(); + @ob_flush(); break; // basically the same thing as self::LOG_REALTIME with the caveat that NET_SSH2_LOG_REALTIME_FILENAME // needs to be defined and that the resultant log file will be capped out at self::LOG_MAX_SIZE. @@ -3947,31 +4623,32 @@ protected function append_log_helper($constant, $message_number, $message, array if (!isset($realtime_log_file)) { // PHP doesn't seem to like using constants in fopen() $filename = NET_SSH2_LOG_REALTIME_FILENAME; - $fp = \fopen($filename, 'w'); + $fp = fopen($filename, 'w'); $realtime_log_file = $fp; } - if (!\is_resource($realtime_log_file)) { + if (!is_resource($realtime_log_file)) { break; } $entry = $this->format_log([$message], [$message_number]); if ($realtime_log_wrap) { $temp = "<<< START >>>\r\n"; $entry .= $temp; - \fseek($realtime_log_file, \ftell($realtime_log_file) - \strlen($temp)); + fseek($realtime_log_file, ftell($realtime_log_file) - strlen($temp)); } - $realtime_log_size += \strlen($entry); + $realtime_log_size += strlen($entry); if ($realtime_log_size > self::LOG_MAX_SIZE) { - \fseek($realtime_log_file, 0); - $realtime_log_size = \strlen($entry); - $realtime_log_wrap = \true; + fseek($realtime_log_file, 0); + $realtime_log_size = strlen($entry); + $realtime_log_wrap = true; } - \fputs($realtime_log_file, $entry); + fputs($realtime_log_file, $entry); break; case self::LOG_REALTIME_SIMPLE: echo $message_number; - echo \PHP_SAPI == 'cli' ? "\r\n" : '
'; + echo PHP_SAPI == 'cli' ? "\r\n" : '
'; } } + /** * Sends channel data * @@ -3983,13 +4660,16 @@ protected function append_log_helper($constant, $message_number, $message, array */ protected function send_channel_packet($client_channel, $data) { - if (isset($this->channel_buffers_write[$client_channel]) && \strpos($data, $this->channel_buffers_write[$client_channel]) === 0) { + if ( + isset($this->channel_buffers_write[$client_channel]) + && strpos($data, $this->channel_buffers_write[$client_channel]) === 0 + ) { // if buffer holds identical initial data content, resume send from the unmatched data portion - $data = \substr($data, \strlen($this->channel_buffers_write[$client_channel])); + $data = substr($data, strlen($this->channel_buffers_write[$client_channel])); } else { $this->channel_buffers_write[$client_channel] = ''; } - while (\strlen($data)) { + while (strlen($data)) { if (!$this->window_size_client_to_server[$client_channel]) { // using an invalid channel will let the buffers be built up for the valid channels $this->get_channel_packet(-$client_channel); @@ -3999,19 +4679,30 @@ protected function send_channel_packet($client_channel, $data) throw new \RuntimeException('Data window was not adjusted'); } } + /* The maximum amount of data allowed is determined by the maximum packet size for the channel, and the current window size, whichever is smaller. -- http://tools.ietf.org/html/rfc4254#section-5.2 */ - $max_size = \min($this->packet_size_client_to_server[$client_channel], $this->window_size_client_to_server[$client_channel]); + $max_size = min( + $this->packet_size_client_to_server[$client_channel], + $this->window_size_client_to_server[$client_channel] + ); + $temp = Strings::shift($data, $max_size); - $packet = Strings::packSSH2('CNs', NET_SSH2_MSG_CHANNEL_DATA, $this->server_channels[$client_channel], $temp); - $this->window_size_client_to_server[$client_channel] -= \strlen($temp); + $packet = Strings::packSSH2( + 'CNs', + NET_SSH2_MSG_CHANNEL_DATA, + $this->server_channels[$client_channel], + $temp + ); + $this->window_size_client_to_server[$client_channel] -= strlen($temp); $this->send_binary_packet($packet); $this->channel_buffers_write[$client_channel] .= $temp; } unset($this->channel_buffers_write[$client_channel]); } + /** * Closes and flushes a channel * @@ -4026,18 +4717,25 @@ protected function send_channel_packet($client_channel, $data) private function close_channel($client_channel) { // see http://tools.ietf.org/html/rfc4254#section-5.3 + if ($this->channel_status[$client_channel] != NET_SSH2_MSG_CHANNEL_EOF) { - $this->send_binary_packet(\pack('CN', NET_SSH2_MSG_CHANNEL_EOF, $this->server_channels[$client_channel])); + $this->send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_EOF, $this->server_channels[$client_channel])); } - $this->send_binary_packet(\pack('CN', NET_SSH2_MSG_CHANNEL_CLOSE, $this->server_channels[$client_channel])); + $this->send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_CLOSE, $this->server_channels[$client_channel])); + $this->channel_status[$client_channel] = NET_SSH2_MSG_CHANNEL_CLOSE; + $this->channelCount--; + $this->curTimeout = 5; - while (!\is_bool($this->get_channel_packet($client_channel))) { + while (!is_bool($this->get_channel_packet($client_channel))) { } + unset($this->channel_status[$client_channel]); + $this->close_channel_bitmap($client_channel); } + /** * Maintains execution state bitmap in response to channel closure * @@ -4056,6 +4754,7 @@ private function close_channel_bitmap($client_channel) break; } } + /** * Disconnect * @@ -4066,7 +4765,7 @@ protected function disconnect_helper($reason) { if ($this->bitmap & self::MASK_DISCONNECT) { // Disregard subsequent disconnect requests - return \false; + return false; } $this->bitmap |= self::MASK_DISCONNECT; if ($this->isConnected()) { @@ -4076,9 +4775,12 @@ protected function disconnect_helper($reason) } catch (\Exception $e) { } } + $this->reset_connection(); - return \false; + + return false; } + /** * Define Array * @@ -4093,14 +4795,15 @@ protected static function define_array(...$args) { foreach ($args as $arg) { foreach ($arg as $key => $value) { - if (!\defined($value)) { - \define($value, $key); + if (!defined($value)) { + define($value, $key); } else { break 2; } } } } + /** * Returns a log of the packets that have been sent and received. * @@ -4110,19 +4813,21 @@ protected static function define_array(...$args) */ public function getLog() { - if (!\defined('NET_SSH2_LOGGING')) { - return \false; + if (!defined('NET_SSH2_LOGGING')) { + return false; } + switch (NET_SSH2_LOGGING) { case self::LOG_SIMPLE: return $this->message_number_log; case self::LOG_COMPLEX: $log = $this->format_log($this->message_log, $this->message_number_log); - return \PHP_SAPI == 'cli' ? $log : '
' . $log . '
'; + return PHP_SAPI == 'cli' ? $log : '
' . $log . '
'; default: - return \false; + return false; } } + /** * Formats a log for printing * @@ -4133,32 +4838,34 @@ public function getLog() protected function format_log(array $message_log, array $message_number_log) { $output = ''; - for ($i = 0; $i < \count($message_log); $i++) { + for ($i = 0; $i < count($message_log); $i++) { $output .= $message_number_log[$i]; $current_log = $message_log[$i]; $j = 0; - if (\strlen($current_log)) { + if (strlen($current_log)) { $output .= "\r\n"; } do { - if (\strlen($current_log)) { - $output .= \str_pad(\dechex($j), 7, '0', \STR_PAD_LEFT) . '0 '; + if (strlen($current_log)) { + $output .= str_pad(dechex($j), 7, '0', STR_PAD_LEFT) . '0 '; } $fragment = Strings::shift($current_log, $this->log_short_width); - $hex = \substr(\preg_replace_callback('#.#s', function ($matches) { - return $this->log_boundary . \str_pad(\dechex(\ord($matches[0])), 2, '0', \STR_PAD_LEFT); - }, $fragment), \strlen($this->log_boundary)); + $hex = substr(preg_replace_callback('#.#s', function ($matches) { + return $this->log_boundary . str_pad(dechex(ord($matches[0])), 2, '0', STR_PAD_LEFT); + }, $fragment), strlen($this->log_boundary)); // replace non ASCII printable characters with dots // http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters // also replace < with a . since < messes up the output on web browsers - $raw = \preg_replace('#[^\\x20-\\x7E]|<#', '.', $fragment); - $output .= \str_pad($hex, $this->log_long_width - $this->log_short_width, ' ') . $raw . "\r\n"; + $raw = preg_replace('#[^\x20-\x7E]|<#', '.', $fragment); + $output .= str_pad($hex, $this->log_long_width - $this->log_short_width, ' ') . $raw . "\r\n"; $j++; - } while (\strlen($current_log)); + } while (strlen($current_log)); $output .= "\r\n"; } + return $output; } + /** * Helper function for agent->on_channel_open() * @@ -4173,6 +4880,7 @@ private function on_channel_open() $this->agent->registerChannelOpen($this); } } + /** * Returns the first value of the intersection of two arrays or false if * the intersection is empty. The order is defined by the first parameter. @@ -4184,12 +4892,13 @@ private function on_channel_open() private static function array_intersect_first(array $array1, array $array2) { foreach ($array1 as $value) { - if (\in_array($value, $array2)) { + if (in_array($value, $array2)) { return $value; } } - return \false; + return false; } + /** * Returns all errors / debug messages on the SSH layer * @@ -4201,6 +4910,7 @@ public function getErrors() { return $this->errors; } + /** * Returns the last error received on the SSH layer * @@ -4210,11 +4920,13 @@ public function getErrors() */ public function getLastError() { - $count = \count($this->errors); + $count = count($this->errors); + if ($count > 0) { return $this->errors[$count - 1]; } } + /** * Return the server identification. * @@ -4223,8 +4935,10 @@ public function getLastError() public function getServerIdentification() { $this->connect(); + return $this->server_identifier; } + /** * Returns a list of algorithms the server supports * @@ -4233,8 +4947,25 @@ public function getServerIdentification() public function getServerAlgorithms() { $this->connect(); - return ['kex' => $this->kex_algorithms, 'hostkey' => $this->server_host_key_algorithms, 'client_to_server' => ['crypt' => $this->encryption_algorithms_client_to_server, 'mac' => $this->mac_algorithms_client_to_server, 'comp' => $this->compression_algorithms_client_to_server, 'lang' => $this->languages_client_to_server], 'server_to_client' => ['crypt' => $this->encryption_algorithms_server_to_client, 'mac' => $this->mac_algorithms_server_to_client, 'comp' => $this->compression_algorithms_server_to_client, 'lang' => $this->languages_server_to_client]]; + + return [ + 'kex' => $this->kex_algorithms, + 'hostkey' => $this->server_host_key_algorithms, + 'client_to_server' => [ + 'crypt' => $this->encryption_algorithms_client_to_server, + 'mac' => $this->mac_algorithms_client_to_server, + 'comp' => $this->compression_algorithms_client_to_server, + 'lang' => $this->languages_client_to_server + ], + 'server_to_client' => [ + 'crypt' => $this->encryption_algorithms_server_to_client, + 'mac' => $this->mac_algorithms_server_to_client, + 'comp' => $this->compression_algorithms_server_to_client, + 'lang' => $this->languages_server_to_client + ] + ]; } + /** * Returns a list of KEX algorithms that phpseclib supports * @@ -4248,29 +4979,29 @@ public static function getSupportedKEXAlgorithms() // libssh repository for more information. 'curve25519-sha256', 'curve25519-sha256@libssh.org', - 'ecdh-sha2-nistp256', - // RFC 5656 - 'ecdh-sha2-nistp384', - // RFC 5656 - 'ecdh-sha2-nistp521', - // RFC 5656 - 'diffie-hellman-group-exchange-sha256', - // RFC 4419 - 'diffie-hellman-group-exchange-sha1', - // RFC 4419 + + 'ecdh-sha2-nistp256', // RFC 5656 + 'ecdh-sha2-nistp384', // RFC 5656 + 'ecdh-sha2-nistp521', // RFC 5656 + + 'diffie-hellman-group-exchange-sha256',// RFC 4419 + 'diffie-hellman-group-exchange-sha1', // RFC 4419 + // Diffie-Hellman Key Agreement (DH) using integer modulo prime // groups. 'diffie-hellman-group14-sha256', - 'diffie-hellman-group14-sha1', - // REQUIRED + 'diffie-hellman-group14-sha1', // REQUIRED 'diffie-hellman-group15-sha512', 'diffie-hellman-group16-sha512', 'diffie-hellman-group17-sha512', 'diffie-hellman-group18-sha512', - 'diffie-hellman-group1-sha1', + + 'diffie-hellman-group1-sha1', // REQUIRED ]; + return $kex_algorithms; } + /** * Returns a list of host key algorithms that phpseclib supports * @@ -4279,23 +5010,17 @@ public static function getSupportedKEXAlgorithms() public static function getSupportedHostKeyAlgorithms() { return [ - 'ssh-ed25519', - // https://tools.ietf.org/html/draft-ietf-curdle-ssh-ed25519-02 - 'ecdsa-sha2-nistp256', - // RFC 5656 - 'ecdsa-sha2-nistp384', - // RFC 5656 - 'ecdsa-sha2-nistp521', - // RFC 5656 - 'rsa-sha2-256', - // RFC 8332 - 'rsa-sha2-512', - // RFC 8332 - 'ssh-rsa', - // RECOMMENDED sign Raw RSA Key - 'ssh-dss', + 'ssh-ed25519', // https://tools.ietf.org/html/draft-ietf-curdle-ssh-ed25519-02 + 'ecdsa-sha2-nistp256', // RFC 5656 + 'ecdsa-sha2-nistp384', // RFC 5656 + 'ecdsa-sha2-nistp521', // RFC 5656 + 'rsa-sha2-256', // RFC 8332 + 'rsa-sha2-512', // RFC 8332 + 'ssh-rsa', // RECOMMENDED sign Raw RSA Key + 'ssh-dss' // REQUIRED sign Raw DSS Key ]; } + /** * Returns a list of symmetric key algorithms that phpseclib supports * @@ -4307,17 +5032,18 @@ public static function getSupportedEncryptionAlgorithms() // from : 'aes128-gcm@openssh.com', 'aes256-gcm@openssh.com', + // from : 'arcfour256', 'arcfour128', + //'arcfour', // OPTIONAL the ARCFOUR stream cipher with a 128-bit key + // CTR modes from : - 'aes128-ctr', - // RECOMMENDED AES (Rijndael) in SDCTR mode, with 128-bit key - 'aes192-ctr', - // RECOMMENDED AES with 192-bit key - 'aes256-ctr', - // RECOMMENDED AES with 256-bit key + 'aes128-ctr', // RECOMMENDED AES (Rijndael) in SDCTR mode, with 128-bit key + 'aes192-ctr', // RECOMMENDED AES with 192-bit key + 'aes256-ctr', // RECOMMENDED AES with 256-bit key + // from : // one of the big benefits of chacha20-poly1305 is speed. the problem is... // libsodium doesn't generate the poly1305 keys in the way ssh does and openssl's PHP bindings don't even @@ -4327,45 +5053,52 @@ public static function getSupportedEncryptionAlgorithms() // (which is always gonna be super fast to compute thanks to the hash extension, which // "is bundled and compiled into PHP by default") 'chacha20-poly1305@openssh.com', - 'twofish128-ctr', - // OPTIONAL Twofish in SDCTR mode, with 128-bit key - 'twofish192-ctr', - // OPTIONAL Twofish with 192-bit key - 'twofish256-ctr', - // OPTIONAL Twofish with 256-bit key - 'aes128-cbc', - // RECOMMENDED AES with a 128-bit key - 'aes192-cbc', - // OPTIONAL AES with a 192-bit key - 'aes256-cbc', - // OPTIONAL AES in CBC mode, with a 256-bit key - 'twofish128-cbc', - // OPTIONAL Twofish with a 128-bit key - 'twofish192-cbc', - // OPTIONAL Twofish with a 192-bit key + + 'twofish128-ctr', // OPTIONAL Twofish in SDCTR mode, with 128-bit key + 'twofish192-ctr', // OPTIONAL Twofish with 192-bit key + 'twofish256-ctr', // OPTIONAL Twofish with 256-bit key + + 'aes128-cbc', // RECOMMENDED AES with a 128-bit key + 'aes192-cbc', // OPTIONAL AES with a 192-bit key + 'aes256-cbc', // OPTIONAL AES in CBC mode, with a 256-bit key + + 'twofish128-cbc', // OPTIONAL Twofish with a 128-bit key + 'twofish192-cbc', // OPTIONAL Twofish with a 192-bit key 'twofish256-cbc', - 'twofish-cbc', - // OPTIONAL alias for "twofish256-cbc" - // (this is being retained for historical reasons) - 'blowfish-ctr', - // OPTIONAL Blowfish in SDCTR mode - 'blowfish-cbc', - // OPTIONAL Blowfish in CBC mode - '3des-ctr', - // RECOMMENDED Three-key 3DES in SDCTR mode - '3des-cbc', + 'twofish-cbc', // OPTIONAL alias for "twofish256-cbc" + // (this is being retained for historical reasons) + + 'blowfish-ctr', // OPTIONAL Blowfish in SDCTR mode + + 'blowfish-cbc', // OPTIONAL Blowfish in CBC mode + + '3des-ctr', // RECOMMENDED Three-key 3DES in SDCTR mode + + '3des-cbc', // REQUIRED three-key 3DES in CBC mode + + //'none' // OPTIONAL no encryption; NOT RECOMMENDED ]; + if (self::$crypto_engine) { $engines = [self::$crypto_engine]; } else { - $engines = ['libsodium', 'OpenSSL (GCM)', 'OpenSSL', 'mcrypt', 'Eval', 'PHP']; + $engines = [ + 'libsodium', + 'OpenSSL (GCM)', + 'OpenSSL', + 'mcrypt', + 'Eval', + 'PHP' + ]; } + $ciphers = []; + foreach ($engines as $engine) { foreach ($algos as $algo) { $obj = self::encryption_algorithm_to_crypt_instance($algo); if ($obj instanceof Rijndael) { - $obj->setKeyLength(\preg_replace('#[^\\d]#', '', $algo)); + $obj->setKeyLength(preg_replace('#[^\d]#', '', $algo)); } switch ($algo) { // Eval engines do not exist for ChaCha20 or RC4 because they would not benefit from one. @@ -4377,13 +5110,16 @@ public static function getSupportedEncryptionAlgorithms() // as you encrypt stuff. the only table lookups are made against this keystream and thus table // lookups are kinda unavoidable. with AES and DES, however, the table lookups that are done // are done against substitution boxes (sboxes), which are invariant. + // OpenSSL can't be used as an engine, either, because OpenSSL doesn't support continuous buffers // as SSH2 uses and altho you can emulate a continuous buffer with block ciphers you can't do so // with stream ciphers. As for ChaCha20... for the ChaCha20 part OpenSSL could prob be used but // the big slow down isn't with ChaCha20 - it's with Poly1305. SSH constructs the key for that // differently than how OpenSSL does it (OpenSSL does it as the RFC describes, SSH doesn't). + // libsodium can't be used because it doesn't support RC4 and it doesn't construct the Poly1305 // keys in the same way that SSH does + // mcrypt could prob be used for RC4 but mcrypt hasn't been included in PHP core for yearss case 'chacha20-poly1305@openssh.com': case 'arcfour128': @@ -4400,13 +5136,15 @@ public static function getSupportedEncryptionAlgorithms() $obj->setNonce('dummydummydu'); } if ($obj->isValidEngine($engine)) { - $algos = \array_diff($algos, [$algo]); + $algos = array_diff($algos, [$algo]); $ciphers[] = $algo; } } } + return $ciphers; } + /** * Returns a list of MAC algorithms that phpseclib supports * @@ -4418,26 +5156,27 @@ public static function getSupportedMACAlgorithms() 'hmac-sha2-256-etm@openssh.com', 'hmac-sha2-512-etm@openssh.com', 'hmac-sha1-etm@openssh.com', + // from : - 'hmac-sha2-256', - // RECOMMENDED HMAC-SHA256 (digest length = key length = 32) - 'hmac-sha2-512', - // OPTIONAL HMAC-SHA512 (digest length = key length = 64) - 'hmac-sha1-96', - // RECOMMENDED first 96 bits of HMAC-SHA1 (digest length = 12, key length = 20) - 'hmac-sha1', - // REQUIRED HMAC-SHA1 (digest length = key length = 20) - 'hmac-md5-96', - // OPTIONAL first 96 bits of HMAC-MD5 (digest length = 12, key length = 16) - 'hmac-md5', - // OPTIONAL HMAC-MD5 (digest length = key length = 16) + 'hmac-sha2-256',// RECOMMENDED HMAC-SHA256 (digest length = key length = 32) + 'hmac-sha2-512',// OPTIONAL HMAC-SHA512 (digest length = key length = 64) + + 'hmac-sha1-96', // RECOMMENDED first 96 bits of HMAC-SHA1 (digest length = 12, key length = 20) + 'hmac-sha1', // REQUIRED HMAC-SHA1 (digest length = key length = 20) + 'hmac-md5-96', // OPTIONAL first 96 bits of HMAC-MD5 (digest length = 12, key length = 16) + 'hmac-md5', // OPTIONAL HMAC-MD5 (digest length = key length = 16) + 'umac-64-etm@openssh.com', 'umac-128-etm@openssh.com', + // from : 'umac-64@openssh.com', 'umac-128@openssh.com', + + //'none' // OPTIONAL no MAC; NOT RECOMMENDED ]; } + /** * Returns a list of compression algorithms that phpseclib supports * @@ -4445,15 +5184,14 @@ public static function getSupportedMACAlgorithms() */ public static function getSupportedCompressionAlgorithms() { - $algos = ['none']; - // REQUIRED no compression - if (\function_exists('deflate_init')) { - $algos[] = 'zlib@openssh.com'; - // https://datatracker.ietf.org/doc/html/draft-miller-secsh-compression-delayed + $algos = ['none']; // REQUIRED no compression + if (function_exists('deflate_init')) { + $algos[] = 'zlib@openssh.com'; // https://datatracker.ietf.org/doc/html/draft-miller-secsh-compression-delayed $algos[] = 'zlib'; } return $algos; } + /** * Return list of negotiated algorithms * @@ -4464,16 +5202,37 @@ public static function getSupportedCompressionAlgorithms() public function getAlgorithmsNegotiated() { $this->connect(); - $compression_map = [self::NET_SSH2_COMPRESSION_NONE => 'none', self::NET_SSH2_COMPRESSION_ZLIB => 'zlib', self::NET_SSH2_COMPRESSION_ZLIB_AT_OPENSSH => 'zlib@openssh.com']; - return ['kex' => $this->kex_algorithm, 'hostkey' => $this->signature_format, 'client_to_server' => ['crypt' => $this->encryptName, 'mac' => $this->hmac_create_name, 'comp' => $compression_map[$this->compress]], 'server_to_client' => ['crypt' => $this->decryptName, 'mac' => $this->hmac_check_name, 'comp' => $compression_map[$this->decompress]]]; + + $compression_map = [ + self::NET_SSH2_COMPRESSION_NONE => 'none', + self::NET_SSH2_COMPRESSION_ZLIB => 'zlib', + self::NET_SSH2_COMPRESSION_ZLIB_AT_OPENSSH => 'zlib@openssh.com' + ]; + + return [ + 'kex' => $this->kex_algorithm, + 'hostkey' => $this->signature_format, + 'client_to_server' => [ + 'crypt' => $this->encryptName, + 'mac' => $this->hmac_create_name, + 'comp' => $compression_map[$this->compress], + ], + 'server_to_client' => [ + 'crypt' => $this->decryptName, + 'mac' => $this->hmac_check_name, + 'comp' => $compression_map[$this->decompress], + ] + ]; } + /** * Force multiple channels (even if phpseclib has decided to disable them) */ public function forceMultipleChannels() { - $this->errorOnMultipleChannels = \false; + $this->errorOnMultipleChannels = false; } + /** * Allows you to set the terminal * @@ -4483,6 +5242,7 @@ public function setTerminal($term) { $this->term = $term; } + /** * Accepts an associative array with up to four parameters as described at * @@ -4492,52 +5252,85 @@ public function setTerminal($term) public function setPreferredAlgorithms(array $methods) { $keys = ['client_to_server', 'server_to_client']; - if (isset($methods['kex']) && \is_string($methods['kex'])) { - $methods['kex'] = \explode(',', $methods['kex']); + + if (isset($methods['kex']) && is_string($methods['kex'])) { + $methods['kex'] = explode(',', $methods['kex']); } - if (isset($methods['hostkey']) && \is_string($methods['hostkey'])) { - $methods['hostkey'] = \explode(',', $methods['hostkey']); + + if (isset($methods['hostkey']) && is_string($methods['hostkey'])) { + $methods['hostkey'] = explode(',', $methods['hostkey']); } + foreach ($keys as $key) { if (isset($methods[$key])) { - $a =& $methods[$key]; - if (isset($a['crypt']) && \is_string($a['crypt'])) { - $a['crypt'] = \explode(',', $a['crypt']); + $a = &$methods[$key]; + if (isset($a['crypt']) && is_string($a['crypt'])) { + $a['crypt'] = explode(',', $a['crypt']); } - if (isset($a['comp']) && \is_string($a['comp'])) { - $a['comp'] = \explode(',', $a['comp']); + if (isset($a['comp']) && is_string($a['comp'])) { + $a['comp'] = explode(',', $a['comp']); } - if (isset($a['mac']) && \is_string($a['mac'])) { - $a['mac'] = \explode(',', $a['mac']); + if (isset($a['mac']) && is_string($a['mac'])) { + $a['mac'] = explode(',', $a['mac']); } } } + $preferred = $methods; + if (isset($preferred['kex'])) { - $preferred['kex'] = \array_intersect($preferred['kex'], static::getSupportedKEXAlgorithms()); + $preferred['kex'] = array_intersect( + $preferred['kex'], + static::getSupportedKEXAlgorithms() + ); } + if (isset($preferred['hostkey'])) { - $preferred['hostkey'] = \array_intersect($preferred['hostkey'], static::getSupportedHostKeyAlgorithms()); + $preferred['hostkey'] = array_intersect( + $preferred['hostkey'], + static::getSupportedHostKeyAlgorithms() + ); } + foreach ($keys as $key) { if (isset($preferred[$key])) { - $a =& $preferred[$key]; + $a = &$preferred[$key]; if (isset($a['crypt'])) { - $a['crypt'] = \array_intersect($a['crypt'], static::getSupportedEncryptionAlgorithms()); + $a['crypt'] = array_intersect( + $a['crypt'], + static::getSupportedEncryptionAlgorithms() + ); } if (isset($a['comp'])) { - $a['comp'] = \array_intersect($a['comp'], static::getSupportedCompressionAlgorithms()); + $a['comp'] = array_intersect( + $a['comp'], + static::getSupportedCompressionAlgorithms() + ); } if (isset($a['mac'])) { - $a['mac'] = \array_intersect($a['mac'], static::getSupportedMACAlgorithms()); + $a['mac'] = array_intersect( + $a['mac'], + static::getSupportedMACAlgorithms() + ); } } } - $keys = ['kex', 'hostkey', 'client_to_server/crypt', 'client_to_server/comp', 'client_to_server/mac', 'server_to_client/crypt', 'server_to_client/comp', 'server_to_client/mac']; + + $keys = [ + 'kex', + 'hostkey', + 'client_to_server/crypt', + 'client_to_server/comp', + 'client_to_server/mac', + 'server_to_client/crypt', + 'server_to_client/comp', + 'server_to_client/mac', + ]; foreach ($keys as $key) { $p = $preferred; $m = $methods; - $subkeys = \explode('/', $key); + + $subkeys = explode('/', $key); foreach ($subkeys as $subkey) { if (!isset($p[$subkey])) { continue 2; @@ -4545,14 +5338,19 @@ public function setPreferredAlgorithms(array $methods) $p = $p[$subkey]; $m = $m[$subkey]; } - if (\count($p) != \count($m)) { - $diff = \array_diff($m, $p); - $msg = \count($diff) == 1 ? ' is not a supported algorithm' : ' are not supported algorithms'; - throw new UnsupportedAlgorithmException(\implode(', ', $diff) . $msg); + + if (count($p) != count($m)) { + $diff = array_diff($m, $p); + $msg = count($diff) == 1 ? + ' is not a supported algorithm' : + ' are not supported algorithms'; + throw new UnsupportedAlgorithmException(implode(', ', $diff) . $msg); } } + $this->preferred = $preferred; } + /** * Returns the banner message. * @@ -4565,6 +5363,7 @@ public function getBannerMessage() { return $this->banner_message; } + /** * Returns the server public host key. * @@ -4580,18 +5379,25 @@ public function getServerPublicHostKey() if (!($this->bitmap & self::MASK_CONSTRUCTOR)) { $this->connect(); } + $signature = $this->signature; - $server_public_host_key = \base64_encode($this->server_public_host_key); + $server_public_host_key = base64_encode($this->server_public_host_key); + if ($this->signature_validated) { - return $this->bitmap ? $this->signature_format . ' ' . $server_public_host_key : \false; + return $this->bitmap ? + $this->signature_format . ' ' . $server_public_host_key : + false; } - $this->signature_validated = \true; + + $this->signature_validated = true; + switch ($this->signature_format) { case 'ssh-ed25519': case 'ecdsa-sha2-nistp256': case 'ecdsa-sha2-nistp384': case 'ecdsa-sha2-nistp521': - $key = EC::loadFormat('OpenSSH', $server_public_host_key)->withSignatureFormat('SSH2'); + $key = EC::loadFormat('OpenSSH', $server_public_host_key) + ->withSignatureFormat('SSH2'); switch ($this->signature_format) { case 'ssh-ed25519': $hash = 'sha512'; @@ -4608,7 +5414,9 @@ public function getServerPublicHostKey() $key = $key->withHash($hash); break; case 'ssh-dss': - $key = DSA::loadFormat('OpenSSH', $server_public_host_key)->withSignatureFormat('SSH2')->withHash('sha1'); + $key = DSA::loadFormat('OpenSSH', $server_public_host_key) + ->withSignatureFormat('SSH2') + ->withHash('sha1'); break; case 'ssh-rsa': case 'rsa-sha2-256': @@ -4617,7 +5425,9 @@ public function getServerPublicHostKey() // we don't check here because we already checked in key_exchange // some signatures have the type embedded within the message and some don't list(, $signature) = Strings::unpackSSH2('ss', $signature); - $key = RSA::loadFormat('OpenSSH', $server_public_host_key)->withPadding(RSA::SIGNATURE_PKCS1); + + $key = RSA::loadFormat('OpenSSH', $server_public_host_key) + ->withPadding(RSA::SIGNATURE_PKCS1); switch ($this->signature_format) { case 'rsa-sha2-512': $hash = 'sha512'; @@ -4635,11 +5445,14 @@ public function getServerPublicHostKey() $this->disconnect_helper(NET_SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE); throw new NoSupportedAlgorithmsException('Unsupported signature format'); } + if (!$key->verify($this->exchange_hash, $signature)) { return $this->disconnect_helper(NET_SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE); - } + }; + return $this->signature_format . ' ' . $server_public_host_key; } + /** * Returns the exit status of an SSH command or false. * @@ -4647,11 +5460,12 @@ public function getServerPublicHostKey() */ public function getExitStatus() { - if (\is_null($this->exit_status)) { - return \false; + if (is_null($this->exit_status)) { + return false; } return $this->exit_status; } + /** * Returns the number of columns for the terminal window size. * @@ -4661,6 +5475,7 @@ public function getWindowColumns() { return $this->windowColumns; } + /** * Returns the number of rows for the terminal window size. * @@ -4670,6 +5485,7 @@ public function getWindowRows() { return $this->windowRows; } + /** * Sets the number of columns for the terminal window size. * @@ -4679,6 +5495,7 @@ public function setWindowColumns($value) { $this->windowColumns = $value; } + /** * Sets the number of rows for the terminal window size. * @@ -4688,6 +5505,7 @@ public function setWindowRows($value) { $this->windowRows = $value; } + /** * Sets the number of columns and rows for the terminal window size. * @@ -4699,6 +5517,7 @@ public function setWindowSize($columns = 80, $rows = 24) $this->windowColumns = $columns; $this->windowRows = $rows; } + /** * To String Magic Method * @@ -4709,6 +5528,7 @@ public function __toString() { return $this->getResourceId(); } + /** * Get Resource ID * @@ -4721,8 +5541,9 @@ public function __toString() */ public function getResourceId() { - return '{' . \spl_object_hash($this) . '}'; + return '{' . spl_object_hash($this) . '}'; } + /** * Return existing connection * @@ -4735,8 +5556,9 @@ public static function getConnectionByResourceId($id) if (isset(self::$connections[$id])) { return self::$connections[$id] instanceof \WeakReference ? self::$connections[$id]->get() : self::$connections[$id]; } - return \false; + return false; } + /** * Return all excising connections * @@ -4744,7 +5566,7 @@ public static function getConnectionByResourceId($id) */ public static function getConnections() { - if (!\class_exists('WeakReference')) { + if (!class_exists('WeakReference')) { /** @var array */ return self::$connections; } @@ -4754,6 +5576,7 @@ public static function getConnections() } return $temp; } + /* * Update packet types in log history * @@ -4762,10 +5585,15 @@ public static function getConnections() */ private function updateLogHistory($old, $new) { - if (\defined('NET_SSH2_LOGGING') && NET_SSH2_LOGGING == self::LOG_COMPLEX) { - $this->message_number_log[\count($this->message_number_log) - 1] = \str_replace($old, $new, $this->message_number_log[\count($this->message_number_log) - 1]); + if (defined('NET_SSH2_LOGGING') && NET_SSH2_LOGGING == self::LOG_COMPLEX) { + $this->message_number_log[count($this->message_number_log) - 1] = str_replace( + $old, + $new, + $this->message_number_log[count($this->message_number_log) - 1] + ); } } + /** * Return the list of authentication methods that may productively continue authentication. * @@ -4776,20 +5604,23 @@ public function getAuthMethodsToContinue() { return $this->auth_methods_to_continue; } + /** * Enables "smart" multi-factor authentication (MFA) */ public function enableSmartMFA() { - $this->smartMFA = \true; + $this->smartMFA = true; } + /** * Disables "smart" multi-factor authentication (MFA) */ public function disableSmartMFA() { - $this->smartMFA = \false; + $this->smartMFA = false; } + /** * How many bytes until the next key re-exchange? * diff --git a/composer/phpseclib/phpseclib/phpseclib/System/SSH/Agent.php b/composer/phpseclib/phpseclib/phpseclib/System/SSH/Agent.php index cf2c940..d25916f 100644 --- a/composer/phpseclib/phpseclib/phpseclib/System/SSH/Agent.php +++ b/composer/phpseclib/phpseclib/phpseclib/System/SSH/Agent.php @@ -29,6 +29,7 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\System\SSH; use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; @@ -38,18 +39,20 @@ use OCA\Libresign\Vendor\phpseclib3\Exception\BadConfigurationException; use OCA\Libresign\Vendor\phpseclib3\Net\SSH2; use OCA\Libresign\Vendor\phpseclib3\System\SSH\Agent\Identity; + /** * Pure-PHP ssh-agent client identity factory * * requestIdentities() method pumps out \phpseclib3\System\SSH\Agent\Identity objects * * @author Jim Wigginton - * @internal */ class Agent { use Common\Traits\ReadBytes; + // Message numbers + // to request SSH1 keys you have to use SSH_AGENTC_REQUEST_RSA_IDENTITIES (1) const SSH_AGENTC_REQUEST_IDENTITIES = 11; // this is the SSH2 response; the SSH1 response is SSH_AGENT_RSA_IDENTITIES_ANSWER (2). @@ -58,29 +61,35 @@ class Agent const SSH_AGENTC_SIGN_REQUEST = 13; // the SSH1 response is SSH_AGENT_RSA_RESPONSE (4) const SSH_AGENT_SIGN_RESPONSE = 14; + // Agent forwarding status + // no forwarding requested and not active const FORWARD_NONE = 0; // request agent forwarding when opportune const FORWARD_REQUEST = 1; // forwarding has been request and is active const FORWARD_ACTIVE = 2; + /** * Unused */ const SSH_AGENT_FAILURE = 5; + /** * Socket Resource * * @var resource */ private $fsock; + /** * Agent forwarding status * * @var int */ private $forward_status = self::FORWARD_NONE; + /** * Buffer for accumulating forwarded authentication * agent data arriving on SSH data channel destined @@ -89,6 +98,7 @@ class Agent * @var string */ private $socket_buffer = ''; + /** * Tracking the number of bytes we are expecting * to arrive for the agent socket on the SSH data @@ -97,6 +107,7 @@ class Agent * @var int */ private $expected_bytes = 0; + /** * Default Constructor * @@ -107,7 +118,7 @@ class Agent public function __construct($address = null) { if (!$address) { - switch (\true) { + switch (true) { case isset($_SERVER['SSH_AUTH_SOCK']): $address = $_SERVER['SSH_AUTH_SOCK']; break; @@ -118,21 +129,24 @@ public function __construct($address = null) throw new BadConfigurationException('SSH_AUTH_SOCK not found'); } } - if (\in_array('unix', \stream_get_transports())) { - $this->fsock = \fsockopen('unix://' . $address, 0, $errno, $errstr); + + if (in_array('unix', stream_get_transports())) { + $this->fsock = fsockopen('unix://' . $address, 0, $errno, $errstr); if (!$this->fsock) { - throw new \RuntimeException("Unable to connect to ssh-agent (Error {$errno}: {$errstr})"); + throw new \RuntimeException("Unable to connect to ssh-agent (Error $errno: $errstr)"); } } else { - if (\substr($address, 0, 9) != '\\\\.\\pipe\\' || \strpos(\substr($address, 9), '\\') !== \false) { + if (substr($address, 0, 9) != '\\\\.\\pipe\\' || strpos(substr($address, 9), '\\') !== false) { throw new \RuntimeException('Address is not formatted as a named pipe should be'); } - $this->fsock = \fopen($address, 'r+b'); + + $this->fsock = fopen($address, 'r+b'); if (!$this->fsock) { throw new \RuntimeException('Unable to open address'); } } } + /** * Request Identities * @@ -147,16 +161,20 @@ public function requestIdentities() if (!$this->fsock) { return []; } - $packet = \pack('NC', 1, self::SSH_AGENTC_REQUEST_IDENTITIES); - if (\strlen($packet) != \fputs($this->fsock, $packet)) { + + $packet = pack('NC', 1, self::SSH_AGENTC_REQUEST_IDENTITIES); + if (strlen($packet) != fputs($this->fsock, $packet)) { throw new \RuntimeException('Connection closed while requesting identities'); } - $length = \current(\unpack('N', $this->readBytes(4))); + + $length = current(unpack('N', $this->readBytes(4))); $packet = $this->readBytes($length); + list($type, $keyCount) = Strings::unpackSSH2('CN', $packet); if ($type != self::SSH_AGENT_IDENTITIES_ANSWER) { throw new \RuntimeException('Unable to request identities'); } + $identities = []; for ($i = 0; $i < $keyCount; $i++) { list($key_blob, $comment) = Strings::unpackSSH2('ss', $packet); @@ -169,17 +187,22 @@ public function requestIdentities() case 'ecdsa-sha2-nistp256': case 'ecdsa-sha2-nistp384': case 'ecdsa-sha2-nistp521': - $key = PublicKeyLoader::load($key_type . ' ' . \base64_encode($key_blob)); + $key = PublicKeyLoader::load($key_type . ' ' . base64_encode($key_blob)); } // resources are passed by reference by default if (isset($key)) { - $identity = (new Identity($this->fsock))->withPublicKey($key)->withPublicKeyBlob($key_blob)->withComment($comment); + $identity = (new Identity($this->fsock)) + ->withPublicKey($key) + ->withPublicKeyBlob($key_blob) + ->withComment($comment); $identities[] = $identity; unset($key); } } + return $identities; } + /** * Returns the SSH Agent identity matching a given public key or null if no identity is found * @@ -190,12 +213,14 @@ public function findIdentityByPublicKey(PublicKey $key) $identities = $this->requestIdentities(); $key = (string) $key; foreach ($identities as $identity) { - if ((string) $identity->getPublicKey() == $key) { + if (((string) $identity->getPublicKey()) == $key) { return $identity; } } + return null; } + /** * Signal that agent forwarding should * be requested when a channel is opened @@ -208,6 +233,7 @@ public function startSSHForwarding() $this->forward_status = self::FORWARD_REQUEST; } } + /** * Request agent forwarding of remote server * @@ -217,11 +243,14 @@ public function startSSHForwarding() private function request_forwarding(SSH2 $ssh) { if (!$ssh->requestAgentForwarding()) { - return \false; + return false; } + $this->forward_status = self::FORWARD_ACTIVE; - return \true; + + return true; } + /** * On successful channel open * @@ -237,6 +266,7 @@ public function registerChannelOpen(SSH2 $ssh) $this->request_forwarding($ssh); } } + /** * Forward data to SSH Agent and return data reply * @@ -248,24 +278,29 @@ public function forwardData($data) { if ($this->expected_bytes > 0) { $this->socket_buffer .= $data; - $this->expected_bytes -= \strlen($data); + $this->expected_bytes -= strlen($data); } else { - $agent_data_bytes = \current(\unpack('N', $data)); - $current_data_bytes = \strlen($data); + $agent_data_bytes = current(unpack('N', $data)); + $current_data_bytes = strlen($data); $this->socket_buffer = $data; if ($current_data_bytes != $agent_data_bytes + 4) { - $this->expected_bytes = $agent_data_bytes + 4 - $current_data_bytes; - return \false; + $this->expected_bytes = ($agent_data_bytes + 4) - $current_data_bytes; + return false; } } - if (\strlen($this->socket_buffer) != \fwrite($this->fsock, $this->socket_buffer)) { + + if (strlen($this->socket_buffer) != fwrite($this->fsock, $this->socket_buffer)) { throw new \RuntimeException('Connection closed attempting to forward data to SSH agent'); } + $this->socket_buffer = ''; $this->expected_bytes = 0; - $agent_reply_bytes = \current(\unpack('N', $this->readBytes(4))); + + $agent_reply_bytes = current(unpack('N', $this->readBytes(4))); + $agent_reply_data = $this->readBytes($agent_reply_bytes); - $agent_reply_data = \current(\unpack('a*', $agent_reply_data)); - return \pack('Na*', $agent_reply_bytes, $agent_reply_data); + $agent_reply_data = current(unpack('a*', $agent_reply_data)); + + return pack('Na*', $agent_reply_bytes, $agent_reply_data); } } diff --git a/composer/phpseclib/phpseclib/phpseclib/System/SSH/Agent/Identity.php b/composer/phpseclib/phpseclib/phpseclib/System/SSH/Agent/Identity.php index 594b7f0..b2838bb 100644 --- a/composer/phpseclib/phpseclib/phpseclib/System/SSH/Agent/Identity.php +++ b/composer/phpseclib/phpseclib/phpseclib/System/SSH/Agent/Identity.php @@ -12,6 +12,7 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\System\SSH\Agent; use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; @@ -23,6 +24,7 @@ use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedAlgorithmException; use OCA\Libresign\Vendor\phpseclib3\System\SSH\Agent; use OCA\Libresign\Vendor\phpseclib3\System\SSH\Common\Traits\ReadBytes; + /** * Pure-PHP ssh-agent client identity object * @@ -38,10 +40,12 @@ class Identity implements PrivateKey { use ReadBytes; + // Signature Flags // See https://tools.ietf.org/html/draft-miller-ssh-agent-00#section-5.3 const SSH_AGENT_RSA2_256 = 2; const SSH_AGENT_RSA2_512 = 4; + /** * Key Object * @@ -49,6 +53,7 @@ class Identity implements PrivateKey * @see self::getPublicKey() */ private $key; + /** * Key Blob * @@ -56,6 +61,7 @@ class Identity implements PrivateKey * @see self::sign() */ private $key_blob; + /** * Socket Resource * @@ -63,6 +69,7 @@ class Identity implements PrivateKey * @see self::sign() */ private $fsock; + /** * Signature flags * @@ -71,18 +78,26 @@ class Identity implements PrivateKey * @see self::setHash() */ private $flags = 0; + /** * Comment * * @var null|string */ private $comment; + /** * Curve Aliases * * @var array */ - private static $curveAliases = ['secp256r1' => 'nistp256', 'secp384r1' => 'nistp384', 'secp521r1' => 'nistp521', 'Ed25519' => 'Ed25519']; + private static $curveAliases = [ + 'secp256r1' => 'nistp256', + 'secp384r1' => 'nistp384', + 'secp521r1' => 'nistp521', + 'Ed25519' => 'Ed25519' + ]; + /** * Default Constructor. * @@ -92,6 +107,7 @@ public function __construct($fsock) { $this->fsock = $fsock; } + /** * Set Public Key * @@ -102,14 +118,16 @@ public function __construct($fsock) public function withPublicKey(PublicKey $key) { if ($key instanceof EC) { - if (\is_array($key->getCurve()) || !isset(self::$curveAliases[$key->getCurve()])) { + if (is_array($key->getCurve()) || !isset(self::$curveAliases[$key->getCurve()])) { throw new UnsupportedAlgorithmException('The only supported curves are nistp256, nistp384, nistp512 and Ed25519'); } } + $new = clone $this; $new->key = $key; return $new; } + /** * Set Public Key * @@ -124,6 +142,7 @@ public function withPublicKeyBlob($key_blob) $new->key_blob = $key_blob; return $new; } + /** * Get Public Key * @@ -135,6 +154,7 @@ public function getPublicKey() { return $this->key; } + /** * Sets the hash * @@ -143,7 +163,9 @@ public function getPublicKey() public function withHash($hash) { $new = clone $this; - $hash = \strtolower($hash); + + $hash = strtolower($hash); + if ($this->key instanceof RSA) { $new->flags = 0; switch ($hash) { @@ -183,6 +205,7 @@ public function withHash($hash) } return $new; } + /** * Sets the padding * @@ -200,6 +223,7 @@ public function withPadding($padding) } return $this; } + /** * Determines the signature padding mode * @@ -215,8 +239,10 @@ public function withSignatureFormat($format) if ($format != 'SSH2') { throw new UnsupportedAlgorithmException('Only SSH2-formatted signatures are currently supported'); } + return $this; } + /** * Returns the curve * @@ -229,8 +255,10 @@ public function getCurve() if (!$this->key instanceof EC) { throw new UnsupportedAlgorithmException('Only EC keys have curves'); } + return $this->key->getCurve(); } + /** * Create a signature * @@ -244,23 +272,35 @@ public function getCurve() public function sign($message) { // the last parameter (currently 0) is for flags and ssh-agent only defines one flag (for ssh-dss): SSH_AGENT_OLD_SIGNATURE - $packet = Strings::packSSH2('CssN', Agent::SSH_AGENTC_SIGN_REQUEST, $this->key_blob, $message, $this->flags); + $packet = Strings::packSSH2( + 'CssN', + Agent::SSH_AGENTC_SIGN_REQUEST, + $this->key_blob, + $message, + $this->flags + ); $packet = Strings::packSSH2('s', $packet); - if (\strlen($packet) != \fputs($this->fsock, $packet)) { + if (strlen($packet) != fputs($this->fsock, $packet)) { throw new \RuntimeException('Connection closed during signing'); } - $length = \current(\unpack('N', $this->readBytes(4))); + + $length = current(unpack('N', $this->readBytes(4))); $packet = $this->readBytes($length); + list($type, $signature_blob) = Strings::unpackSSH2('Cs', $packet); if ($type != Agent::SSH_AGENT_SIGN_RESPONSE) { throw new \RuntimeException('Unable to retrieve signature'); } + if (!$this->key instanceof RSA) { return $signature_blob; } + list($type, $signature_blob) = Strings::unpackSSH2('ss', $signature_blob); + return $signature_blob; } + /** * Returns the private key * @@ -272,16 +312,18 @@ public function toString($type, array $options = []) { throw new \RuntimeException('ssh-agent does not provide a mechanism to get the private key'); } + /** * Sets the password * * @param string|bool $password * @return never */ - public function withPassword($password = \false) + public function withPassword($password = false) { throw new \RuntimeException('ssh-agent does not provide a mechanism to get the private key'); } + /** * Sets the comment */ @@ -291,6 +333,7 @@ public function withComment($comment = null) $new->comment = $comment; return $new; } + /** * Returns the comment * diff --git a/composer/phpseclib/phpseclib/phpseclib/System/SSH/Common/Traits/ReadBytes.php b/composer/phpseclib/phpseclib/phpseclib/System/SSH/Common/Traits/ReadBytes.php index 93e75ef..2c9447c 100644 --- a/composer/phpseclib/phpseclib/phpseclib/System/SSH/Common/Traits/ReadBytes.php +++ b/composer/phpseclib/phpseclib/phpseclib/System/SSH/Common/Traits/ReadBytes.php @@ -10,13 +10,13 @@ * @license http://www.opensource.org/licenses/mit-license.html MIT License * @link http://phpseclib.sourceforge.net */ + namespace OCA\Libresign\Vendor\phpseclib3\System\SSH\Common\Traits; /** * ReadBytes trait * * @author Jim Wigginton - * @internal */ trait ReadBytes { @@ -28,9 +28,9 @@ trait ReadBytes */ public function readBytes($length) { - $temp = \fread($this->fsock, $length); - if (\strlen($temp) != $length) { - throw new \RuntimeException("Expected {$length} bytes; got " . \strlen($temp)); + $temp = fread($this->fsock, $length); + if (strlen($temp) != $length) { + throw new \RuntimeException("Expected $length bytes; got " . strlen($temp)); } return $temp; } diff --git a/composer/phpseclib/phpseclib/phpseclib/bootstrap.php b/composer/phpseclib/phpseclib/phpseclib/bootstrap.php index 081fb2a..517106c 100644 --- a/composer/phpseclib/phpseclib/phpseclib/bootstrap.php +++ b/composer/phpseclib/phpseclib/phpseclib/bootstrap.php @@ -1,7 +1,5 @@ Date: Mon, 17 Nov 2025 16:49:01 -0300 Subject: [PATCH 2/3] fix: remove phpseclib from scoper This library is too much sensitive to be scoped Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- composer.json | 1 - composer.lock | 181 +- composer/composer/autoload_classmap.php | 2 +- composer/composer/autoload_files.php | 2 +- composer/composer/autoload_psr4.php | 2 +- composer/composer/autoload_static.php | 8 +- composer/composer/installed.json | 187 +- .../constant_time_encoding/LICENSE.txt | 48 - .../constant_time_encoding/composer.json | 67 - .../constant_time_encoding/src/Base32.php | 421 -- .../constant_time_encoding/src/Base32Hex.php | 105 - .../constant_time_encoding/src/Base64.php | 315 - .../src/Base64DotSlash.php | 82 - .../src/Base64DotSlashOrdered.php | 78 - .../src/Base64UrlSafe.php | 86 - .../constant_time_encoding/src/Binary.php | 80 - .../src/EncoderInterface.php | 53 - .../constant_time_encoding/src/Encoding.php | 248 - .../constant_time_encoding/src/Hex.php | 150 - .../constant_time_encoding/src/RFC4648.php | 179 - composer/phpseclib/phpseclib/AUTHORS | 7 - composer/phpseclib/phpseclib/LICENSE | 20 - composer/phpseclib/phpseclib/composer.json | 84 - .../phpseclib/Common/Functions/Strings.php | 507 -- .../phpseclib/phpseclib/Crypt/AES.php | 116 - .../phpseclib/phpseclib/Crypt/Blowfish.php | 835 --- .../phpseclib/phpseclib/Crypt/ChaCha20.php | 799 --- .../phpseclib/Crypt/Common/AsymmetricKey.php | 581 -- .../phpseclib/Crypt/Common/BlockCipher.php | 24 - .../Crypt/Common/Formats/Keys/JWK.php | 77 - .../Crypt/Common/Formats/Keys/OpenSSH.php | 224 - .../Crypt/Common/Formats/Keys/PKCS.php | 72 - .../Crypt/Common/Formats/Keys/PKCS1.php | 209 - .../Crypt/Common/Formats/Keys/PKCS8.php | 766 --- .../Crypt/Common/Formats/Keys/PuTTY.php | 380 -- .../Crypt/Common/Formats/Signature/Raw.php | 60 - .../phpseclib/Crypt/Common/PrivateKey.php | 31 - .../phpseclib/Crypt/Common/PublicKey.php | 25 - .../phpseclib/Crypt/Common/StreamCipher.php | 54 - .../phpseclib/Crypt/Common/SymmetricKey.php | 3398 ---------- .../Crypt/Common/Traits/Fingerprint.php | 57 - .../Crypt/Common/Traits/PasswordProtected.php | 46 - .../phpseclib/phpseclib/Crypt/DES.php | 1392 ---- .../phpseclib/phpseclib/Crypt/DH.php | 405 -- .../phpseclib/Crypt/DH/Formats/Keys/PKCS1.php | 77 - .../phpseclib/Crypt/DH/Formats/Keys/PKCS8.php | 132 - .../phpseclib/Crypt/DH/Parameters.php | 36 - .../phpseclib/Crypt/DH/PrivateKey.php | 75 - .../phpseclib/Crypt/DH/PublicKey.php | 49 - .../phpseclib/phpseclib/Crypt/DSA.php | 337 - .../Crypt/DSA/Formats/Keys/OpenSSH.php | 118 - .../Crypt/DSA/Formats/Keys/PKCS1.php | 143 - .../Crypt/DSA/Formats/Keys/PKCS8.php | 146 - .../Crypt/DSA/Formats/Keys/PuTTY.php | 112 - .../phpseclib/Crypt/DSA/Formats/Keys/Raw.php | 85 - .../phpseclib/Crypt/DSA/Formats/Keys/XML.php | 132 - .../Crypt/DSA/Formats/Signature/ASN1.php | 62 - .../Crypt/DSA/Formats/Signature/Raw.php | 25 - .../Crypt/DSA/Formats/Signature/SSH2.php | 74 - .../phpseclib/Crypt/DSA/Parameters.php | 36 - .../phpseclib/Crypt/DSA/PrivateKey.php | 154 - .../phpseclib/Crypt/DSA/PublicKey.php | 87 - .../phpseclib/phpseclib/Crypt/EC.php | 480 -- .../phpseclib/Crypt/EC/BaseCurves/Base.php | 218 - .../phpseclib/Crypt/EC/BaseCurves/Binary.php | 373 -- .../Crypt/EC/BaseCurves/KoblitzPrime.php | 335 - .../Crypt/EC/BaseCurves/Montgomery.php | 279 - .../phpseclib/Crypt/EC/BaseCurves/Prime.php | 785 --- .../Crypt/EC/BaseCurves/TwistedEdwards.php | 215 - .../phpseclib/Crypt/EC/Curves/Curve25519.php | 81 - .../phpseclib/Crypt/EC/Curves/Curve448.php | 92 - .../phpseclib/Crypt/EC/Curves/Ed25519.php | 333 - .../phpseclib/Crypt/EC/Curves/Ed448.php | 273 - .../Crypt/EC/Curves/brainpoolP160r1.php | 34 - .../Crypt/EC/Curves/brainpoolP160t1.php | 47 - .../Crypt/EC/Curves/brainpoolP192r1.php | 34 - .../Crypt/EC/Curves/brainpoolP192t1.php | 34 - .../Crypt/EC/Curves/brainpoolP224r1.php | 34 - .../Crypt/EC/Curves/brainpoolP224t1.php | 34 - .../Crypt/EC/Curves/brainpoolP256r1.php | 34 - .../Crypt/EC/Curves/brainpoolP256t1.php | 34 - .../Crypt/EC/Curves/brainpoolP320r1.php | 40 - .../Crypt/EC/Curves/brainpoolP320t1.php | 40 - .../Crypt/EC/Curves/brainpoolP384r1.php | 58 - .../Crypt/EC/Curves/brainpoolP384t1.php | 58 - .../Crypt/EC/Curves/brainpoolP512r1.php | 58 - .../Crypt/EC/Curves/brainpoolP512t1.php | 58 - .../phpseclib/Crypt/EC/Curves/nistb233.php | 18 - .../phpseclib/Crypt/EC/Curves/nistb409.php | 18 - .../phpseclib/Crypt/EC/Curves/nistk163.php | 18 - .../phpseclib/Crypt/EC/Curves/nistk233.php | 18 - .../phpseclib/Crypt/EC/Curves/nistk283.php | 18 - .../phpseclib/Crypt/EC/Curves/nistk409.php | 18 - .../phpseclib/Crypt/EC/Curves/nistp192.php | 18 - .../phpseclib/Crypt/EC/Curves/nistp224.php | 18 - .../phpseclib/Crypt/EC/Curves/nistp256.php | 18 - .../phpseclib/Crypt/EC/Curves/nistp384.php | 18 - .../phpseclib/Crypt/EC/Curves/nistp521.php | 18 - .../phpseclib/Crypt/EC/Curves/nistt571.php | 18 - .../phpseclib/Crypt/EC/Curves/prime192v1.php | 18 - .../phpseclib/Crypt/EC/Curves/prime192v2.php | 34 - .../phpseclib/Crypt/EC/Curves/prime192v3.php | 34 - .../phpseclib/Crypt/EC/Curves/prime239v1.php | 34 - .../phpseclib/Crypt/EC/Curves/prime239v2.php | 34 - .../phpseclib/Crypt/EC/Curves/prime239v3.php | 34 - .../phpseclib/Crypt/EC/Curves/prime256v1.php | 18 - .../phpseclib/Crypt/EC/Curves/secp112r1.php | 34 - .../phpseclib/Crypt/EC/Curves/secp112r2.php | 35 - .../phpseclib/Crypt/EC/Curves/secp128r1.php | 34 - .../phpseclib/Crypt/EC/Curves/secp128r2.php | 35 - .../phpseclib/Crypt/EC/Curves/secp160k1.php | 46 - .../phpseclib/Crypt/EC/Curves/secp160r1.php | 34 - .../phpseclib/Crypt/EC/Curves/secp160r2.php | 35 - .../phpseclib/Crypt/EC/Curves/secp192k1.php | 45 - .../phpseclib/Crypt/EC/Curves/secp192r1.php | 78 - .../phpseclib/Crypt/EC/Curves/secp224k1.php | 45 - .../phpseclib/Crypt/EC/Curves/secp224r1.php | 34 - .../phpseclib/Crypt/EC/Curves/secp256k1.php | 49 - .../phpseclib/Crypt/EC/Curves/secp256r1.php | 34 - .../phpseclib/Crypt/EC/Curves/secp384r1.php | 52 - .../phpseclib/Crypt/EC/Curves/secp521r1.php | 46 - .../phpseclib/Crypt/EC/Curves/sect113r1.php | 34 - .../phpseclib/Crypt/EC/Curves/sect113r2.php | 34 - .../phpseclib/Crypt/EC/Curves/sect131r1.php | 34 - .../phpseclib/Crypt/EC/Curves/sect131r2.php | 34 - .../phpseclib/Crypt/EC/Curves/sect163k1.php | 34 - .../phpseclib/Crypt/EC/Curves/sect163r1.php | 34 - .../phpseclib/Crypt/EC/Curves/sect163r2.php | 34 - .../phpseclib/Crypt/EC/Curves/sect193r1.php | 34 - .../phpseclib/Crypt/EC/Curves/sect193r2.php | 34 - .../phpseclib/Crypt/EC/Curves/sect233k1.php | 34 - .../phpseclib/Crypt/EC/Curves/sect233r1.php | 34 - .../phpseclib/Crypt/EC/Curves/sect239k1.php | 34 - .../phpseclib/Crypt/EC/Curves/sect283k1.php | 34 - .../phpseclib/Crypt/EC/Curves/sect283r1.php | 34 - .../phpseclib/Crypt/EC/Curves/sect409k1.php | 38 - .../phpseclib/Crypt/EC/Curves/sect409r1.php | 38 - .../phpseclib/Crypt/EC/Curves/sect571k1.php | 42 - .../phpseclib/Crypt/EC/Curves/sect571r1.php | 42 - .../Crypt/EC/Formats/Keys/Common.php | 549 -- .../phpseclib/Crypt/EC/Formats/Keys/JWK.php | 189 - .../EC/Formats/Keys/MontgomeryPrivate.php | 101 - .../EC/Formats/Keys/MontgomeryPublic.php | 71 - .../Crypt/EC/Formats/Keys/OpenSSH.php | 209 - .../phpseclib/Crypt/EC/Formats/Keys/PKCS1.php | 194 - .../phpseclib/Crypt/EC/Formats/Keys/PKCS8.php | 237 - .../phpseclib/Crypt/EC/Formats/Keys/PuTTY.php | 138 - .../phpseclib/Crypt/EC/Formats/Keys/XML.php | 486 -- .../Crypt/EC/Formats/Keys/libsodium.php | 116 - .../Crypt/EC/Formats/Signature/ASN1.php | 62 - .../Crypt/EC/Formats/Signature/IEEE.php | 68 - .../Crypt/EC/Formats/Signature/Raw.php | 25 - .../Crypt/EC/Formats/Signature/SSH2.php | 94 - .../phpseclib/Crypt/EC/Parameters.php | 36 - .../phpseclib/Crypt/EC/PrivateKey.php | 283 - .../phpseclib/Crypt/EC/PublicKey.php | 173 - .../phpseclib/phpseclib/Crypt/Hash.php | 1891 ------ .../phpseclib/Crypt/PublicKeyLoader.php | 112 - .../phpseclib/phpseclib/Crypt/RC2.php | 640 -- .../phpseclib/phpseclib/Crypt/RC4.php | 280 - .../phpseclib/phpseclib/Crypt/RSA.php | 933 --- .../phpseclib/Crypt/RSA/Formats/Keys/JWK.php | 142 - .../Crypt/RSA/Formats/Keys/MSBLOB.php | 224 - .../Crypt/RSA/Formats/Keys/OpenSSH.php | 132 - .../Crypt/RSA/Formats/Keys/PKCS1.php | 187 - .../Crypt/RSA/Formats/Keys/PKCS8.php | 122 - .../phpseclib/Crypt/RSA/Formats/Keys/PSS.php | 238 - .../Crypt/RSA/Formats/Keys/PuTTY.php | 124 - .../phpseclib/Crypt/RSA/Formats/Keys/Raw.php | 184 - .../phpseclib/Crypt/RSA/Formats/Keys/XML.php | 171 - .../phpseclib/Crypt/RSA/PrivateKey.php | 530 -- .../phpseclib/Crypt/RSA/PublicKey.php | 513 -- .../phpseclib/phpseclib/Crypt/Random.php | 222 - .../phpseclib/phpseclib/Crypt/Rijndael.php | 1036 --- .../phpseclib/phpseclib/Crypt/Salsa20.php | 528 -- .../phpseclib/phpseclib/Crypt/TripleDES.php | 436 -- .../phpseclib/phpseclib/Crypt/Twofish.php | 816 --- .../Exception/BadConfigurationException.php | 23 - .../Exception/BadDecryptionException.php | 23 - .../phpseclib/Exception/BadModeException.php | 23 - .../Exception/ConnectionClosedException.php | 23 - .../Exception/FileNotFoundException.php | 23 - .../Exception/InconsistentSetupException.php | 23 - .../Exception/InsufficientSetupException.php | 23 - .../InvalidPacketLengthException.php | 10 - .../Exception/NoKeyLoadedException.php | 23 - .../NoSupportedAlgorithmsException.php | 23 - .../phpseclib/Exception/TimeoutException.php | 10 - .../Exception/UnableToConnectException.php | 23 - .../UnsupportedAlgorithmException.php | 23 - .../Exception/UnsupportedCurveException.php | 23 - .../Exception/UnsupportedFormatException.php | 23 - .../UnsupportedOperationException.php | 23 - .../phpseclib/phpseclib/File/ANSI.php | 551 -- .../phpseclib/phpseclib/File/ASN1.php | 1530 ----- .../phpseclib/phpseclib/File/ASN1/Element.php | 43 - .../File/ASN1/Maps/AccessDescription.php | 32 - .../ASN1/Maps/AdministrationDomainName.php | 36 - .../File/ASN1/Maps/AlgorithmIdentifier.php | 35 - .../phpseclib/File/ASN1/Maps/AnotherName.php | 37 - .../phpseclib/File/ASN1/Maps/Attribute.php | 37 - .../File/ASN1/Maps/AttributeType.php | 26 - .../File/ASN1/Maps/AttributeTypeAndValue.php | 32 - .../File/ASN1/Maps/AttributeValue.php | 26 - .../phpseclib/File/ASN1/Maps/Attributes.php | 31 - .../ASN1/Maps/AuthorityInfoAccessSyntax.php | 31 - .../File/ASN1/Maps/AuthorityKeyIdentifier.php | 45 - .../phpseclib/File/ASN1/Maps/BaseDistance.php | 26 - .../File/ASN1/Maps/BasicConstraints.php | 39 - .../Maps/BuiltInDomainDefinedAttribute.php | 32 - .../Maps/BuiltInDomainDefinedAttributes.php | 31 - .../ASN1/Maps/BuiltInStandardAttributes.php | 67 - .../phpseclib/File/ASN1/Maps/CPSuri.php | 26 - .../File/ASN1/Maps/CRLDistributionPoints.php | 31 - .../phpseclib/File/ASN1/Maps/CRLNumber.php | 26 - .../phpseclib/File/ASN1/Maps/CRLReason.php | 41 - .../phpseclib/File/ASN1/Maps/CertPolicyId.php | 26 - .../phpseclib/File/ASN1/Maps/Certificate.php | 33 - .../File/ASN1/Maps/CertificateIssuer.php | 24 - .../File/ASN1/Maps/CertificateList.php | 33 - .../File/ASN1/Maps/CertificatePolicies.php | 31 - .../ASN1/Maps/CertificateSerialNumber.php | 26 - .../File/ASN1/Maps/CertificationRequest.php | 33 - .../ASN1/Maps/CertificationRequestInfo.php | 41 - .../File/ASN1/Maps/Characteristic_two.php | 36 - .../phpseclib/File/ASN1/Maps/CountryName.php | 36 - .../phpseclib/File/ASN1/Maps/Curve.php | 36 - .../phpseclib/File/ASN1/Maps/DHParameter.php | 38 - .../phpseclib/File/ASN1/Maps/DSAParams.php | 33 - .../File/ASN1/Maps/DSAPrivateKey.php | 36 - .../phpseclib/File/ASN1/Maps/DSAPublicKey.php | 26 - .../phpseclib/File/ASN1/Maps/DigestInfo.php | 34 - .../File/ASN1/Maps/DirectoryString.php | 35 - .../phpseclib/File/ASN1/Maps/DisplayText.php | 34 - .../File/ASN1/Maps/DistributionPoint.php | 45 - .../File/ASN1/Maps/DistributionPointName.php | 40 - .../phpseclib/File/ASN1/Maps/DssSigValue.php | 32 - .../phpseclib/File/ASN1/Maps/ECParameters.php | 45 - .../phpseclib/File/ASN1/Maps/ECPoint.php | 26 - .../phpseclib/File/ASN1/Maps/ECPrivateKey.php | 48 - .../phpseclib/File/ASN1/Maps/EDIPartyName.php | 42 - .../File/ASN1/Maps/EcdsaSigValue.php | 32 - .../File/ASN1/Maps/EncryptedData.php | 26 - .../ASN1/Maps/EncryptedPrivateKeyInfo.php | 32 - .../File/ASN1/Maps/ExtKeyUsageSyntax.php | 31 - .../phpseclib/File/ASN1/Maps/Extension.php | 43 - .../File/ASN1/Maps/ExtensionAttribute.php | 42 - .../File/ASN1/Maps/ExtensionAttributes.php | 31 - .../phpseclib/File/ASN1/Maps/Extensions.php | 33 - .../phpseclib/File/ASN1/Maps/FieldElement.php | 26 - .../phpseclib/File/ASN1/Maps/FieldID.php | 35 - .../phpseclib/File/ASN1/Maps/GeneralName.php | 80 - .../phpseclib/File/ASN1/Maps/GeneralNames.php | 31 - .../File/ASN1/Maps/GeneralSubtree.php | 42 - .../File/ASN1/Maps/GeneralSubtrees.php | 31 - .../File/ASN1/Maps/HashAlgorithm.php | 24 - .../File/ASN1/Maps/HoldInstructionCode.php | 26 - .../File/ASN1/Maps/InvalidityDate.php | 26 - .../File/ASN1/Maps/IssuerAltName.php | 24 - .../ASN1/Maps/IssuingDistributionPoint.php | 68 - .../File/ASN1/Maps/KeyIdentifier.php | 26 - .../phpseclib/File/ASN1/Maps/KeyPurposeId.php | 26 - .../phpseclib/File/ASN1/Maps/KeyUsage.php | 39 - .../File/ASN1/Maps/MaskGenAlgorithm.php | 24 - .../phpseclib/File/ASN1/Maps/Name.php | 31 - .../File/ASN1/Maps/NameConstraints.php | 40 - .../File/ASN1/Maps/NetworkAddress.php | 26 - .../File/ASN1/Maps/NoticeReference.php | 37 - .../File/ASN1/Maps/NumericUserIdentifier.php | 26 - .../phpseclib/File/ASN1/Maps/ORAddress.php | 33 - .../File/ASN1/Maps/OneAsymmetricKey.php | 48 - .../File/ASN1/Maps/OrganizationName.php | 26 - .../ASN1/Maps/OrganizationalUnitNames.php | 31 - .../File/ASN1/Maps/OtherPrimeInfo.php | 34 - .../File/ASN1/Maps/OtherPrimeInfos.php | 32 - .../phpseclib/File/ASN1/Maps/PBEParameter.php | 34 - .../phpseclib/File/ASN1/Maps/PBES2params.php | 34 - .../phpseclib/File/ASN1/Maps/PBKDF2params.php | 41 - .../phpseclib/File/ASN1/Maps/PBMAC1params.php | 34 - .../phpseclib/File/ASN1/Maps/PKCS9String.php | 32 - .../phpseclib/File/ASN1/Maps/Pentanomial.php | 33 - .../phpseclib/File/ASN1/Maps/PersonalName.php | 54 - .../File/ASN1/Maps/PolicyInformation.php | 38 - .../File/ASN1/Maps/PolicyMappings.php | 37 - .../File/ASN1/Maps/PolicyQualifierId.php | 26 - .../File/ASN1/Maps/PolicyQualifierInfo.php | 32 - .../File/ASN1/Maps/PostalAddress.php | 32 - .../phpseclib/File/ASN1/Maps/Prime_p.php | 26 - .../File/ASN1/Maps/PrivateDomainName.php | 32 - .../phpseclib/File/ASN1/Maps/PrivateKey.php | 26 - .../File/ASN1/Maps/PrivateKeyInfo.php | 41 - .../File/ASN1/Maps/PrivateKeyUsagePeriod.php | 40 - .../phpseclib/File/ASN1/Maps/PublicKey.php | 26 - .../File/ASN1/Maps/PublicKeyAndChallenge.php | 32 - .../File/ASN1/Maps/PublicKeyInfo.php | 35 - .../File/ASN1/Maps/RC2CBCParameter.php | 37 - .../phpseclib/File/ASN1/Maps/RDNSequence.php | 38 - .../File/ASN1/Maps/RSAPrivateKey.php | 44 - .../phpseclib/File/ASN1/Maps/RSAPublicKey.php | 32 - .../File/ASN1/Maps/RSASSA_PSS_params.php | 58 - .../phpseclib/File/ASN1/Maps/ReasonFlags.php | 39 - .../ASN1/Maps/RelativeDistinguishedName.php | 37 - .../File/ASN1/Maps/RevokedCertificate.php | 35 - .../ASN1/Maps/SignedPublicKeyAndChallenge.php | 33 - .../File/ASN1/Maps/SpecifiedECDomain.php | 45 - .../File/ASN1/Maps/SubjectAltName.php | 24 - .../ASN1/Maps/SubjectDirectoryAttributes.php | 31 - .../ASN1/Maps/SubjectInfoAccessSyntax.php | 31 - .../File/ASN1/Maps/SubjectPublicKeyInfo.php | 32 - .../phpseclib/File/ASN1/Maps/TBSCertList.php | 54 - .../File/ASN1/Maps/TBSCertificate.php | 65 - .../File/ASN1/Maps/TerminalIdentifier.php | 26 - .../phpseclib/File/ASN1/Maps/Time.php | 32 - .../phpseclib/File/ASN1/Maps/Trinomial.php | 26 - .../File/ASN1/Maps/UniqueIdentifier.php | 26 - .../phpseclib/File/ASN1/Maps/UserNotice.php | 38 - .../phpseclib/File/ASN1/Maps/Validity.php | 32 - .../File/ASN1/Maps/netscape_ca_policy_url.php | 26 - .../File/ASN1/Maps/netscape_cert_type.php | 40 - .../File/ASN1/Maps/netscape_comment.php | 26 - .../phpseclib/phpseclib/File/X509.php | 4029 ------------ .../phpseclib/phpseclib/Math/BigInteger.php | 926 --- .../Math/BigInteger/Engines/BCMath.php | 702 -- .../Math/BigInteger/Engines/BCMath/Base.php | 110 - .../BigInteger/Engines/BCMath/BuiltIn.php | 40 - .../Engines/BCMath/DefaultEngine.php | 25 - .../BigInteger/Engines/BCMath/OpenSSL.php | 25 - .../Engines/BCMath/Reductions/Barrett.php | 196 - .../Engines/BCMath/Reductions/EvalBarrett.php | 108 - .../Math/BigInteger/Engines/Engine.php | 1331 ---- .../phpseclib/Math/BigInteger/Engines/GMP.php | 697 -- .../BigInteger/Engines/GMP/DefaultEngine.php | 40 - .../Math/BigInteger/Engines/OpenSSL.php | 68 - .../phpseclib/Math/BigInteger/Engines/PHP.php | 1360 ---- .../Math/BigInteger/Engines/PHP/Base.php | 143 - .../BigInteger/Engines/PHP/DefaultEngine.php | 25 - .../BigInteger/Engines/PHP/Montgomery.php | 89 - .../Math/BigInteger/Engines/PHP/OpenSSL.php | 25 - .../Engines/PHP/Reductions/Barrett.php | 296 - .../Engines/PHP/Reductions/Classic.php | 42 - .../Engines/PHP/Reductions/EvalBarrett.php | 500 -- .../Engines/PHP/Reductions/Montgomery.php | 126 - .../Engines/PHP/Reductions/MontgomeryMult.php | 76 - .../Engines/PHP/Reductions/PowerOfTwo.php | 59 - .../Math/BigInteger/Engines/PHP32.php | 371 -- .../Math/BigInteger/Engines/PHP64.php | 372 -- .../phpseclib/phpseclib/Math/BinaryField.php | 203 - .../phpseclib/Math/BinaryField/Integer.php | 516 -- .../phpseclib/Math/Common/FiniteField.php | 22 - .../Math/Common/FiniteField/Integer.php | 44 - .../phpseclib/phpseclib/Math/PrimeField.php | 118 - .../phpseclib/Math/PrimeField/Integer.php | 442 -- .../phpseclib/phpseclib/Net/SFTP.php | 3790 ----------- .../phpseclib/phpseclib/Net/SFTP/Stream.php | 764 --- .../phpseclib/phpseclib/Net/SSH2.php | 5633 ----------------- .../phpseclib/phpseclib/System/SSH/Agent.php | 306 - .../phpseclib/System/SSH/Agent/Identity.php | 346 - .../System/SSH/Common/Traits/ReadBytes.php | 37 - .../phpseclib/phpseclib/bootstrap.php | 22 - .../phpseclib/phpseclib/phpseclib/openssl.cnf | 6 - scoper.inc.php | 37 - 361 files changed, 9 insertions(+), 63425 deletions(-) delete mode 100644 composer/paragonie/constant_time_encoding/LICENSE.txt delete mode 100644 composer/paragonie/constant_time_encoding/composer.json delete mode 100644 composer/paragonie/constant_time_encoding/src/Base32.php delete mode 100644 composer/paragonie/constant_time_encoding/src/Base32Hex.php delete mode 100644 composer/paragonie/constant_time_encoding/src/Base64.php delete mode 100644 composer/paragonie/constant_time_encoding/src/Base64DotSlash.php delete mode 100644 composer/paragonie/constant_time_encoding/src/Base64DotSlashOrdered.php delete mode 100644 composer/paragonie/constant_time_encoding/src/Base64UrlSafe.php delete mode 100644 composer/paragonie/constant_time_encoding/src/Binary.php delete mode 100644 composer/paragonie/constant_time_encoding/src/EncoderInterface.php delete mode 100644 composer/paragonie/constant_time_encoding/src/Encoding.php delete mode 100644 composer/paragonie/constant_time_encoding/src/Hex.php delete mode 100644 composer/paragonie/constant_time_encoding/src/RFC4648.php delete mode 100644 composer/phpseclib/phpseclib/AUTHORS delete mode 100644 composer/phpseclib/phpseclib/LICENSE delete mode 100644 composer/phpseclib/phpseclib/composer.json delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Common/Functions/Strings.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/AES.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/Blowfish.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/ChaCha20.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/Common/AsymmetricKey.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/Common/BlockCipher.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/JWK.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/OpenSSH.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS8.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PuTTY.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Signature/Raw.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/Common/PrivateKey.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/Common/PublicKey.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/Common/StreamCipher.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/Common/SymmetricKey.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Traits/Fingerprint.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Traits/PasswordProtected.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/DES.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/DH.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/DH/Formats/Keys/PKCS1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/DH/Formats/Keys/PKCS8.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/DH/Parameters.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/DH/PrivateKey.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/DH/PublicKey.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/DSA.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/OpenSSH.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PKCS1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PKCS8.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PuTTY.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/Raw.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/XML.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/ASN1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/Raw.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/SSH2.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Parameters.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/PrivateKey.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/PublicKey.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Base.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Binary.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/KoblitzPrime.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Montgomery.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Prime.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/TwistedEdwards.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Curve25519.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Curve448.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Ed25519.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Ed448.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP160r1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP160t1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP192r1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP192t1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP224r1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP224t1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP256r1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP256t1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP320r1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP320t1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP384r1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP384t1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP512r1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP512t1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistb233.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistb409.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk163.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk233.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk283.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk409.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp192.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp224.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp256.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp384.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp521.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistt571.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v2.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v3.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v2.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v3.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime256v1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp112r1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp112r2.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp128r1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp128r2.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160k1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160r1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160r2.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp192k1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp192r1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp224k1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp224r1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp256k1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp256r1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp384r1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp521r1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect113r1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect113r2.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect131r1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect131r2.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163k1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163r1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163r2.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect193r1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect193r2.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect233k1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect233r1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect239k1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect283k1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect283r1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect409k1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect409r1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect571k1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect571r1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/Common.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/JWK.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/MontgomeryPrivate.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/MontgomeryPublic.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/OpenSSH.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PKCS1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PKCS8.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PuTTY.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/XML.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/libsodium.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/ASN1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/IEEE.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/Raw.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/SSH2.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Parameters.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/PrivateKey.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/EC/PublicKey.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/Hash.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/PublicKeyLoader.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/RC2.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/RC4.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/RSA.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/JWK.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/MSBLOB.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/OpenSSH.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PKCS1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PKCS8.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PSS.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PuTTY.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/Raw.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/XML.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/PrivateKey.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/PublicKey.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/Random.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/Rijndael.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/Salsa20.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/TripleDES.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Crypt/Twofish.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Exception/BadConfigurationException.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Exception/BadDecryptionException.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Exception/BadModeException.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Exception/ConnectionClosedException.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Exception/FileNotFoundException.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Exception/InconsistentSetupException.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Exception/InsufficientSetupException.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Exception/InvalidPacketLengthException.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Exception/NoKeyLoadedException.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Exception/NoSupportedAlgorithmsException.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Exception/TimeoutException.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Exception/UnableToConnectException.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Exception/UnsupportedAlgorithmException.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Exception/UnsupportedCurveException.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Exception/UnsupportedFormatException.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Exception/UnsupportedOperationException.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ANSI.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Element.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AccessDescription.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AdministrationDomainName.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AlgorithmIdentifier.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AnotherName.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Attribute.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeType.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeTypeAndValue.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeValue.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Attributes.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AuthorityInfoAccessSyntax.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AuthorityKeyIdentifier.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BaseDistance.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BasicConstraints.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInDomainDefinedAttribute.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInDomainDefinedAttributes.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInStandardAttributes.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CPSuri.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLDistributionPoints.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLNumber.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLReason.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertPolicyId.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Certificate.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateIssuer.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateList.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificatePolicies.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateSerialNumber.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificationRequest.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificationRequestInfo.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Characteristic_two.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CountryName.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Curve.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DHParameter.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAParams.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAPrivateKey.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAPublicKey.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DigestInfo.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DirectoryString.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DisplayText.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DistributionPoint.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DistributionPointName.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DssSigValue.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECParameters.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECPoint.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECPrivateKey.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EDIPartyName.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EcdsaSigValue.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EncryptedData.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EncryptedPrivateKeyInfo.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtKeyUsageSyntax.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Extension.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtensionAttribute.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtensionAttributes.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Extensions.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/FieldElement.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/FieldID.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralName.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralNames.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralSubtree.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralSubtrees.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/HashAlgorithm.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/HoldInstructionCode.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/InvalidityDate.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/IssuerAltName.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/IssuingDistributionPoint.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyIdentifier.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyPurposeId.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyUsage.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/MaskGenAlgorithm.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Name.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NameConstraints.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NetworkAddress.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NoticeReference.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NumericUserIdentifier.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ORAddress.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OneAsymmetricKey.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OrganizationName.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OrganizationalUnitNames.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OtherPrimeInfo.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OtherPrimeInfos.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBEParameter.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBES2params.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBKDF2params.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBMAC1params.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PKCS9String.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Pentanomial.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PersonalName.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyInformation.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyMappings.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyQualifierId.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyQualifierInfo.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PostalAddress.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Prime_p.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateDomainName.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKey.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKeyInfo.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKeyUsagePeriod.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKey.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKeyAndChallenge.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKeyInfo.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RC2CBCParameter.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RDNSequence.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSAPrivateKey.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSAPublicKey.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSASSA_PSS_params.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ReasonFlags.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RelativeDistinguishedName.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RevokedCertificate.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SignedPublicKeyAndChallenge.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SpecifiedECDomain.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectAltName.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectDirectoryAttributes.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectInfoAccessSyntax.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectPublicKeyInfo.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TBSCertList.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TBSCertificate.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TerminalIdentifier.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Time.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Trinomial.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/UniqueIdentifier.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/UserNotice.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Validity.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_ca_policy_url.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_cert_type.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_comment.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/File/X509.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Math/BigInteger.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Base.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/BuiltIn.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/DefaultEngine.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/OpenSSL.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Reductions/Barrett.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Reductions/EvalBarrett.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/Engine.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/GMP.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/GMP/DefaultEngine.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/OpenSSL.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Base.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/DefaultEngine.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Montgomery.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/OpenSSL.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Barrett.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Classic.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/EvalBarrett.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Montgomery.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/MontgomeryMult.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/PowerOfTwo.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP32.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP64.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Math/BinaryField.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Math/BinaryField/Integer.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Math/Common/FiniteField.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Math/Common/FiniteField/Integer.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Math/PrimeField.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Math/PrimeField/Integer.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Net/SFTP.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Net/SFTP/Stream.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/Net/SSH2.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/System/SSH/Agent.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/System/SSH/Agent/Identity.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/System/SSH/Common/Traits/ReadBytes.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/bootstrap.php delete mode 100644 composer/phpseclib/phpseclib/phpseclib/openssl.cnf diff --git a/composer.json b/composer.json index 0fbf467..65c5169 100644 --- a/composer.json +++ b/composer.json @@ -43,7 +43,6 @@ "mikehaertl/php-pdftk": "^0.14.2", "mpdf/mpdf": "^8.2.6", "pagerfanta/pagerfanta": "^4.7.1", - "phpseclib/phpseclib": "^3.0.47", "roave/security-advisories": "dev-latest", "smalot/pdfparser": "^2.12.1", "twig/twig": "^3.21.1", diff --git a/composer.lock b/composer.lock index 473de88..08aa9d3 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "4c0225b04faa6bddada4539f4b37342b", + "content-hash": "80658157b9c8bab69314c228d2e53676", "packages": [ { "name": "bacon/bacon-qr-code", @@ -830,75 +830,6 @@ ], "time": "2025-10-12T17:35:33+00:00" }, - { - "name": "paragonie/constant_time_encoding", - "version": "v3.1.3", - "source": { - "type": "git", - "url": "https://github.com/paragonie/constant_time_encoding.git", - "reference": "d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/paragonie/constant_time_encoding/zipball/d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77", - "reference": "d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77", - "shasum": "" - }, - "require": { - "php": "^8" - }, - "require-dev": { - "infection/infection": "^0", - "nikic/php-fuzzer": "^0", - "phpunit/phpunit": "^9|^10|^11", - "vimeo/psalm": "^4|^5|^6" - }, - "type": "library", - "autoload": { - "psr-4": { - "ParagonIE\\ConstantTime\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Paragon Initiative Enterprises", - "email": "security@paragonie.com", - "homepage": "https://paragonie.com", - "role": "Maintainer" - }, - { - "name": "Steve 'Sc00bz' Thomas", - "email": "steve@tobtu.com", - "homepage": "https://www.tobtu.com", - "role": "Original Developer" - } - ], - "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)", - "keywords": [ - "base16", - "base32", - "base32_decode", - "base32_encode", - "base64", - "base64_decode", - "base64_encode", - "bin2hex", - "encoding", - "hex", - "hex2bin", - "rfc4648" - ], - "support": { - "email": "info@paragonie.com", - "issues": "https://github.com/paragonie/constant_time_encoding/issues", - "source": "https://github.com/paragonie/constant_time_encoding" - }, - "time": "2025-09-24T15:06:41+00:00" - }, { "name": "paragonie/random_compat", "version": "v9.99.100", @@ -949,116 +880,6 @@ }, "time": "2020-10-15T08:29:30+00:00" }, - { - "name": "phpseclib/phpseclib", - "version": "3.0.47", - "source": { - "type": "git", - "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "9d6ca36a6c2dd434765b1071b2644a1c683b385d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/9d6ca36a6c2dd434765b1071b2644a1c683b385d", - "reference": "9d6ca36a6c2dd434765b1071b2644a1c683b385d", - "shasum": "" - }, - "require": { - "paragonie/constant_time_encoding": "^1|^2|^3", - "paragonie/random_compat": "^1.4|^2.0|^9.99.99", - "php": ">=5.6.1" - }, - "require-dev": { - "phpunit/phpunit": "*" - }, - "suggest": { - "ext-dom": "Install the DOM extension to load XML formatted public keys.", - "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", - "ext-libsodium": "SSH2/SFTP can make use of some algorithms provided by the libsodium-php extension.", - "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", - "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." - }, - "type": "library", - "autoload": { - "files": [ - "phpseclib/bootstrap.php" - ], - "psr-4": { - "phpseclib3\\": "phpseclib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jim Wigginton", - "email": "terrafrost@php.net", - "role": "Lead Developer" - }, - { - "name": "Patrick Monnerat", - "email": "pm@datasphere.ch", - "role": "Developer" - }, - { - "name": "Andreas Fischer", - "email": "bantu@phpbb.com", - "role": "Developer" - }, - { - "name": "Hans-Jürgen Petrich", - "email": "petrich@tronic-media.com", - "role": "Developer" - }, - { - "name": "Graham Campbell", - "email": "graham@alt-three.com", - "role": "Developer" - } - ], - "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", - "homepage": "http://phpseclib.sourceforge.net", - "keywords": [ - "BigInteger", - "aes", - "asn.1", - "asn1", - "blowfish", - "crypto", - "cryptography", - "encryption", - "rsa", - "security", - "sftp", - "signature", - "signing", - "ssh", - "twofish", - "x.509", - "x509" - ], - "support": { - "issues": "https://github.com/phpseclib/phpseclib/issues", - "source": "https://github.com/phpseclib/phpseclib/tree/3.0.47" - }, - "funding": [ - { - "url": "https://github.com/terrafrost", - "type": "github" - }, - { - "url": "https://www.patreon.com/phpseclib", - "type": "patreon" - }, - { - "url": "https://tidelift.com/funding/github/packagist/phpseclib/phpseclib", - "type": "tidelift" - } - ], - "time": "2025-10-06T01:07:24+00:00" - }, { "name": "psr/http-message", "version": "2.0", diff --git a/composer/composer/autoload_classmap.php b/composer/composer/autoload_classmap.php index a619135..f89bef1 100644 --- a/composer/composer/autoload_classmap.php +++ b/composer/composer/autoload_classmap.php @@ -5,4 +5,4 @@ // autoload_classmap.php @generated by Composer $vendorDir = \dirname(__DIR__); $baseDir = \dirname($vendorDir); -return array('OCA\\Libresign\\Vendor\\BaconQrCode\\Common\\BitArray' => $vendorDir . '/bacon/bacon-qr-code/src/Common/BitArray.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Common\\BitMatrix' => $vendorDir . '/bacon/bacon-qr-code/src/Common/BitMatrix.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Common\\BitUtils' => $vendorDir . '/bacon/bacon-qr-code/src/Common/BitUtils.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Common\\CharacterSetEci' => $vendorDir . '/bacon/bacon-qr-code/src/Common/CharacterSetEci.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Common\\EcBlock' => $vendorDir . '/bacon/bacon-qr-code/src/Common/EcBlock.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Common\\EcBlocks' => $vendorDir . '/bacon/bacon-qr-code/src/Common/EcBlocks.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Common\\ErrorCorrectionLevel' => $vendorDir . '/bacon/bacon-qr-code/src/Common/ErrorCorrectionLevel.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Common\\FormatInformation' => $vendorDir . '/bacon/bacon-qr-code/src/Common/FormatInformation.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Common\\Mode' => $vendorDir . '/bacon/bacon-qr-code/src/Common/Mode.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Common\\ReedSolomonCodec' => $vendorDir . '/bacon/bacon-qr-code/src/Common/ReedSolomonCodec.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Common\\Version' => $vendorDir . '/bacon/bacon-qr-code/src/Common/Version.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Encoder\\BlockPair' => $vendorDir . '/bacon/bacon-qr-code/src/Encoder/BlockPair.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Encoder\\ByteMatrix' => $vendorDir . '/bacon/bacon-qr-code/src/Encoder/ByteMatrix.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Encoder\\Encoder' => $vendorDir . '/bacon/bacon-qr-code/src/Encoder/Encoder.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Encoder\\MaskUtil' => $vendorDir . '/bacon/bacon-qr-code/src/Encoder/MaskUtil.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Encoder\\MatrixUtil' => $vendorDir . '/bacon/bacon-qr-code/src/Encoder/MatrixUtil.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Encoder\\QrCode' => $vendorDir . '/bacon/bacon-qr-code/src/Encoder/QrCode.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Exception\\ExceptionInterface' => $vendorDir . '/bacon/bacon-qr-code/src/Exception/ExceptionInterface.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Exception\\InvalidArgumentException' => $vendorDir . '/bacon/bacon-qr-code/src/Exception/InvalidArgumentException.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Exception\\OutOfBoundsException' => $vendorDir . '/bacon/bacon-qr-code/src/Exception/OutOfBoundsException.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Exception\\RuntimeException' => $vendorDir . '/bacon/bacon-qr-code/src/Exception/RuntimeException.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Exception\\UnexpectedValueException' => $vendorDir . '/bacon/bacon-qr-code/src/Exception/UnexpectedValueException.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Exception\\WriterException' => $vendorDir . '/bacon/bacon-qr-code/src/Exception/WriterException.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Color\\Alpha' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Color/Alpha.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Color\\Cmyk' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Color/Cmyk.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Color\\ColorInterface' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Color/ColorInterface.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Color\\Gray' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Color/Gray.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Color\\Rgb' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Color/Rgb.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Eye\\CompositeEye' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Eye/CompositeEye.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Eye\\EyeInterface' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Eye/EyeInterface.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Eye\\ModuleEye' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Eye/ModuleEye.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Eye\\PointyEye' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Eye/PointyEye.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Eye\\SimpleCircleEye' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Eye/SimpleCircleEye.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Eye\\SquareEye' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Eye/SquareEye.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\GDLibRenderer' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/GDLibRenderer.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\ImageRenderer' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/ImageRenderer.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Image\\EpsImageBackEnd' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Image/EpsImageBackEnd.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Image\\ImageBackEndInterface' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Image/ImageBackEndInterface.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Image\\ImagickImageBackEnd' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Image/ImagickImageBackEnd.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Image\\SvgImageBackEnd' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Image/SvgImageBackEnd.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Image\\TransformationMatrix' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Image/TransformationMatrix.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Module\\DotsModule' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Module/DotsModule.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Module\\EdgeIterator\\Edge' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Module/EdgeIterator/Edge.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Module\\EdgeIterator\\EdgeIterator' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Module/EdgeIterator/EdgeIterator.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Module\\ModuleInterface' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Module/ModuleInterface.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Module\\RoundnessModule' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Module/RoundnessModule.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Module\\SquareModule' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Module/SquareModule.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Path\\Close' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Path/Close.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Path\\Curve' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Path/Curve.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Path\\EllipticArc' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Path/EllipticArc.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Path\\Line' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Path/Line.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Path\\Move' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Path/Move.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Path\\OperationInterface' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Path/OperationInterface.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Path\\Path' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Path/Path.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\PlainTextRenderer' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/PlainTextRenderer.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\RendererInterface' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/RendererInterface.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\RendererStyle\\EyeFill' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/RendererStyle/EyeFill.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\RendererStyle\\Fill' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/RendererStyle/Fill.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\RendererStyle\\Gradient' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/RendererStyle/Gradient.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\RendererStyle\\GradientType' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/RendererStyle/GradientType.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\RendererStyle\\RendererStyle' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/RendererStyle/RendererStyle.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Writer' => $vendorDir . '/bacon/bacon-qr-code/src/Writer.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\ApplicationFactory\\FreshInstanceApplicationFactory' => $vendorDir . '/bamarni/composer-bin-plugin/src/ApplicationFactory/FreshInstanceApplicationFactory.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\ApplicationFactory\\NamespaceApplicationFactory' => $vendorDir . '/bamarni/composer-bin-plugin/src/ApplicationFactory/NamespaceApplicationFactory.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\BamarniBinPlugin' => $vendorDir . '/bamarni/composer-bin-plugin/src/BamarniBinPlugin.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\CommandProvider' => $vendorDir . '/bamarni/composer-bin-plugin/src/CommandProvider.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\Command\\BinCommand' => $vendorDir . '/bamarni/composer-bin-plugin/src/Command/BinCommand.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\Command\\CouldNotCreateNamespaceDir' => $vendorDir . '/bamarni/composer-bin-plugin/src/Command/CouldNotCreateNamespaceDir.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\Config\\Config' => $vendorDir . '/bamarni/composer-bin-plugin/src/Config/Config.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\Config\\ConfigFactory' => $vendorDir . '/bamarni/composer-bin-plugin/src/Config/ConfigFactory.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\Config\\InvalidBamarniComposerExtraConfig' => $vendorDir . '/bamarni/composer-bin-plugin/src/Config/InvalidBamarniComposerExtraConfig.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\Input\\BinInputFactory' => $vendorDir . '/bamarni/composer-bin-plugin/src/Input/BinInputFactory.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\Input\\InvalidBinInput' => $vendorDir . '/bamarni/composer-bin-plugin/src/Input/InvalidBinInput.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\Logger' => $vendorDir . '/bamarni/composer-bin-plugin/src/Logger.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\PublicIO' => $vendorDir . '/bamarni/composer-bin-plugin/src/PublicIO.php', 'OCA\\Libresign\\Vendor\\Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', 'OCA\\Libresign\\Vendor\\DASPRiD\\Enum\\AbstractEnum' => $vendorDir . '/dasprid/enum/src/AbstractEnum.php', 'OCA\\Libresign\\Vendor\\DASPRiD\\Enum\\EnumMap' => $vendorDir . '/dasprid/enum/src/EnumMap.php', 'OCA\\Libresign\\Vendor\\DASPRiD\\Enum\\Exception\\CloneNotSupportedException' => $vendorDir . '/dasprid/enum/src/Exception/CloneNotSupportedException.php', 'OCA\\Libresign\\Vendor\\DASPRiD\\Enum\\Exception\\ExceptionInterface' => $vendorDir . '/dasprid/enum/src/Exception/ExceptionInterface.php', 'OCA\\Libresign\\Vendor\\DASPRiD\\Enum\\Exception\\ExpectationException' => $vendorDir . '/dasprid/enum/src/Exception/ExpectationException.php', 'OCA\\Libresign\\Vendor\\DASPRiD\\Enum\\Exception\\IllegalArgumentException' => $vendorDir . '/dasprid/enum/src/Exception/IllegalArgumentException.php', 'OCA\\Libresign\\Vendor\\DASPRiD\\Enum\\Exception\\MismatchException' => $vendorDir . '/dasprid/enum/src/Exception/MismatchException.php', 'OCA\\Libresign\\Vendor\\DASPRiD\\Enum\\Exception\\SerializeNotSupportedException' => $vendorDir . '/dasprid/enum/src/Exception/SerializeNotSupportedException.php', 'OCA\\Libresign\\Vendor\\DASPRiD\\Enum\\Exception\\UnserializeNotSupportedException' => $vendorDir . '/dasprid/enum/src/Exception/UnserializeNotSupportedException.php', 'OCA\\Libresign\\Vendor\\DASPRiD\\Enum\\NullValue' => $vendorDir . '/dasprid/enum/src/NullValue.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\DeepCopy' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/DeepCopy.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Exception\\CloneException' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Exception\\PropertyException' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Exception/PropertyException.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Filter\\ChainableFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/ChainableFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Filter\\Doctrine\\DoctrineCollectionFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Filter\\Doctrine\\DoctrineEmptyCollectionFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Filter\\Doctrine\\DoctrineProxyFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Filter\\Filter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Filter\\KeepFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/KeepFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Filter\\ReplaceFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/ReplaceFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Filter\\SetNullFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Matcher\\Doctrine\\DoctrineProxyMatcher' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Matcher\\Matcher' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Matcher/Matcher.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Matcher\\PropertyMatcher' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyMatcher.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Matcher\\PropertyNameMatcher' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Matcher\\PropertyTypeMatcher' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Reflection\\ReflectionHelper' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\TypeFilter\\Date\\DateIntervalFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\TypeFilter\\Date\\DatePeriodFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DatePeriodFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\TypeFilter\\ReplaceFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\TypeFilter\\ShallowCopyFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\TypeFilter\\Spl\\ArrayObjectFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/ArrayObjectFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\TypeFilter\\Spl\\SplDoublyLinkedList' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\TypeFilter\\Spl\\SplDoublyLinkedListFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedListFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\TypeFilter\\TypeFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\TypeMatcher\\TypeMatcher' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeMatcher/TypeMatcher.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Bacon\\ErrorCorrectionLevelConverter' => $vendorDir . '/endroid/qr-code/src/Bacon/ErrorCorrectionLevelConverter.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Bacon\\MatrixFactory' => $vendorDir . '/endroid/qr-code/src/Bacon/MatrixFactory.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Builder\\Builder' => $vendorDir . '/endroid/qr-code/src/Builder/Builder.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Builder\\BuilderInterface' => $vendorDir . '/endroid/qr-code/src/Builder/BuilderInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Builder\\BuilderRegistry' => $vendorDir . '/endroid/qr-code/src/Builder/BuilderRegistry.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Builder\\BuilderRegistryInterface' => $vendorDir . '/endroid/qr-code/src/Builder/BuilderRegistryInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Color\\Color' => $vendorDir . '/endroid/qr-code/src/Color/Color.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Color\\ColorInterface' => $vendorDir . '/endroid/qr-code/src/Color/ColorInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Encoding\\Encoding' => $vendorDir . '/endroid/qr-code/src/Encoding/Encoding.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Encoding\\EncodingInterface' => $vendorDir . '/endroid/qr-code/src/Encoding/EncodingInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\ErrorCorrectionLevel' => $vendorDir . '/endroid/qr-code/src/ErrorCorrectionLevel.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Exception\\BlockSizeTooSmallException' => $vendorDir . '/endroid/qr-code/src/Exception/BlockSizeTooSmallException.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Exception\\ValidationException' => $vendorDir . '/endroid/qr-code/src/Exception/ValidationException.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\ImageData\\LabelImageData' => $vendorDir . '/endroid/qr-code/src/ImageData/LabelImageData.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\ImageData\\LogoImageData' => $vendorDir . '/endroid/qr-code/src/ImageData/LogoImageData.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Label\\Font\\Font' => $vendorDir . '/endroid/qr-code/src/Label/Font/Font.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Label\\Font\\FontInterface' => $vendorDir . '/endroid/qr-code/src/Label/Font/FontInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Label\\Font\\OpenSans' => $vendorDir . '/endroid/qr-code/src/Label/Font/OpenSans.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Label\\Label' => $vendorDir . '/endroid/qr-code/src/Label/Label.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Label\\LabelAlignment' => $vendorDir . '/endroid/qr-code/src/Label/LabelAlignment.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Label\\LabelInterface' => $vendorDir . '/endroid/qr-code/src/Label/LabelInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Label\\Margin\\Margin' => $vendorDir . '/endroid/qr-code/src/Label/Margin/Margin.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Label\\Margin\\MarginInterface' => $vendorDir . '/endroid/qr-code/src/Label/Margin/MarginInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Logo\\Logo' => $vendorDir . '/endroid/qr-code/src/Logo/Logo.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Logo\\LogoInterface' => $vendorDir . '/endroid/qr-code/src/Logo/LogoInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Matrix\\Matrix' => $vendorDir . '/endroid/qr-code/src/Matrix/Matrix.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Matrix\\MatrixFactoryInterface' => $vendorDir . '/endroid/qr-code/src/Matrix/MatrixFactoryInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Matrix\\MatrixInterface' => $vendorDir . '/endroid/qr-code/src/Matrix/MatrixInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\QrCode' => $vendorDir . '/endroid/qr-code/src/QrCode.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\QrCodeInterface' => $vendorDir . '/endroid/qr-code/src/QrCodeInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\RoundBlockSizeMode' => $vendorDir . '/endroid/qr-code/src/RoundBlockSizeMode.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\AbstractGdWriter' => $vendorDir . '/endroid/qr-code/src/Writer/AbstractGdWriter.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\BinaryWriter' => $vendorDir . '/endroid/qr-code/src/Writer/BinaryWriter.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\ConsoleWriter' => $vendorDir . '/endroid/qr-code/src/Writer/ConsoleWriter.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\DebugWriter' => $vendorDir . '/endroid/qr-code/src/Writer/DebugWriter.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\EpsWriter' => $vendorDir . '/endroid/qr-code/src/Writer/EpsWriter.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\GifWriter' => $vendorDir . '/endroid/qr-code/src/Writer/GifWriter.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\PdfWriter' => $vendorDir . '/endroid/qr-code/src/Writer/PdfWriter.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\PngWriter' => $vendorDir . '/endroid/qr-code/src/Writer/PngWriter.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\AbstractResult' => $vendorDir . '/endroid/qr-code/src/Writer/Result/AbstractResult.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\BinaryResult' => $vendorDir . '/endroid/qr-code/src/Writer/Result/BinaryResult.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\ConsoleResult' => $vendorDir . '/endroid/qr-code/src/Writer/Result/ConsoleResult.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\DebugResult' => $vendorDir . '/endroid/qr-code/src/Writer/Result/DebugResult.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\EpsResult' => $vendorDir . '/endroid/qr-code/src/Writer/Result/EpsResult.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\GdResult' => $vendorDir . '/endroid/qr-code/src/Writer/Result/GdResult.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\GifResult' => $vendorDir . '/endroid/qr-code/src/Writer/Result/GifResult.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\PdfResult' => $vendorDir . '/endroid/qr-code/src/Writer/Result/PdfResult.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\PngResult' => $vendorDir . '/endroid/qr-code/src/Writer/Result/PngResult.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\ResultInterface' => $vendorDir . '/endroid/qr-code/src/Writer/Result/ResultInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\SvgResult' => $vendorDir . '/endroid/qr-code/src/Writer/Result/SvgResult.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\WebPResult' => $vendorDir . '/endroid/qr-code/src/Writer/Result/WebPResult.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\SvgWriter' => $vendorDir . '/endroid/qr-code/src/Writer/SvgWriter.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\ValidatingWriterInterface' => $vendorDir . '/endroid/qr-code/src/Writer/ValidatingWriterInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\WebPWriter' => $vendorDir . '/endroid/qr-code/src/Writer/WebPWriter.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\WriterInterface' => $vendorDir . '/endroid/qr-code/src/Writer/WriterInterface.php', 'OCA\\Libresign\\Vendor\\Jeidison\\JSignPDF\\JSignFileService' => $vendorDir . '/jsignpdf/jsignpdf-php/src/JSignFileService.php', 'OCA\\Libresign\\Vendor\\Jeidison\\JSignPDF\\JSignPDF' => $vendorDir . '/jsignpdf/jsignpdf-php/src/JSignPDF.php', 'OCA\\Libresign\\Vendor\\Jeidison\\JSignPDF\\Runtime\\JSignPdfRuntimeService' => $vendorDir . '/jsignpdf/jsignpdf-php/src/Runtime/JSignPdfRuntimeService.php', 'OCA\\Libresign\\Vendor\\Jeidison\\JSignPDF\\Runtime\\JavaRuntimeService' => $vendorDir . '/jsignpdf/jsignpdf-php/src/Runtime/JavaRuntimeService.php', 'OCA\\Libresign\\Vendor\\Jeidison\\JSignPDF\\Sign\\JSignParam' => $vendorDir . '/jsignpdf/jsignpdf-php/src/Sign/JSignParam.php', 'OCA\\Libresign\\Vendor\\Jeidison\\JSignPDF\\Sign\\JSignService' => $vendorDir . '/jsignpdf/jsignpdf-php/src/Sign/JSignService.php', 'OCA\\Libresign\\Vendor\\LibreSign\\WhatOSAmI\\OperatingSystem' => $vendorDir . '/libresign/whatosami/src/OperatingSystem.php', 'OCA\\Libresign\\Vendor\\Mpdf\\AssetFetcher' => $vendorDir . '/mpdf/mpdf/src/AssetFetcher.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode' => $vendorDir . '/mpdf/mpdf/src/Barcode.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\AbstractBarcode' => $vendorDir . '/mpdf/mpdf/src/Barcode/AbstractBarcode.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\BarcodeException' => $vendorDir . '/mpdf/mpdf/src/Barcode/BarcodeException.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\BarcodeInterface' => $vendorDir . '/mpdf/mpdf/src/Barcode/BarcodeInterface.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\Codabar' => $vendorDir . '/mpdf/mpdf/src/Barcode/Codabar.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\Code11' => $vendorDir . '/mpdf/mpdf/src/Barcode/Code11.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\Code128' => $vendorDir . '/mpdf/mpdf/src/Barcode/Code128.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\Code39' => $vendorDir . '/mpdf/mpdf/src/Barcode/Code39.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\Code93' => $vendorDir . '/mpdf/mpdf/src/Barcode/Code93.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\EanExt' => $vendorDir . '/mpdf/mpdf/src/Barcode/EanExt.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\EanUpc' => $vendorDir . '/mpdf/mpdf/src/Barcode/EanUpc.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\I25' => $vendorDir . '/mpdf/mpdf/src/Barcode/I25.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\Imb' => $vendorDir . '/mpdf/mpdf/src/Barcode/Imb.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\Msi' => $vendorDir . '/mpdf/mpdf/src/Barcode/Msi.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\Postnet' => $vendorDir . '/mpdf/mpdf/src/Barcode/Postnet.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\Rm4Scc' => $vendorDir . '/mpdf/mpdf/src/Barcode/Rm4Scc.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\S25' => $vendorDir . '/mpdf/mpdf/src/Barcode/S25.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Cache' => $vendorDir . '/mpdf/mpdf/src/Cache.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Color\\ColorConverter' => $vendorDir . '/mpdf/mpdf/src/Color/ColorConverter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Color\\ColorModeConverter' => $vendorDir . '/mpdf/mpdf/src/Color/ColorModeConverter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Color\\ColorSpaceRestrictor' => $vendorDir . '/mpdf/mpdf/src/Color/ColorSpaceRestrictor.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Color\\NamedColors' => $vendorDir . '/mpdf/mpdf/src/Color/NamedColors.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Config\\ConfigVariables' => $vendorDir . '/mpdf/mpdf/src/Config/ConfigVariables.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Config\\FontVariables' => $vendorDir . '/mpdf/mpdf/src/Config/FontVariables.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Container\\ContainerInterface' => $vendorDir . '/mpdf/mpdf/src/Container/ContainerInterface.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Container\\NotFoundException' => $vendorDir . '/mpdf/mpdf/src/Container/NotFoundException.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Container\\SimpleContainer' => $vendorDir . '/mpdf/mpdf/src/Container/SimpleContainer.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Conversion\\DecToAlpha' => $vendorDir . '/mpdf/mpdf/src/Conversion/DecToAlpha.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Conversion\\DecToCjk' => $vendorDir . '/mpdf/mpdf/src/Conversion/DecToCjk.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Conversion\\DecToHebrew' => $vendorDir . '/mpdf/mpdf/src/Conversion/DecToHebrew.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Conversion\\DecToOther' => $vendorDir . '/mpdf/mpdf/src/Conversion/DecToOther.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Conversion\\DecToRoman' => $vendorDir . '/mpdf/mpdf/src/Conversion/DecToRoman.php', 'OCA\\Libresign\\Vendor\\Mpdf\\CssManager' => $vendorDir . '/mpdf/mpdf/src/CssManager.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Css\\Border' => $vendorDir . '/mpdf/mpdf/src/Css/Border.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Css\\DefaultCss' => $vendorDir . '/mpdf/mpdf/src/Css/DefaultCss.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Css\\TextVars' => $vendorDir . '/mpdf/mpdf/src/Css/TextVars.php', 'OCA\\Libresign\\Vendor\\Mpdf\\DirectWrite' => $vendorDir . '/mpdf/mpdf/src/DirectWrite.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Exception\\AssetFetchingException' => $vendorDir . '/mpdf/mpdf/src/Exception/AssetFetchingException.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Exception\\FontException' => $vendorDir . '/mpdf/mpdf/src/Exception/FontException.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Exception\\InvalidArgumentException' => $vendorDir . '/mpdf/mpdf/src/Exception/InvalidArgumentException.php', 'OCA\\Libresign\\Vendor\\Mpdf\\File\\LocalContentLoader' => $vendorDir . '/mpdf/mpdf/src/File/LocalContentLoader.php', 'OCA\\Libresign\\Vendor\\Mpdf\\File\\LocalContentLoaderInterface' => $vendorDir . '/mpdf/mpdf/src/File/LocalContentLoaderInterface.php', 'OCA\\Libresign\\Vendor\\Mpdf\\File\\StreamWrapperChecker' => $vendorDir . '/mpdf/mpdf/src/File/StreamWrapperChecker.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Fonts\\FontCache' => $vendorDir . '/mpdf/mpdf/src/Fonts/FontCache.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Fonts\\FontFileFinder' => $vendorDir . '/mpdf/mpdf/src/Fonts/FontFileFinder.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Fonts\\GlyphOperator' => $vendorDir . '/mpdf/mpdf/src/Fonts/GlyphOperator.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Fonts\\MetricsGenerator' => $vendorDir . '/mpdf/mpdf/src/Fonts/MetricsGenerator.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Form' => $vendorDir . '/mpdf/mpdf/src/Form.php', 'OCA\\Libresign\\Vendor\\Mpdf\\FpdiTrait' => $vendorDir . '/mpdf/mpdf/src/FpdiTrait.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Gif\\ColorTable' => $vendorDir . '/mpdf/mpdf/src/Gif/ColorTable.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Gif\\FileHeader' => $vendorDir . '/mpdf/mpdf/src/Gif/FileHeader.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Gif\\Gif' => $vendorDir . '/mpdf/mpdf/src/Gif/Gif.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Gif\\Image' => $vendorDir . '/mpdf/mpdf/src/Gif/Image.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Gif\\ImageHeader' => $vendorDir . '/mpdf/mpdf/src/Gif/ImageHeader.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Gif\\Lzw' => $vendorDir . '/mpdf/mpdf/src/Gif/Lzw.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Gradient' => $vendorDir . '/mpdf/mpdf/src/Gradient.php', 'OCA\\Libresign\\Vendor\\Mpdf\\HTMLParserMode' => $vendorDir . '/mpdf/mpdf/src/HTMLParserMode.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Http\\ClientInterface' => $vendorDir . '/mpdf/mpdf/src/Http/ClientInterface.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Http\\CurlHttpClient' => $vendorDir . '/mpdf/mpdf/src/Http/CurlHttpClient.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Http\\Exception\\ClientException' => $vendorDir . '/mpdf/mpdf/src/Http/Exception/ClientException.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Http\\Exception\\ForbiddenRequestException' => $vendorDir . '/mpdf/mpdf/src/Http/Exception/ForbiddenRequestException.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Http\\Exception\\NetworkException' => $vendorDir . '/mpdf/mpdf/src/Http/Exception/NetworkException.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Http\\Exception\\RequestException' => $vendorDir . '/mpdf/mpdf/src/Http/Exception/RequestException.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Http\\SocketHttpClient' => $vendorDir . '/mpdf/mpdf/src/Http/SocketHttpClient.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Hyphenator' => $vendorDir . '/mpdf/mpdf/src/Hyphenator.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Image\\Bmp' => $vendorDir . '/mpdf/mpdf/src/Image/Bmp.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Image\\ImageProcessor' => $vendorDir . '/mpdf/mpdf/src/Image/ImageProcessor.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Image\\ImageTypeGuesser' => $vendorDir . '/mpdf/mpdf/src/Image/ImageTypeGuesser.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Image\\Svg' => $vendorDir . '/mpdf/mpdf/src/Image/Svg.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Image\\Wmf' => $vendorDir . '/mpdf/mpdf/src/Image/Wmf.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Language\\LanguageToFont' => $vendorDir . '/mpdf/mpdf/src/Language/LanguageToFont.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Language\\LanguageToFontInterface' => $vendorDir . '/mpdf/mpdf/src/Language/LanguageToFontInterface.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Language\\ScriptToLanguage' => $vendorDir . '/mpdf/mpdf/src/Language/ScriptToLanguage.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Language\\ScriptToLanguageInterface' => $vendorDir . '/mpdf/mpdf/src/Language/ScriptToLanguageInterface.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Log\\Context' => $vendorDir . '/mpdf/mpdf/src/Log/Context.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Mpdf' => $vendorDir . '/mpdf/mpdf/src/Mpdf.php', 'OCA\\Libresign\\Vendor\\Mpdf\\MpdfException' => $vendorDir . '/mpdf/mpdf/src/MpdfException.php', 'OCA\\Libresign\\Vendor\\Mpdf\\MpdfImageException' => $vendorDir . '/mpdf/mpdf/src/MpdfImageException.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Otl' => $vendorDir . '/mpdf/mpdf/src/Otl.php', 'OCA\\Libresign\\Vendor\\Mpdf\\OtlDump' => $vendorDir . '/mpdf/mpdf/src/OtlDump.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Output\\Destination' => $vendorDir . '/mpdf/mpdf/src/Output/Destination.php', 'OCA\\Libresign\\Vendor\\Mpdf\\PageBox' => $vendorDir . '/mpdf/mpdf/src/PageBox.php', 'OCA\\Libresign\\Vendor\\Mpdf\\PageFormat' => $vendorDir . '/mpdf/mpdf/src/PageFormat.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Pdf\\Protection' => $vendorDir . '/mpdf/mpdf/src/Pdf/Protection.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Pdf\\Protection\\UniqidGenerator' => $vendorDir . '/mpdf/mpdf/src/Pdf/Protection/UniqidGenerator.php', 'OCA\\Libresign\\Vendor\\Mpdf\\PsrHttpMessageShim\\Request' => $vendorDir . '/mpdf/psr-http-message-shim/src/Request.php', 'OCA\\Libresign\\Vendor\\Mpdf\\PsrHttpMessageShim\\Response' => $vendorDir . '/mpdf/psr-http-message-shim/src/Response.php', 'OCA\\Libresign\\Vendor\\Mpdf\\PsrHttpMessageShim\\Stream' => $vendorDir . '/mpdf/psr-http-message-shim/src/Stream.php', 'OCA\\Libresign\\Vendor\\Mpdf\\PsrHttpMessageShim\\Uri' => $vendorDir . '/mpdf/psr-http-message-shim/src/Uri.php', 'OCA\\Libresign\\Vendor\\Mpdf\\PsrLogAwareTrait\\MpdfPsrLogAwareTrait' => $vendorDir . '/mpdf/psr-log-aware-trait/src/MpdfPsrLogAwareTrait.php', 'OCA\\Libresign\\Vendor\\Mpdf\\PsrLogAwareTrait\\PsrLogAwareTrait' => $vendorDir . '/mpdf/psr-log-aware-trait/src/PsrLogAwareTrait.php', 'OCA\\Libresign\\Vendor\\Mpdf\\ServiceFactory' => $vendorDir . '/mpdf/mpdf/src/ServiceFactory.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Shaper\\Indic' => $vendorDir . '/mpdf/mpdf/src/Shaper/Indic.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Shaper\\Myanmar' => $vendorDir . '/mpdf/mpdf/src/Shaper/Myanmar.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Shaper\\Sea' => $vendorDir . '/mpdf/mpdf/src/Shaper/Sea.php', 'OCA\\Libresign\\Vendor\\Mpdf\\SizeConverter' => $vendorDir . '/mpdf/mpdf/src/SizeConverter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Strict' => $vendorDir . '/mpdf/mpdf/src/Strict.php', 'OCA\\Libresign\\Vendor\\Mpdf\\TTFontFile' => $vendorDir . '/mpdf/mpdf/src/TTFontFile.php', 'OCA\\Libresign\\Vendor\\Mpdf\\TTFontFileAnalysis' => $vendorDir . '/mpdf/mpdf/src/TTFontFileAnalysis.php', 'OCA\\Libresign\\Vendor\\Mpdf\\TableOfContents' => $vendorDir . '/mpdf/mpdf/src/TableOfContents.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag' => $vendorDir . '/mpdf/mpdf/src/Tag.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\A' => $vendorDir . '/mpdf/mpdf/src/Tag/A.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Acronym' => $vendorDir . '/mpdf/mpdf/src/Tag/Acronym.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Address' => $vendorDir . '/mpdf/mpdf/src/Tag/Address.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Annotation' => $vendorDir . '/mpdf/mpdf/src/Tag/Annotation.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Article' => $vendorDir . '/mpdf/mpdf/src/Tag/Article.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Aside' => $vendorDir . '/mpdf/mpdf/src/Tag/Aside.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\B' => $vendorDir . '/mpdf/mpdf/src/Tag/B.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\BarCode' => $vendorDir . '/mpdf/mpdf/src/Tag/BarCode.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Bdi' => $vendorDir . '/mpdf/mpdf/src/Tag/Bdi.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Bdo' => $vendorDir . '/mpdf/mpdf/src/Tag/Bdo.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Big' => $vendorDir . '/mpdf/mpdf/src/Tag/Big.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\BlockQuote' => $vendorDir . '/mpdf/mpdf/src/Tag/BlockQuote.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\BlockTag' => $vendorDir . '/mpdf/mpdf/src/Tag/BlockTag.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Bookmark' => $vendorDir . '/mpdf/mpdf/src/Tag/Bookmark.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Br' => $vendorDir . '/mpdf/mpdf/src/Tag/Br.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Caption' => $vendorDir . '/mpdf/mpdf/src/Tag/Caption.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Center' => $vendorDir . '/mpdf/mpdf/src/Tag/Center.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Cite' => $vendorDir . '/mpdf/mpdf/src/Tag/Cite.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Code' => $vendorDir . '/mpdf/mpdf/src/Tag/Code.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\ColumnBreak' => $vendorDir . '/mpdf/mpdf/src/Tag/ColumnBreak.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Columns' => $vendorDir . '/mpdf/mpdf/src/Tag/Columns.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Dd' => $vendorDir . '/mpdf/mpdf/src/Tag/Dd.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Del' => $vendorDir . '/mpdf/mpdf/src/Tag/Del.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Details' => $vendorDir . '/mpdf/mpdf/src/Tag/Details.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Div' => $vendorDir . '/mpdf/mpdf/src/Tag/Div.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Dl' => $vendorDir . '/mpdf/mpdf/src/Tag/Dl.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\DotTab' => $vendorDir . '/mpdf/mpdf/src/Tag/DotTab.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Dt' => $vendorDir . '/mpdf/mpdf/src/Tag/Dt.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Em' => $vendorDir . '/mpdf/mpdf/src/Tag/Em.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\FieldSet' => $vendorDir . '/mpdf/mpdf/src/Tag/FieldSet.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\FigCaption' => $vendorDir . '/mpdf/mpdf/src/Tag/FigCaption.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Figure' => $vendorDir . '/mpdf/mpdf/src/Tag/Figure.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Font' => $vendorDir . '/mpdf/mpdf/src/Tag/Font.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Footer' => $vendorDir . '/mpdf/mpdf/src/Tag/Footer.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Form' => $vendorDir . '/mpdf/mpdf/src/Tag/Form.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\FormFeed' => $vendorDir . '/mpdf/mpdf/src/Tag/FormFeed.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\H1' => $vendorDir . '/mpdf/mpdf/src/Tag/H1.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\H2' => $vendorDir . '/mpdf/mpdf/src/Tag/H2.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\H3' => $vendorDir . '/mpdf/mpdf/src/Tag/H3.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\H4' => $vendorDir . '/mpdf/mpdf/src/Tag/H4.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\H5' => $vendorDir . '/mpdf/mpdf/src/Tag/H5.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\H6' => $vendorDir . '/mpdf/mpdf/src/Tag/H6.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\HGroup' => $vendorDir . '/mpdf/mpdf/src/Tag/HGroup.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Header' => $vendorDir . '/mpdf/mpdf/src/Tag/Header.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Hr' => $vendorDir . '/mpdf/mpdf/src/Tag/Hr.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\I' => $vendorDir . '/mpdf/mpdf/src/Tag/I.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Img' => $vendorDir . '/mpdf/mpdf/src/Tag/Img.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\IndexEntry' => $vendorDir . '/mpdf/mpdf/src/Tag/IndexEntry.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\IndexInsert' => $vendorDir . '/mpdf/mpdf/src/Tag/IndexInsert.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\InlineTag' => $vendorDir . '/mpdf/mpdf/src/Tag/InlineTag.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Input' => $vendorDir . '/mpdf/mpdf/src/Tag/Input.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Ins' => $vendorDir . '/mpdf/mpdf/src/Tag/Ins.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Kbd' => $vendorDir . '/mpdf/mpdf/src/Tag/Kbd.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Legend' => $vendorDir . '/mpdf/mpdf/src/Tag/Legend.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Li' => $vendorDir . '/mpdf/mpdf/src/Tag/Li.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Main' => $vendorDir . '/mpdf/mpdf/src/Tag/Main.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Mark' => $vendorDir . '/mpdf/mpdf/src/Tag/Mark.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Meter' => $vendorDir . '/mpdf/mpdf/src/Tag/Meter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Nav' => $vendorDir . '/mpdf/mpdf/src/Tag/Nav.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\NewColumn' => $vendorDir . '/mpdf/mpdf/src/Tag/NewColumn.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\NewPage' => $vendorDir . '/mpdf/mpdf/src/Tag/NewPage.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Ol' => $vendorDir . '/mpdf/mpdf/src/Tag/Ol.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Option' => $vendorDir . '/mpdf/mpdf/src/Tag/Option.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\P' => $vendorDir . '/mpdf/mpdf/src/Tag/P.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\PageBreak' => $vendorDir . '/mpdf/mpdf/src/Tag/PageBreak.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\PageFooter' => $vendorDir . '/mpdf/mpdf/src/Tag/PageFooter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\PageHeader' => $vendorDir . '/mpdf/mpdf/src/Tag/PageHeader.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Pre' => $vendorDir . '/mpdf/mpdf/src/Tag/Pre.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Progress' => $vendorDir . '/mpdf/mpdf/src/Tag/Progress.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Q' => $vendorDir . '/mpdf/mpdf/src/Tag/Q.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\S' => $vendorDir . '/mpdf/mpdf/src/Tag/S.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Samp' => $vendorDir . '/mpdf/mpdf/src/Tag/Samp.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Section' => $vendorDir . '/mpdf/mpdf/src/Tag/Section.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Select' => $vendorDir . '/mpdf/mpdf/src/Tag/Select.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\SetHtmlPageFooter' => $vendorDir . '/mpdf/mpdf/src/Tag/SetHtmlPageFooter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\SetHtmlPageHeader' => $vendorDir . '/mpdf/mpdf/src/Tag/SetHtmlPageHeader.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\SetPageFooter' => $vendorDir . '/mpdf/mpdf/src/Tag/SetPageFooter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\SetPageHeader' => $vendorDir . '/mpdf/mpdf/src/Tag/SetPageHeader.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Small' => $vendorDir . '/mpdf/mpdf/src/Tag/Small.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Span' => $vendorDir . '/mpdf/mpdf/src/Tag/Span.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Strike' => $vendorDir . '/mpdf/mpdf/src/Tag/Strike.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Strong' => $vendorDir . '/mpdf/mpdf/src/Tag/Strong.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Sub' => $vendorDir . '/mpdf/mpdf/src/Tag/Sub.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\SubstituteTag' => $vendorDir . '/mpdf/mpdf/src/Tag/SubstituteTag.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Summary' => $vendorDir . '/mpdf/mpdf/src/Tag/Summary.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Sup' => $vendorDir . '/mpdf/mpdf/src/Tag/Sup.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\TBody' => $vendorDir . '/mpdf/mpdf/src/Tag/TBody.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\TFoot' => $vendorDir . '/mpdf/mpdf/src/Tag/TFoot.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\THead' => $vendorDir . '/mpdf/mpdf/src/Tag/THead.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Table' => $vendorDir . '/mpdf/mpdf/src/Tag/Table.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Tag' => $vendorDir . '/mpdf/mpdf/src/Tag/Tag.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Td' => $vendorDir . '/mpdf/mpdf/src/Tag/Td.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\TextArea' => $vendorDir . '/mpdf/mpdf/src/Tag/TextArea.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\TextCircle' => $vendorDir . '/mpdf/mpdf/src/Tag/TextCircle.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Th' => $vendorDir . '/mpdf/mpdf/src/Tag/Th.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Time' => $vendorDir . '/mpdf/mpdf/src/Tag/Time.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Toc' => $vendorDir . '/mpdf/mpdf/src/Tag/Toc.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\TocEntry' => $vendorDir . '/mpdf/mpdf/src/Tag/TocEntry.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\TocPageBreak' => $vendorDir . '/mpdf/mpdf/src/Tag/TocPageBreak.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Tr' => $vendorDir . '/mpdf/mpdf/src/Tag/Tr.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Tt' => $vendorDir . '/mpdf/mpdf/src/Tag/Tt.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Tta' => $vendorDir . '/mpdf/mpdf/src/Tag/Tta.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Tts' => $vendorDir . '/mpdf/mpdf/src/Tag/Tts.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Ttz' => $vendorDir . '/mpdf/mpdf/src/Tag/Ttz.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\U' => $vendorDir . '/mpdf/mpdf/src/Tag/U.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Ul' => $vendorDir . '/mpdf/mpdf/src/Tag/Ul.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\VarTag' => $vendorDir . '/mpdf/mpdf/src/Tag/VarTag.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\WatermarkImage' => $vendorDir . '/mpdf/mpdf/src/Tag/WatermarkImage.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\WatermarkText' => $vendorDir . '/mpdf/mpdf/src/Tag/WatermarkText.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Ucdn' => $vendorDir . '/mpdf/mpdf/src/Ucdn.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Utils\\Arrays' => $vendorDir . '/mpdf/mpdf/src/Utils/Arrays.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Utils\\NumericString' => $vendorDir . '/mpdf/mpdf/src/Utils/NumericString.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Utils\\PdfDate' => $vendorDir . '/mpdf/mpdf/src/Utils/PdfDate.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Utils\\UtfString' => $vendorDir . '/mpdf/mpdf/src/Utils/UtfString.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Watermark' => $vendorDir . '/mpdf/mpdf/src/Watermark.php', 'OCA\\Libresign\\Vendor\\Mpdf\\WatermarkImage' => $vendorDir . '/mpdf/mpdf/src/WatermarkImage.php', 'OCA\\Libresign\\Vendor\\Mpdf\\WatermarkText' => $vendorDir . '/mpdf/mpdf/src/WatermarkText.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\BackgroundWriter' => $vendorDir . '/mpdf/mpdf/src/Writer/BackgroundWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\BaseWriter' => $vendorDir . '/mpdf/mpdf/src/Writer/BaseWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\BookmarkWriter' => $vendorDir . '/mpdf/mpdf/src/Writer/BookmarkWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\ColorWriter' => $vendorDir . '/mpdf/mpdf/src/Writer/ColorWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\FontWriter' => $vendorDir . '/mpdf/mpdf/src/Writer/FontWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\FormWriter' => $vendorDir . '/mpdf/mpdf/src/Writer/FormWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\ImageWriter' => $vendorDir . '/mpdf/mpdf/src/Writer/ImageWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\JavaScriptWriter' => $vendorDir . '/mpdf/mpdf/src/Writer/JavaScriptWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\MetadataWriter' => $vendorDir . '/mpdf/mpdf/src/Writer/MetadataWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\ObjectWriter' => $vendorDir . '/mpdf/mpdf/src/Writer/ObjectWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\OptionalContentWriter' => $vendorDir . '/mpdf/mpdf/src/Writer/OptionalContentWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\PageWriter' => $vendorDir . '/mpdf/mpdf/src/Writer/PageWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\ResourceWriter' => $vendorDir . '/mpdf/mpdf/src/Writer/ResourceWriter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Adapter\\AdapterInterface' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/Adapter/AdapterInterface.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Adapter\\ArrayAdapter' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/Adapter/ArrayAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Adapter\\CallbackAdapter' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/Adapter/CallbackAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Adapter\\ConcatenationAdapter' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/Adapter/ConcatenationAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Adapter\\EmptyAdapter' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/Adapter/EmptyAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Adapter\\FixedAdapter' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/Adapter/FixedAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Adapter\\NullAdapter' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/Adapter/NullAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Adapter\\TransformingAdapter' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/Adapter/TransformingAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Doctrine\\Collections\\CollectionAdapter' => $vendorDir . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/Collections/CollectionAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Doctrine\\Collections\\SelectableAdapter' => $vendorDir . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/Collections/SelectableAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Doctrine\\DBAL\\QueryAdapter' => $vendorDir . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/DBAL/QueryAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Doctrine\\DBAL\\SingleTableQueryAdapter' => $vendorDir . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/DBAL/SingleTableQueryAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Doctrine\\MongoDBODM\\AggregationAdapter' => $vendorDir . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/MongoDBODM/AggregationAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Doctrine\\MongoDBODM\\QueryAdapter' => $vendorDir . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/MongoDBODM/QueryAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Doctrine\\ORM\\QueryAdapter' => $vendorDir . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/ORM/QueryAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Doctrine\\PHPCRODM\\QueryAdapter' => $vendorDir . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/PHPCRODM/QueryAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Elastica\\ElasticaAdapter' => $vendorDir . '/pagerfanta/pagerfanta/lib/Adapter/Elastica/ElasticaAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\InvalidArgumentException' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/Exception/InvalidArgumentException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\LessThan1CurrentPageException' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/Exception/LessThan1CurrentPageException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\LessThan1MaxPagesException' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/Exception/LessThan1MaxPagesException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\LessThan1MaxPerPageException' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/Exception/LessThan1MaxPerPageException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\LogicException' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/Exception/LogicException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\NotValidCurrentPageException' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/Exception/NotValidCurrentPageException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\NotValidMaxPerPageException' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/Exception/NotValidMaxPerPageException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\NotValidResultCountException' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/Exception/NotValidResultCountException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\OutOfBoundsException' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/Exception/OutOfBoundsException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\OutOfRangeCurrentPageException' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/Exception/OutOfRangeCurrentPageException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\PagerfantaException' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/Exception/PagerfantaException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\RuntimeException' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/Exception/RuntimeException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Pagerfanta' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/Pagerfanta.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\PagerfantaInterface' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/PagerfantaInterface.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\RouteGenerator\\RouteGeneratorDecorator' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/RouteGenerator/RouteGeneratorDecorator.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\RouteGenerator\\RouteGeneratorFactoryInterface' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/RouteGenerator/RouteGeneratorFactoryInterface.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\RouteGenerator\\RouteGeneratorInterface' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/RouteGenerator/RouteGeneratorInterface.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Solarium\\SolariumAdapter' => $vendorDir . '/pagerfanta/pagerfanta/lib/Adapter/Solarium/SolariumAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Twig\\Extension\\PagerfantaExtension' => $vendorDir . '/pagerfanta/pagerfanta/lib/Twig/Extension/PagerfantaExtension.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Twig\\Extension\\PagerfantaRuntime' => $vendorDir . '/pagerfanta/pagerfanta/lib/Twig/Extension/PagerfantaRuntime.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Twig\\View\\TwigView' => $vendorDir . '/pagerfanta/pagerfanta/lib/Twig/View/TwigView.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\DefaultView' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/View/DefaultView.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\Foundation6View' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/View/Foundation6View.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\OptionableView' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/View/OptionableView.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\SemanticUiView' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/View/SemanticUiView.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\TemplateView' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/View/TemplateView.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\Template\\DefaultTemplate' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/View/Template/DefaultTemplate.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\Template\\Foundation6Template' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/View/Template/Foundation6Template.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\Template\\SemanticUiTemplate' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/View/Template/SemanticUiTemplate.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\Template\\Template' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/View/Template/Template.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\Template\\TemplateInterface' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/View/Template/TemplateInterface.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\Template\\TwitterBootstrap3Template' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/View/Template/TwitterBootstrap3Template.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\Template\\TwitterBootstrap4Template' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/View/Template/TwitterBootstrap4Template.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\Template\\TwitterBootstrap5Template' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/View/Template/TwitterBootstrap5Template.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\Template\\TwitterBootstrapTemplate' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/View/Template/TwitterBootstrapTemplate.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\TwitterBootstrap3View' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/View/TwitterBootstrap3View.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\TwitterBootstrap4View' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/View/TwitterBootstrap4View.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\TwitterBootstrap5View' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/View/TwitterBootstrap5View.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\TwitterBootstrapView' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/View/TwitterBootstrapView.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\View' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/View/View.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\ViewFactory' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/View/ViewFactory.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\ViewFactoryInterface' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/View/ViewFactoryInterface.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\ViewInterface' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/View/ViewInterface.php', 'OCA\\Libresign\\Vendor\\ParagonIE\\ConstantTime\\Base32' => $vendorDir . '/paragonie/constant_time_encoding/src/Base32.php', 'OCA\\Libresign\\Vendor\\ParagonIE\\ConstantTime\\Base32Hex' => $vendorDir . '/paragonie/constant_time_encoding/src/Base32Hex.php', 'OCA\\Libresign\\Vendor\\ParagonIE\\ConstantTime\\Base64' => $vendorDir . '/paragonie/constant_time_encoding/src/Base64.php', 'OCA\\Libresign\\Vendor\\ParagonIE\\ConstantTime\\Base64DotSlash' => $vendorDir . '/paragonie/constant_time_encoding/src/Base64DotSlash.php', 'OCA\\Libresign\\Vendor\\ParagonIE\\ConstantTime\\Base64DotSlashOrdered' => $vendorDir . '/paragonie/constant_time_encoding/src/Base64DotSlashOrdered.php', 'OCA\\Libresign\\Vendor\\ParagonIE\\ConstantTime\\Base64UrlSafe' => $vendorDir . '/paragonie/constant_time_encoding/src/Base64UrlSafe.php', 'OCA\\Libresign\\Vendor\\ParagonIE\\ConstantTime\\Binary' => $vendorDir . '/paragonie/constant_time_encoding/src/Binary.php', 'OCA\\Libresign\\Vendor\\ParagonIE\\ConstantTime\\EncoderInterface' => $vendorDir . '/paragonie/constant_time_encoding/src/EncoderInterface.php', 'OCA\\Libresign\\Vendor\\ParagonIE\\ConstantTime\\Encoding' => $vendorDir . '/paragonie/constant_time_encoding/src/Encoding.php', 'OCA\\Libresign\\Vendor\\ParagonIE\\ConstantTime\\Hex' => $vendorDir . '/paragonie/constant_time_encoding/src/Hex.php', 'OCA\\Libresign\\Vendor\\ParagonIE\\ConstantTime\\RFC4648' => $vendorDir . '/paragonie/constant_time_encoding/src/RFC4648.php', 'OCA\\Libresign\\Vendor\\Psr\\Http\\Message\\MessageInterface' => $vendorDir . '/psr/http-message/src/MessageInterface.php', 'OCA\\Libresign\\Vendor\\Psr\\Http\\Message\\RequestInterface' => $vendorDir . '/psr/http-message/src/RequestInterface.php', 'OCA\\Libresign\\Vendor\\Psr\\Http\\Message\\ResponseInterface' => $vendorDir . '/psr/http-message/src/ResponseInterface.php', 'OCA\\Libresign\\Vendor\\Psr\\Http\\Message\\ServerRequestInterface' => $vendorDir . '/psr/http-message/src/ServerRequestInterface.php', 'OCA\\Libresign\\Vendor\\Psr\\Http\\Message\\StreamInterface' => $vendorDir . '/psr/http-message/src/StreamInterface.php', 'OCA\\Libresign\\Vendor\\Psr\\Http\\Message\\UploadedFileInterface' => $vendorDir . '/psr/http-message/src/UploadedFileInterface.php', 'OCA\\Libresign\\Vendor\\Psr\\Http\\Message\\UriInterface' => $vendorDir . '/psr/http-message/src/UriInterface.php', 'OCA\\Libresign\\Vendor\\Psr\\Log\\AbstractLogger' => $vendorDir . '/psr/log/src/AbstractLogger.php', 'OCA\\Libresign\\Vendor\\Psr\\Log\\InvalidArgumentException' => $vendorDir . '/psr/log/src/InvalidArgumentException.php', 'OCA\\Libresign\\Vendor\\Psr\\Log\\LogLevel' => $vendorDir . '/psr/log/src/LogLevel.php', 'OCA\\Libresign\\Vendor\\Psr\\Log\\LoggerAwareInterface' => $vendorDir . '/psr/log/src/LoggerAwareInterface.php', 'OCA\\Libresign\\Vendor\\Psr\\Log\\LoggerAwareTrait' => $vendorDir . '/psr/log/src/LoggerAwareTrait.php', 'OCA\\Libresign\\Vendor\\Psr\\Log\\LoggerInterface' => $vendorDir . '/psr/log/src/LoggerInterface.php', 'OCA\\Libresign\\Vendor\\Psr\\Log\\LoggerTrait' => $vendorDir . '/psr/log/src/LoggerTrait.php', 'OCA\\Libresign\\Vendor\\Psr\\Log\\NullLogger' => $vendorDir . '/psr/log/src/NullLogger.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Config' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Config.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Document' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Document.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Element.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element\\ElementArray' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementArray.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element\\ElementBoolean' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementBoolean.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element\\ElementDate' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementDate.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element\\ElementHexa' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementHexa.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element\\ElementMissing' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementMissing.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element\\ElementName' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementName.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element\\ElementNull' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementNull.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element\\ElementNumeric' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementNumeric.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element\\ElementString' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementString.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element\\ElementStruct' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementStruct.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element\\ElementXRef' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementXRef.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Encoding' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Encoding.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Encoding\\AbstractEncoding' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Encoding/AbstractEncoding.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Encoding\\EncodingLocator' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Encoding/EncodingLocator.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Encoding\\ISOLatin1Encoding' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Encoding/ISOLatin1Encoding.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Encoding\\ISOLatin9Encoding' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Encoding/ISOLatin9Encoding.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Encoding\\MacRomanEncoding' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Encoding/MacRomanEncoding.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Encoding\\PDFDocEncoding' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Encoding/PDFDocEncoding.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Encoding\\PostScriptGlyphs' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Encoding/PostScriptGlyphs.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Encoding\\StandardEncoding' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Encoding/StandardEncoding.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Encoding\\WinAnsiEncoding' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Encoding/WinAnsiEncoding.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Exception\\EmptyPdfException' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Exception/EmptyPdfException.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Exception\\EncodingNotFoundException' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Exception/EncodingNotFoundException.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Exception\\InvalidDictionaryObjectException' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Exception/InvalidDictionaryObjectException.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Exception\\MissingCatalogException' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Exception/MissingCatalogException.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Exception\\MissingPdfHeaderException' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Exception/MissingPdfHeaderException.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Exception\\NotImplementedException' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Exception/NotImplementedException.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Font' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Font.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Font\\FontCIDFontType0' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Font/FontCIDFontType0.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Font\\FontCIDFontType2' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Font/FontCIDFontType2.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Font\\FontTrueType' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Font/FontTrueType.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Font\\FontType0' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Font/FontType0.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Font\\FontType1' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Font/FontType1.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Font\\FontType3' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Font/FontType3.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Header' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Header.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\PDFObject' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/PDFObject.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Page' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Page.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Pages' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Pages.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Parser' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Parser.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\RawData\\FilterHelper' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/RawData/FilterHelper.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\RawData\\RawDataParser' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/RawData/RawDataParser.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\XObject\\Form' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/XObject/Form.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\XObject\\Image' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/XObject/Image.php', 'OCA\\Libresign\\Vendor\\Symfony\\Polyfill\\Ctype\\Ctype' => $vendorDir . '/symfony/polyfill-ctype/Ctype.php', 'OCA\\Libresign\\Vendor\\Symfony\\Polyfill\\Mbstring\\Mbstring' => $vendorDir . '/symfony/polyfill-mbstring/Mbstring.php', 'OCA\\Libresign\\Vendor\\Twig\\AbstractTwigCallable' => $vendorDir . '/twig/twig/src/AbstractTwigCallable.php', 'OCA\\Libresign\\Vendor\\Twig\\Attribute\\AsTwigFilter' => $vendorDir . '/twig/twig/src/Attribute/AsTwigFilter.php', 'OCA\\Libresign\\Vendor\\Twig\\Attribute\\AsTwigFunction' => $vendorDir . '/twig/twig/src/Attribute/AsTwigFunction.php', 'OCA\\Libresign\\Vendor\\Twig\\Attribute\\AsTwigTest' => $vendorDir . '/twig/twig/src/Attribute/AsTwigTest.php', 'OCA\\Libresign\\Vendor\\Twig\\Attribute\\FirstClassTwigCallableReady' => $vendorDir . '/twig/twig/src/Attribute/FirstClassTwigCallableReady.php', 'OCA\\Libresign\\Vendor\\Twig\\Attribute\\YieldReady' => $vendorDir . '/twig/twig/src/Attribute/YieldReady.php', 'OCA\\Libresign\\Vendor\\Twig\\Cache\\CacheInterface' => $vendorDir . '/twig/twig/src/Cache/CacheInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Cache\\ChainCache' => $vendorDir . '/twig/twig/src/Cache/ChainCache.php', 'OCA\\Libresign\\Vendor\\Twig\\Cache\\FilesystemCache' => $vendorDir . '/twig/twig/src/Cache/FilesystemCache.php', 'OCA\\Libresign\\Vendor\\Twig\\Cache\\NullCache' => $vendorDir . '/twig/twig/src/Cache/NullCache.php', 'OCA\\Libresign\\Vendor\\Twig\\Cache\\ReadOnlyFilesystemCache' => $vendorDir . '/twig/twig/src/Cache/ReadOnlyFilesystemCache.php', 'OCA\\Libresign\\Vendor\\Twig\\Cache\\RemovableCacheInterface' => $vendorDir . '/twig/twig/src/Cache/RemovableCacheInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Compiler' => $vendorDir . '/twig/twig/src/Compiler.php', 'OCA\\Libresign\\Vendor\\Twig\\DeprecatedCallableInfo' => $vendorDir . '/twig/twig/src/DeprecatedCallableInfo.php', 'OCA\\Libresign\\Vendor\\Twig\\Environment' => $vendorDir . '/twig/twig/src/Environment.php', 'OCA\\Libresign\\Vendor\\Twig\\Error\\Error' => $vendorDir . '/twig/twig/src/Error/Error.php', 'OCA\\Libresign\\Vendor\\Twig\\Error\\LoaderError' => $vendorDir . '/twig/twig/src/Error/LoaderError.php', 'OCA\\Libresign\\Vendor\\Twig\\Error\\RuntimeError' => $vendorDir . '/twig/twig/src/Error/RuntimeError.php', 'OCA\\Libresign\\Vendor\\Twig\\Error\\SyntaxError' => $vendorDir . '/twig/twig/src/Error/SyntaxError.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser' => $vendorDir . '/twig/twig/src/ExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\AbstractExpressionParser' => $vendorDir . '/twig/twig/src/ExpressionParser/AbstractExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\ExpressionParserDescriptionInterface' => $vendorDir . '/twig/twig/src/ExpressionParser/ExpressionParserDescriptionInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\ExpressionParserInterface' => $vendorDir . '/twig/twig/src/ExpressionParser/ExpressionParserInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\ExpressionParserType' => $vendorDir . '/twig/twig/src/ExpressionParser/ExpressionParserType.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\ExpressionParsers' => $vendorDir . '/twig/twig/src/ExpressionParser/ExpressionParsers.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\InfixAssociativity' => $vendorDir . '/twig/twig/src/ExpressionParser/InfixAssociativity.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\InfixExpressionParserInterface' => $vendorDir . '/twig/twig/src/ExpressionParser/InfixExpressionParserInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Infix\\ArgumentsTrait' => $vendorDir . '/twig/twig/src/ExpressionParser/Infix/ArgumentsTrait.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Infix\\ArrowExpressionParser' => $vendorDir . '/twig/twig/src/ExpressionParser/Infix/ArrowExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Infix\\BinaryOperatorExpressionParser' => $vendorDir . '/twig/twig/src/ExpressionParser/Infix/BinaryOperatorExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Infix\\ConditionalTernaryExpressionParser' => $vendorDir . '/twig/twig/src/ExpressionParser/Infix/ConditionalTernaryExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Infix\\DotExpressionParser' => $vendorDir . '/twig/twig/src/ExpressionParser/Infix/DotExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Infix\\FilterExpressionParser' => $vendorDir . '/twig/twig/src/ExpressionParser/Infix/FilterExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Infix\\FunctionExpressionParser' => $vendorDir . '/twig/twig/src/ExpressionParser/Infix/FunctionExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Infix\\IsExpressionParser' => $vendorDir . '/twig/twig/src/ExpressionParser/Infix/IsExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Infix\\IsNotExpressionParser' => $vendorDir . '/twig/twig/src/ExpressionParser/Infix/IsNotExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Infix\\SquareBracketExpressionParser' => $vendorDir . '/twig/twig/src/ExpressionParser/Infix/SquareBracketExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\PrecedenceChange' => $vendorDir . '/twig/twig/src/ExpressionParser/PrecedenceChange.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\PrefixExpressionParserInterface' => $vendorDir . '/twig/twig/src/ExpressionParser/PrefixExpressionParserInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Prefix\\GroupingExpressionParser' => $vendorDir . '/twig/twig/src/ExpressionParser/Prefix/GroupingExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Prefix\\LiteralExpressionParser' => $vendorDir . '/twig/twig/src/ExpressionParser/Prefix/LiteralExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Prefix\\UnaryOperatorExpressionParser' => $vendorDir . '/twig/twig/src/ExpressionParser/Prefix/UnaryOperatorExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExtensionSet' => $vendorDir . '/twig/twig/src/ExtensionSet.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\AbstractExtension' => $vendorDir . '/twig/twig/src/Extension/AbstractExtension.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\AttributeExtension' => $vendorDir . '/twig/twig/src/Extension/AttributeExtension.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\CoreExtension' => $vendorDir . '/twig/twig/src/Extension/CoreExtension.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\DebugExtension' => $vendorDir . '/twig/twig/src/Extension/DebugExtension.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\EscaperExtension' => $vendorDir . '/twig/twig/src/Extension/EscaperExtension.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\ExtensionInterface' => $vendorDir . '/twig/twig/src/Extension/ExtensionInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\GlobalsInterface' => $vendorDir . '/twig/twig/src/Extension/GlobalsInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\LastModifiedExtensionInterface' => $vendorDir . '/twig/twig/src/Extension/LastModifiedExtensionInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\OptimizerExtension' => $vendorDir . '/twig/twig/src/Extension/OptimizerExtension.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\ProfilerExtension' => $vendorDir . '/twig/twig/src/Extension/ProfilerExtension.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\RuntimeExtensionInterface' => $vendorDir . '/twig/twig/src/Extension/RuntimeExtensionInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\SandboxExtension' => $vendorDir . '/twig/twig/src/Extension/SandboxExtension.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\StagingExtension' => $vendorDir . '/twig/twig/src/Extension/StagingExtension.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\StringLoaderExtension' => $vendorDir . '/twig/twig/src/Extension/StringLoaderExtension.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\YieldNotReadyExtension' => $vendorDir . '/twig/twig/src/Extension/YieldNotReadyExtension.php', 'OCA\\Libresign\\Vendor\\Twig\\FileExtensionEscapingStrategy' => $vendorDir . '/twig/twig/src/FileExtensionEscapingStrategy.php', 'OCA\\Libresign\\Vendor\\Twig\\Lexer' => $vendorDir . '/twig/twig/src/Lexer.php', 'OCA\\Libresign\\Vendor\\Twig\\Loader\\ArrayLoader' => $vendorDir . '/twig/twig/src/Loader/ArrayLoader.php', 'OCA\\Libresign\\Vendor\\Twig\\Loader\\ChainLoader' => $vendorDir . '/twig/twig/src/Loader/ChainLoader.php', 'OCA\\Libresign\\Vendor\\Twig\\Loader\\FilesystemLoader' => $vendorDir . '/twig/twig/src/Loader/FilesystemLoader.php', 'OCA\\Libresign\\Vendor\\Twig\\Loader\\LoaderInterface' => $vendorDir . '/twig/twig/src/Loader/LoaderInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Markup' => $vendorDir . '/twig/twig/src/Markup.php', 'OCA\\Libresign\\Vendor\\Twig\\NodeTraverser' => $vendorDir . '/twig/twig/src/NodeTraverser.php', 'OCA\\Libresign\\Vendor\\Twig\\NodeVisitor\\AbstractNodeVisitor' => $vendorDir . '/twig/twig/src/NodeVisitor/AbstractNodeVisitor.php', 'OCA\\Libresign\\Vendor\\Twig\\NodeVisitor\\EscaperNodeVisitor' => $vendorDir . '/twig/twig/src/NodeVisitor/EscaperNodeVisitor.php', 'OCA\\Libresign\\Vendor\\Twig\\NodeVisitor\\NodeVisitorInterface' => $vendorDir . '/twig/twig/src/NodeVisitor/NodeVisitorInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\NodeVisitor\\OptimizerNodeVisitor' => $vendorDir . '/twig/twig/src/NodeVisitor/OptimizerNodeVisitor.php', 'OCA\\Libresign\\Vendor\\Twig\\NodeVisitor\\SafeAnalysisNodeVisitor' => $vendorDir . '/twig/twig/src/NodeVisitor/SafeAnalysisNodeVisitor.php', 'OCA\\Libresign\\Vendor\\Twig\\NodeVisitor\\SandboxNodeVisitor' => $vendorDir . '/twig/twig/src/NodeVisitor/SandboxNodeVisitor.php', 'OCA\\Libresign\\Vendor\\Twig\\NodeVisitor\\YieldNotReadyNodeVisitor' => $vendorDir . '/twig/twig/src/NodeVisitor/YieldNotReadyNodeVisitor.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\AutoEscapeNode' => $vendorDir . '/twig/twig/src/Node/AutoEscapeNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\BlockNode' => $vendorDir . '/twig/twig/src/Node/BlockNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\BlockReferenceNode' => $vendorDir . '/twig/twig/src/Node/BlockReferenceNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\BodyNode' => $vendorDir . '/twig/twig/src/Node/BodyNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\CaptureNode' => $vendorDir . '/twig/twig/src/Node/CaptureNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\CheckSecurityCallNode' => $vendorDir . '/twig/twig/src/Node/CheckSecurityCallNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\CheckSecurityNode' => $vendorDir . '/twig/twig/src/Node/CheckSecurityNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\CheckToStringNode' => $vendorDir . '/twig/twig/src/Node/CheckToStringNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\DeprecatedNode' => $vendorDir . '/twig/twig/src/Node/DeprecatedNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\DoNode' => $vendorDir . '/twig/twig/src/Node/DoNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\EmbedNode' => $vendorDir . '/twig/twig/src/Node/EmbedNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\EmptyNode' => $vendorDir . '/twig/twig/src/Node/EmptyNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\AbstractExpression' => $vendorDir . '/twig/twig/src/Node/Expression/AbstractExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\ArrayExpression' => $vendorDir . '/twig/twig/src/Node/Expression/ArrayExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\ArrowFunctionExpression' => $vendorDir . '/twig/twig/src/Node/Expression/ArrowFunctionExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\AssignNameExpression' => $vendorDir . '/twig/twig/src/Node/Expression/AssignNameExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\AbstractBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/AbstractBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\AddBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/AddBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\AndBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/AndBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\BinaryInterface' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/BinaryInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\BitwiseAndBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/BitwiseAndBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\BitwiseOrBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/BitwiseOrBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\BitwiseXorBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/BitwiseXorBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\ConcatBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/ConcatBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\DivBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/DivBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\ElvisBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/ElvisBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\EndsWithBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/EndsWithBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\EqualBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/EqualBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\FloorDivBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/FloorDivBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\GreaterBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/GreaterBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\GreaterEqualBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/GreaterEqualBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\HasEveryBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/HasEveryBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\HasSomeBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/HasSomeBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\InBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/InBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\LessBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/LessBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\LessEqualBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/LessEqualBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\MatchesBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/MatchesBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\ModBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/ModBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\MulBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/MulBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\NotEqualBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/NotEqualBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\NotInBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/NotInBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\NullCoalesceBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/NullCoalesceBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\OrBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/OrBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\PowerBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/PowerBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\RangeBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/RangeBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\SpaceshipBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/SpaceshipBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\StartsWithBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/StartsWithBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\SubBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/SubBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\XorBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/XorBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\BlockReferenceExpression' => $vendorDir . '/twig/twig/src/Node/Expression/BlockReferenceExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\CallExpression' => $vendorDir . '/twig/twig/src/Node/Expression/CallExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\ConditionalExpression' => $vendorDir . '/twig/twig/src/Node/Expression/ConditionalExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\ConstantExpression' => $vendorDir . '/twig/twig/src/Node/Expression/ConstantExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\FilterExpression' => $vendorDir . '/twig/twig/src/Node/Expression/FilterExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Filter\\DefaultFilter' => $vendorDir . '/twig/twig/src/Node/Expression/Filter/DefaultFilter.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Filter\\RawFilter' => $vendorDir . '/twig/twig/src/Node/Expression/Filter/RawFilter.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\FunctionExpression' => $vendorDir . '/twig/twig/src/Node/Expression/FunctionExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\FunctionNode\\EnumCasesFunction' => $vendorDir . '/twig/twig/src/Node/Expression/FunctionNode/EnumCasesFunction.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\FunctionNode\\EnumFunction' => $vendorDir . '/twig/twig/src/Node/Expression/FunctionNode/EnumFunction.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\GetAttrExpression' => $vendorDir . '/twig/twig/src/Node/Expression/GetAttrExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\InlinePrint' => $vendorDir . '/twig/twig/src/Node/Expression/InlinePrint.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\ListExpression' => $vendorDir . '/twig/twig/src/Node/Expression/ListExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\MacroReferenceExpression' => $vendorDir . '/twig/twig/src/Node/Expression/MacroReferenceExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\MethodCallExpression' => $vendorDir . '/twig/twig/src/Node/Expression/MethodCallExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\NameExpression' => $vendorDir . '/twig/twig/src/Node/Expression/NameExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\NullCoalesceExpression' => $vendorDir . '/twig/twig/src/Node/Expression/NullCoalesceExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\OperatorEscapeInterface' => $vendorDir . '/twig/twig/src/Node/Expression/OperatorEscapeInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\ParentExpression' => $vendorDir . '/twig/twig/src/Node/Expression/ParentExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\ReturnArrayInterface' => $vendorDir . '/twig/twig/src/Node/Expression/ReturnArrayInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\ReturnBoolInterface' => $vendorDir . '/twig/twig/src/Node/Expression/ReturnBoolInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\ReturnNumberInterface' => $vendorDir . '/twig/twig/src/Node/Expression/ReturnNumberInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\ReturnPrimitiveTypeInterface' => $vendorDir . '/twig/twig/src/Node/Expression/ReturnPrimitiveTypeInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\ReturnStringInterface' => $vendorDir . '/twig/twig/src/Node/Expression/ReturnStringInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\SupportDefinedTestDeprecationTrait' => $vendorDir . '/twig/twig/src/Node/Expression/SupportDefinedTestDeprecationTrait.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\SupportDefinedTestInterface' => $vendorDir . '/twig/twig/src/Node/Expression/SupportDefinedTestInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\SupportDefinedTestTrait' => $vendorDir . '/twig/twig/src/Node/Expression/SupportDefinedTestTrait.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\TempNameExpression' => $vendorDir . '/twig/twig/src/Node/Expression/TempNameExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Ternary\\ConditionalTernary' => $vendorDir . '/twig/twig/src/Node/Expression/Ternary/ConditionalTernary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\TestExpression' => $vendorDir . '/twig/twig/src/Node/Expression/TestExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Test\\ConstantTest' => $vendorDir . '/twig/twig/src/Node/Expression/Test/ConstantTest.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Test\\DefinedTest' => $vendorDir . '/twig/twig/src/Node/Expression/Test/DefinedTest.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Test\\DivisiblebyTest' => $vendorDir . '/twig/twig/src/Node/Expression/Test/DivisiblebyTest.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Test\\EvenTest' => $vendorDir . '/twig/twig/src/Node/Expression/Test/EvenTest.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Test\\NullTest' => $vendorDir . '/twig/twig/src/Node/Expression/Test/NullTest.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Test\\OddTest' => $vendorDir . '/twig/twig/src/Node/Expression/Test/OddTest.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Test\\SameasTest' => $vendorDir . '/twig/twig/src/Node/Expression/Test/SameasTest.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Test\\TrueTest' => $vendorDir . '/twig/twig/src/Node/Expression/Test/TrueTest.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Unary\\AbstractUnary' => $vendorDir . '/twig/twig/src/Node/Expression/Unary/AbstractUnary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Unary\\NegUnary' => $vendorDir . '/twig/twig/src/Node/Expression/Unary/NegUnary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Unary\\NotUnary' => $vendorDir . '/twig/twig/src/Node/Expression/Unary/NotUnary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Unary\\PosUnary' => $vendorDir . '/twig/twig/src/Node/Expression/Unary/PosUnary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Unary\\SpreadUnary' => $vendorDir . '/twig/twig/src/Node/Expression/Unary/SpreadUnary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Unary\\StringCastUnary' => $vendorDir . '/twig/twig/src/Node/Expression/Unary/StringCastUnary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Unary\\UnaryInterface' => $vendorDir . '/twig/twig/src/Node/Expression/Unary/UnaryInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Variable\\AssignContextVariable' => $vendorDir . '/twig/twig/src/Node/Expression/Variable/AssignContextVariable.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Variable\\AssignTemplateVariable' => $vendorDir . '/twig/twig/src/Node/Expression/Variable/AssignTemplateVariable.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Variable\\ContextVariable' => $vendorDir . '/twig/twig/src/Node/Expression/Variable/ContextVariable.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Variable\\LocalVariable' => $vendorDir . '/twig/twig/src/Node/Expression/Variable/LocalVariable.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Variable\\TemplateVariable' => $vendorDir . '/twig/twig/src/Node/Expression/Variable/TemplateVariable.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\VariadicExpression' => $vendorDir . '/twig/twig/src/Node/Expression/VariadicExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\FlushNode' => $vendorDir . '/twig/twig/src/Node/FlushNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\ForElseNode' => $vendorDir . '/twig/twig/src/Node/ForElseNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\ForLoopNode' => $vendorDir . '/twig/twig/src/Node/ForLoopNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\ForNode' => $vendorDir . '/twig/twig/src/Node/ForNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\IfNode' => $vendorDir . '/twig/twig/src/Node/IfNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\ImportNode' => $vendorDir . '/twig/twig/src/Node/ImportNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\IncludeNode' => $vendorDir . '/twig/twig/src/Node/IncludeNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\MacroNode' => $vendorDir . '/twig/twig/src/Node/MacroNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\ModuleNode' => $vendorDir . '/twig/twig/src/Node/ModuleNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\NameDeprecation' => $vendorDir . '/twig/twig/src/Node/NameDeprecation.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Node' => $vendorDir . '/twig/twig/src/Node/Node.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\NodeCaptureInterface' => $vendorDir . '/twig/twig/src/Node/NodeCaptureInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\NodeOutputInterface' => $vendorDir . '/twig/twig/src/Node/NodeOutputInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Nodes' => $vendorDir . '/twig/twig/src/Node/Nodes.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\PrintNode' => $vendorDir . '/twig/twig/src/Node/PrintNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\SandboxNode' => $vendorDir . '/twig/twig/src/Node/SandboxNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\SetNode' => $vendorDir . '/twig/twig/src/Node/SetNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\TextNode' => $vendorDir . '/twig/twig/src/Node/TextNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\TypesNode' => $vendorDir . '/twig/twig/src/Node/TypesNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\WithNode' => $vendorDir . '/twig/twig/src/Node/WithNode.php', 'OCA\\Libresign\\Vendor\\Twig\\OperatorPrecedenceChange' => $vendorDir . '/twig/twig/src/OperatorPrecedenceChange.php', 'OCA\\Libresign\\Vendor\\Twig\\Parser' => $vendorDir . '/twig/twig/src/Parser.php', 'OCA\\Libresign\\Vendor\\Twig\\Profiler\\Dumper\\BaseDumper' => $vendorDir . '/twig/twig/src/Profiler/Dumper/BaseDumper.php', 'OCA\\Libresign\\Vendor\\Twig\\Profiler\\Dumper\\BlackfireDumper' => $vendorDir . '/twig/twig/src/Profiler/Dumper/BlackfireDumper.php', 'OCA\\Libresign\\Vendor\\Twig\\Profiler\\Dumper\\HtmlDumper' => $vendorDir . '/twig/twig/src/Profiler/Dumper/HtmlDumper.php', 'OCA\\Libresign\\Vendor\\Twig\\Profiler\\Dumper\\TextDumper' => $vendorDir . '/twig/twig/src/Profiler/Dumper/TextDumper.php', 'OCA\\Libresign\\Vendor\\Twig\\Profiler\\NodeVisitor\\ProfilerNodeVisitor' => $vendorDir . '/twig/twig/src/Profiler/NodeVisitor/ProfilerNodeVisitor.php', 'OCA\\Libresign\\Vendor\\Twig\\Profiler\\Node\\EnterProfileNode' => $vendorDir . '/twig/twig/src/Profiler/Node/EnterProfileNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Profiler\\Node\\LeaveProfileNode' => $vendorDir . '/twig/twig/src/Profiler/Node/LeaveProfileNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Profiler\\Profile' => $vendorDir . '/twig/twig/src/Profiler/Profile.php', 'OCA\\Libresign\\Vendor\\Twig\\RuntimeLoader\\ContainerRuntimeLoader' => $vendorDir . '/twig/twig/src/RuntimeLoader/ContainerRuntimeLoader.php', 'OCA\\Libresign\\Vendor\\Twig\\RuntimeLoader\\FactoryRuntimeLoader' => $vendorDir . '/twig/twig/src/RuntimeLoader/FactoryRuntimeLoader.php', 'OCA\\Libresign\\Vendor\\Twig\\RuntimeLoader\\RuntimeLoaderInterface' => $vendorDir . '/twig/twig/src/RuntimeLoader/RuntimeLoaderInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Runtime\\EscaperRuntime' => $vendorDir . '/twig/twig/src/Runtime/EscaperRuntime.php', 'OCA\\Libresign\\Vendor\\Twig\\Sandbox\\SecurityError' => $vendorDir . '/twig/twig/src/Sandbox/SecurityError.php', 'OCA\\Libresign\\Vendor\\Twig\\Sandbox\\SecurityNotAllowedFilterError' => $vendorDir . '/twig/twig/src/Sandbox/SecurityNotAllowedFilterError.php', 'OCA\\Libresign\\Vendor\\Twig\\Sandbox\\SecurityNotAllowedFunctionError' => $vendorDir . '/twig/twig/src/Sandbox/SecurityNotAllowedFunctionError.php', 'OCA\\Libresign\\Vendor\\Twig\\Sandbox\\SecurityNotAllowedMethodError' => $vendorDir . '/twig/twig/src/Sandbox/SecurityNotAllowedMethodError.php', 'OCA\\Libresign\\Vendor\\Twig\\Sandbox\\SecurityNotAllowedPropertyError' => $vendorDir . '/twig/twig/src/Sandbox/SecurityNotAllowedPropertyError.php', 'OCA\\Libresign\\Vendor\\Twig\\Sandbox\\SecurityNotAllowedTagError' => $vendorDir . '/twig/twig/src/Sandbox/SecurityNotAllowedTagError.php', 'OCA\\Libresign\\Vendor\\Twig\\Sandbox\\SecurityPolicy' => $vendorDir . '/twig/twig/src/Sandbox/SecurityPolicy.php', 'OCA\\Libresign\\Vendor\\Twig\\Sandbox\\SecurityPolicyInterface' => $vendorDir . '/twig/twig/src/Sandbox/SecurityPolicyInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Sandbox\\SourcePolicyInterface' => $vendorDir . '/twig/twig/src/Sandbox/SourcePolicyInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Source' => $vendorDir . '/twig/twig/src/Source.php', 'OCA\\Libresign\\Vendor\\Twig\\Template' => $vendorDir . '/twig/twig/src/Template.php', 'OCA\\Libresign\\Vendor\\Twig\\TemplateWrapper' => $vendorDir . '/twig/twig/src/TemplateWrapper.php', 'OCA\\Libresign\\Vendor\\Twig\\Test\\IntegrationTestCase' => $vendorDir . '/twig/twig/src/Test/IntegrationTestCase.php', 'OCA\\Libresign\\Vendor\\Twig\\Test\\NodeTestCase' => $vendorDir . '/twig/twig/src/Test/NodeTestCase.php', 'OCA\\Libresign\\Vendor\\Twig\\Token' => $vendorDir . '/twig/twig/src/Token.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\AbstractTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/AbstractTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\ApplyTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/ApplyTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\AutoEscapeTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/AutoEscapeTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\BlockTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/BlockTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\DeprecatedTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/DeprecatedTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\DoTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/DoTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\EmbedTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/EmbedTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\ExtendsTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/ExtendsTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\FlushTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/FlushTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\ForTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/ForTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\FromTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/FromTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\GuardTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/GuardTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\IfTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/IfTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\ImportTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/ImportTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\IncludeTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/IncludeTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\MacroTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/MacroTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\SandboxTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/SandboxTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\SetTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/SetTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\TokenParserInterface' => $vendorDir . '/twig/twig/src/TokenParser/TokenParserInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\TypesTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/TypesTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\UseTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/UseTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\WithTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/WithTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenStream' => $vendorDir . '/twig/twig/src/TokenStream.php', 'OCA\\Libresign\\Vendor\\Twig\\TwigCallableInterface' => $vendorDir . '/twig/twig/src/TwigCallableInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\TwigFilter' => $vendorDir . '/twig/twig/src/TwigFilter.php', 'OCA\\Libresign\\Vendor\\Twig\\TwigFunction' => $vendorDir . '/twig/twig/src/TwigFunction.php', 'OCA\\Libresign\\Vendor\\Twig\\TwigTest' => $vendorDir . '/twig/twig/src/TwigTest.php', 'OCA\\Libresign\\Vendor\\Twig\\Util\\CallableArgumentsExtractor' => $vendorDir . '/twig/twig/src/Util/CallableArgumentsExtractor.php', 'OCA\\Libresign\\Vendor\\Twig\\Util\\DeprecationCollector' => $vendorDir . '/twig/twig/src/Util/DeprecationCollector.php', 'OCA\\Libresign\\Vendor\\Twig\\Util\\ReflectionCallable' => $vendorDir . '/twig/twig/src/Util/ReflectionCallable.php', 'OCA\\Libresign\\Vendor\\Twig\\Util\\TemplateDirIterator' => $vendorDir . '/twig/twig/src/Util/TemplateDirIterator.php', 'OCA\\Libresign\\Vendor\\Wobeto\\EmailBlur\\Blur' => $vendorDir . '/wobeto/email-blur/Wobeto/EmailBlur/Blur.php', 'OCA\\Libresign\\Vendor\\mikehaertl\\pdftk\\Command' => $vendorDir . '/mikehaertl/php-pdftk/src/Command.php', 'OCA\\Libresign\\Vendor\\mikehaertl\\pdftk\\DataFields' => $vendorDir . '/mikehaertl/php-pdftk/src/DataFields.php', 'OCA\\Libresign\\Vendor\\mikehaertl\\pdftk\\FdfFile' => $vendorDir . '/mikehaertl/php-pdftk/src/FdfFile.php', 'OCA\\Libresign\\Vendor\\mikehaertl\\pdftk\\InfoFields' => $vendorDir . '/mikehaertl/php-pdftk/src/InfoFields.php', 'OCA\\Libresign\\Vendor\\mikehaertl\\pdftk\\InfoFile' => $vendorDir . '/mikehaertl/php-pdftk/src/InfoFile.php', 'OCA\\Libresign\\Vendor\\mikehaertl\\pdftk\\Pdf' => $vendorDir . '/mikehaertl/php-pdftk/src/Pdf.php', 'OCA\\Libresign\\Vendor\\mikehaertl\\pdftk\\XfdfFile' => $vendorDir . '/mikehaertl/php-pdftk/src/XfdfFile.php', 'OCA\\Libresign\\Vendor\\mikehaertl\\shellcommand\\Command' => $vendorDir . '/mikehaertl/php-shellcommand/src/Command.php', 'OCA\\Libresign\\Vendor\\mikehaertl\\tmp\\File' => $vendorDir . '/mikehaertl/php-tmpfile/src/File.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Common\\Functions\\Strings' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Common/Functions/Strings.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\AES' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/AES.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Blowfish' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Blowfish.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\ChaCha20' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/ChaCha20.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Common\\AsymmetricKey' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Common/AsymmetricKey.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Common\\BlockCipher' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Common/BlockCipher.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Common\\Formats\\Keys\\JWK' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/JWK.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Common\\Formats\\Keys\\OpenSSH' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/OpenSSH.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Common\\Formats\\Keys\\PKCS' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Common\\Formats\\Keys\\PKCS1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Common\\Formats\\Keys\\PKCS8' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS8.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Common\\Formats\\Keys\\PuTTY' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PuTTY.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Common\\Formats\\Signature\\Raw' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Signature/Raw.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Common\\PrivateKey' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Common/PrivateKey.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Common\\PublicKey' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Common/PublicKey.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Common\\StreamCipher' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Common/StreamCipher.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Common\\SymmetricKey' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Common/SymmetricKey.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Common\\Traits\\Fingerprint' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Common/Traits/Fingerprint.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Common\\Traits\\PasswordProtected' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Common/Traits/PasswordProtected.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\DES' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/DES.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\DH' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/DH.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\DH\\Formats\\Keys\\PKCS1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/DH/Formats/Keys/PKCS1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\DH\\Formats\\Keys\\PKCS8' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/DH/Formats/Keys/PKCS8.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\DH\\Parameters' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/DH/Parameters.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\DH\\PrivateKey' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/DH/PrivateKey.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\DH\\PublicKey' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/DH/PublicKey.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\DSA' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/DSA.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\DSA\\Formats\\Keys\\OpenSSH' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/OpenSSH.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\DSA\\Formats\\Keys\\PKCS1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PKCS1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\DSA\\Formats\\Keys\\PKCS8' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PKCS8.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\DSA\\Formats\\Keys\\PuTTY' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PuTTY.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\DSA\\Formats\\Keys\\Raw' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/Raw.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\DSA\\Formats\\Keys\\XML' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/XML.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\DSA\\Formats\\Signature\\ASN1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/ASN1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\DSA\\Formats\\Signature\\Raw' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/Raw.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\DSA\\Formats\\Signature\\SSH2' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/SSH2.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\DSA\\Parameters' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/Parameters.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\DSA\\PrivateKey' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/PrivateKey.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\DSA\\PublicKey' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/PublicKey.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\BaseCurves\\Base' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Base.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\BaseCurves\\Binary' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Binary.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\BaseCurves\\KoblitzPrime' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/KoblitzPrime.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\BaseCurves\\Montgomery' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Montgomery.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\BaseCurves\\Prime' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Prime.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\BaseCurves\\TwistedEdwards' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/TwistedEdwards.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\Curve25519' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Curve25519.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\Curve448' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Curve448.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\Ed25519' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Ed25519.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\Ed448' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Ed448.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\brainpoolP160r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP160r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\brainpoolP160t1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP160t1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\brainpoolP192r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP192r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\brainpoolP192t1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP192t1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\brainpoolP224r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP224r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\brainpoolP224t1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP224t1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\brainpoolP256r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP256r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\brainpoolP256t1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP256t1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\brainpoolP320r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP320r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\brainpoolP320t1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP320t1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\brainpoolP384r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP384r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\brainpoolP384t1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP384t1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\brainpoolP512r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP512r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\brainpoolP512t1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP512t1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\nistb233' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistb233.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\nistb409' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistb409.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\nistk163' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk163.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\nistk233' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk233.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\nistk283' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk283.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\nistk409' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk409.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\nistp192' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp192.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\nistp224' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp224.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\nistp256' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp256.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\nistp384' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp384.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\nistp521' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp521.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\nistt571' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistt571.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\prime192v1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\prime192v2' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v2.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\prime192v3' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v3.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\prime239v1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\prime239v2' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v2.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\prime239v3' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v3.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\prime256v1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime256v1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\secp112r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp112r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\secp112r2' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp112r2.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\secp128r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp128r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\secp128r2' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp128r2.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\secp160k1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160k1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\secp160r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\secp160r2' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160r2.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\secp192k1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp192k1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\secp192r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp192r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\secp224k1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp224k1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\secp224r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp224r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\secp256k1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp256k1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\secp256r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp256r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\secp384r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp384r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\secp521r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp521r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\sect113r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect113r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\sect113r2' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect113r2.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\sect131r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect131r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\sect131r2' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect131r2.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\sect163k1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163k1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\sect163r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\sect163r2' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163r2.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\sect193r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect193r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\sect193r2' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect193r2.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\sect233k1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect233k1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\sect233r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect233r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\sect239k1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect239k1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\sect283k1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect283k1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\sect283r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect283r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\sect409k1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect409k1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\sect409r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect409r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\sect571k1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect571k1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\sect571r1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect571r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Formats\\Keys\\Common' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/Common.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Formats\\Keys\\JWK' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/JWK.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Formats\\Keys\\MontgomeryPrivate' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/MontgomeryPrivate.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Formats\\Keys\\MontgomeryPublic' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/MontgomeryPublic.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Formats\\Keys\\OpenSSH' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/OpenSSH.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Formats\\Keys\\PKCS1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PKCS1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Formats\\Keys\\PKCS8' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PKCS8.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Formats\\Keys\\PuTTY' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PuTTY.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Formats\\Keys\\XML' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/XML.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Formats\\Keys\\libsodium' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/libsodium.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Formats\\Signature\\ASN1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/ASN1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Formats\\Signature\\IEEE' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/IEEE.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Formats\\Signature\\Raw' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/Raw.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Formats\\Signature\\SSH2' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/SSH2.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Parameters' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Parameters.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\PrivateKey' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/PrivateKey.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\PublicKey' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/EC/PublicKey.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Hash' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Hash.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\PublicKeyLoader' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/PublicKeyLoader.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\RC2' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/RC2.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\RC4' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/RC4.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\RSA' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/RSA.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\RSA\\Formats\\Keys\\JWK' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/JWK.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\RSA\\Formats\\Keys\\MSBLOB' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/MSBLOB.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\RSA\\Formats\\Keys\\OpenSSH' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/OpenSSH.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\RSA\\Formats\\Keys\\PKCS1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PKCS1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\RSA\\Formats\\Keys\\PKCS8' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PKCS8.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\RSA\\Formats\\Keys\\PSS' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PSS.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\RSA\\Formats\\Keys\\PuTTY' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PuTTY.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\RSA\\Formats\\Keys\\Raw' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/Raw.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\RSA\\Formats\\Keys\\XML' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/XML.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\RSA\\PrivateKey' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/RSA/PrivateKey.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\RSA\\PublicKey' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/RSA/PublicKey.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Random' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Random.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Rijndael' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Rijndael.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Salsa20' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Salsa20.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\TripleDES' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/TripleDES.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Twofish' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Crypt/Twofish.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Exception\\BadConfigurationException' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Exception/BadConfigurationException.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Exception\\BadDecryptionException' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Exception/BadDecryptionException.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Exception\\BadModeException' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Exception/BadModeException.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Exception\\ConnectionClosedException' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Exception/ConnectionClosedException.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Exception\\FileNotFoundException' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Exception/FileNotFoundException.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Exception\\InconsistentSetupException' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Exception/InconsistentSetupException.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Exception\\InsufficientSetupException' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Exception/InsufficientSetupException.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Exception\\InvalidPacketLengthException' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Exception/InvalidPacketLengthException.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Exception\\NoKeyLoadedException' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Exception/NoKeyLoadedException.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Exception\\NoSupportedAlgorithmsException' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Exception/NoSupportedAlgorithmsException.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Exception\\TimeoutException' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Exception/TimeoutException.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Exception\\UnableToConnectException' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Exception/UnableToConnectException.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Exception\\UnsupportedAlgorithmException' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Exception/UnsupportedAlgorithmException.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Exception\\UnsupportedCurveException' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Exception/UnsupportedCurveException.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Exception\\UnsupportedFormatException' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Exception/UnsupportedFormatException.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Exception\\UnsupportedOperationException' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Exception/UnsupportedOperationException.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ANSI' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ANSI.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Element' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Element.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\AccessDescription' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AccessDescription.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\AdministrationDomainName' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AdministrationDomainName.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\AlgorithmIdentifier' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AlgorithmIdentifier.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\AnotherName' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AnotherName.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\Attribute' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Attribute.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\AttributeType' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeType.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\AttributeTypeAndValue' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeTypeAndValue.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\AttributeValue' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeValue.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\Attributes' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Attributes.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\AuthorityInfoAccessSyntax' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AuthorityInfoAccessSyntax.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\AuthorityKeyIdentifier' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AuthorityKeyIdentifier.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\BaseDistance' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BaseDistance.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\BasicConstraints' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BasicConstraints.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\BuiltInDomainDefinedAttribute' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInDomainDefinedAttribute.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\BuiltInDomainDefinedAttributes' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInDomainDefinedAttributes.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\BuiltInStandardAttributes' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInStandardAttributes.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\CPSuri' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CPSuri.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\CRLDistributionPoints' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLDistributionPoints.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\CRLNumber' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLNumber.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\CRLReason' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLReason.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\CertPolicyId' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertPolicyId.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\Certificate' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Certificate.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\CertificateIssuer' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateIssuer.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\CertificateList' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateList.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\CertificatePolicies' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificatePolicies.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\CertificateSerialNumber' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateSerialNumber.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\CertificationRequest' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificationRequest.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\CertificationRequestInfo' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificationRequestInfo.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\Characteristic_two' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Characteristic_two.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\CountryName' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CountryName.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\Curve' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Curve.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\DHParameter' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DHParameter.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\DSAParams' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAParams.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\DSAPrivateKey' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAPrivateKey.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\DSAPublicKey' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAPublicKey.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\DigestInfo' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DigestInfo.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\DirectoryString' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DirectoryString.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\DisplayText' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DisplayText.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\DistributionPoint' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DistributionPoint.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\DistributionPointName' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DistributionPointName.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\DssSigValue' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DssSigValue.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\ECParameters' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECParameters.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\ECPoint' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECPoint.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\ECPrivateKey' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECPrivateKey.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\EDIPartyName' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EDIPartyName.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\EcdsaSigValue' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EcdsaSigValue.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\EncryptedData' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EncryptedData.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\EncryptedPrivateKeyInfo' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EncryptedPrivateKeyInfo.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\ExtKeyUsageSyntax' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtKeyUsageSyntax.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\Extension' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Extension.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\ExtensionAttribute' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtensionAttribute.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\ExtensionAttributes' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtensionAttributes.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\Extensions' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Extensions.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\FieldElement' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/FieldElement.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\FieldID' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/FieldID.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\GeneralName' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralName.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\GeneralNames' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralNames.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\GeneralSubtree' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralSubtree.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\GeneralSubtrees' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralSubtrees.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\HashAlgorithm' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/HashAlgorithm.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\HoldInstructionCode' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/HoldInstructionCode.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\InvalidityDate' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/InvalidityDate.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\IssuerAltName' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/IssuerAltName.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\IssuingDistributionPoint' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/IssuingDistributionPoint.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\KeyIdentifier' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyIdentifier.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\KeyPurposeId' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyPurposeId.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\KeyUsage' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyUsage.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\MaskGenAlgorithm' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/MaskGenAlgorithm.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\Name' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Name.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\NameConstraints' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NameConstraints.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\NetworkAddress' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NetworkAddress.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\NoticeReference' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NoticeReference.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\NumericUserIdentifier' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NumericUserIdentifier.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\ORAddress' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ORAddress.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\OneAsymmetricKey' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OneAsymmetricKey.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\OrganizationName' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OrganizationName.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\OrganizationalUnitNames' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OrganizationalUnitNames.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\OtherPrimeInfo' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OtherPrimeInfo.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\OtherPrimeInfos' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OtherPrimeInfos.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\PBEParameter' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBEParameter.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\PBES2params' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBES2params.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\PBKDF2params' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBKDF2params.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\PBMAC1params' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBMAC1params.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\PKCS9String' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PKCS9String.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\Pentanomial' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Pentanomial.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\PersonalName' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PersonalName.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\PolicyInformation' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyInformation.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\PolicyMappings' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyMappings.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\PolicyQualifierId' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyQualifierId.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\PolicyQualifierInfo' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyQualifierInfo.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\PostalAddress' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PostalAddress.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\Prime_p' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Prime_p.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\PrivateDomainName' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateDomainName.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\PrivateKey' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKey.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\PrivateKeyInfo' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKeyInfo.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\PrivateKeyUsagePeriod' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKeyUsagePeriod.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\PublicKey' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKey.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\PublicKeyAndChallenge' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKeyAndChallenge.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\PublicKeyInfo' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKeyInfo.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\RC2CBCParameter' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RC2CBCParameter.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\RDNSequence' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RDNSequence.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\RSAPrivateKey' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSAPrivateKey.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\RSAPublicKey' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSAPublicKey.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\RSASSA_PSS_params' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSASSA_PSS_params.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\ReasonFlags' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ReasonFlags.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\RelativeDistinguishedName' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RelativeDistinguishedName.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\RevokedCertificate' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RevokedCertificate.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\SignedPublicKeyAndChallenge' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SignedPublicKeyAndChallenge.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\SpecifiedECDomain' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SpecifiedECDomain.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\SubjectAltName' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectAltName.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\SubjectDirectoryAttributes' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectDirectoryAttributes.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\SubjectInfoAccessSyntax' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectInfoAccessSyntax.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\SubjectPublicKeyInfo' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectPublicKeyInfo.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\TBSCertList' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TBSCertList.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\TBSCertificate' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TBSCertificate.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\TerminalIdentifier' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TerminalIdentifier.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\Time' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Time.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\Trinomial' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Trinomial.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\UniqueIdentifier' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/UniqueIdentifier.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\UserNotice' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/UserNotice.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\Validity' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Validity.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\netscape_ca_policy_url' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_ca_policy_url.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\netscape_cert_type' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_cert_type.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\netscape_comment' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_comment.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\X509' => $vendorDir . '/phpseclib/phpseclib/phpseclib/File/X509.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\BCMath' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\BCMath\\Base' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Base.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\BCMath\\BuiltIn' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/BuiltIn.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\BCMath\\DefaultEngine' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/DefaultEngine.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\BCMath\\OpenSSL' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/OpenSSL.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\BCMath\\Reductions\\Barrett' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Reductions/Barrett.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\BCMath\\Reductions\\EvalBarrett' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Reductions/EvalBarrett.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\Engine' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/Engine.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\GMP' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/GMP.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\GMP\\DefaultEngine' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/GMP/DefaultEngine.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\OpenSSL' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/OpenSSL.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\PHP' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\PHP32' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP32.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\PHP64' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP64.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\PHP\\Base' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Base.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\PHP\\DefaultEngine' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/DefaultEngine.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\PHP\\Montgomery' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Montgomery.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\PHP\\OpenSSL' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/OpenSSL.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\PHP\\Reductions\\Barrett' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Barrett.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\PHP\\Reductions\\Classic' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Classic.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\PHP\\Reductions\\EvalBarrett' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/EvalBarrett.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\PHP\\Reductions\\Montgomery' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Montgomery.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\PHP\\Reductions\\MontgomeryMult' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/MontgomeryMult.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\PHP\\Reductions\\PowerOfTwo' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/PowerOfTwo.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BinaryField' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BinaryField.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BinaryField\\Integer' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/BinaryField/Integer.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\Common\\FiniteField' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/Common/FiniteField.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\Common\\FiniteField\\Integer' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/Common/FiniteField/Integer.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\PrimeField' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/PrimeField.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\PrimeField\\Integer' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Math/PrimeField/Integer.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Net\\SFTP' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Net/SFTP.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Net\\SFTP\\Stream' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Net/SFTP/Stream.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Net\\SSH2' => $vendorDir . '/phpseclib/phpseclib/phpseclib/Net/SSH2.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\System\\SSH\\Agent' => $vendorDir . '/phpseclib/phpseclib/phpseclib/System/SSH/Agent.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\System\\SSH\\Agent\\Identity' => $vendorDir . '/phpseclib/phpseclib/phpseclib/System/SSH/Agent/Identity.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\System\\SSH\\Common\\Traits\\ReadBytes' => $vendorDir . '/phpseclib/phpseclib/phpseclib/System/SSH/Common/Traits/ReadBytes.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\FpdfTpl' => $vendorDir . '/setasign/fpdi/src/FpdfTpl.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\FpdfTplTrait' => $vendorDir . '/setasign/fpdi/src/FpdfTplTrait.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\FpdfTrait' => $vendorDir . '/setasign/fpdi/src/FpdfTrait.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\Fpdi' => $vendorDir . '/setasign/fpdi/src/Fpdi.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\FpdiException' => $vendorDir . '/setasign/fpdi/src/FpdiException.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\FpdiTrait' => $vendorDir . '/setasign/fpdi/src/FpdiTrait.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\GraphicsState' => $vendorDir . '/setasign/fpdi/src/GraphicsState.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\Math\\Matrix' => $vendorDir . '/setasign/fpdi/src/Math/Matrix.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\Math\\Vector' => $vendorDir . '/setasign/fpdi/src/Math/Vector.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\CrossReference\\AbstractReader' => $vendorDir . '/setasign/fpdi/src/PdfParser/CrossReference/AbstractReader.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\CrossReference\\CrossReference' => $vendorDir . '/setasign/fpdi/src/PdfParser/CrossReference/CrossReference.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\CrossReference\\CrossReferenceException' => $vendorDir . '/setasign/fpdi/src/PdfParser/CrossReference/CrossReferenceException.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\CrossReference\\FixedReader' => $vendorDir . '/setasign/fpdi/src/PdfParser/CrossReference/FixedReader.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\CrossReference\\LineReader' => $vendorDir . '/setasign/fpdi/src/PdfParser/CrossReference/LineReader.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\CrossReference\\ReaderInterface' => $vendorDir . '/setasign/fpdi/src/PdfParser/CrossReference/ReaderInterface.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Filter\\Ascii85' => $vendorDir . '/setasign/fpdi/src/PdfParser/Filter/Ascii85.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Filter\\Ascii85Exception' => $vendorDir . '/setasign/fpdi/src/PdfParser/Filter/Ascii85Exception.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Filter\\AsciiHex' => $vendorDir . '/setasign/fpdi/src/PdfParser/Filter/AsciiHex.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Filter\\FilterException' => $vendorDir . '/setasign/fpdi/src/PdfParser/Filter/FilterException.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Filter\\FilterInterface' => $vendorDir . '/setasign/fpdi/src/PdfParser/Filter/FilterInterface.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Filter\\Flate' => $vendorDir . '/setasign/fpdi/src/PdfParser/Filter/Flate.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Filter\\FlateException' => $vendorDir . '/setasign/fpdi/src/PdfParser/Filter/FlateException.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Filter\\Lzw' => $vendorDir . '/setasign/fpdi/src/PdfParser/Filter/Lzw.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Filter\\LzwException' => $vendorDir . '/setasign/fpdi/src/PdfParser/Filter/LzwException.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\PdfParser' => $vendorDir . '/setasign/fpdi/src/PdfParser/PdfParser.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\PdfParserException' => $vendorDir . '/setasign/fpdi/src/PdfParser/PdfParserException.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\StreamReader' => $vendorDir . '/setasign/fpdi/src/PdfParser/StreamReader.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Tokenizer' => $vendorDir . '/setasign/fpdi/src/PdfParser/Tokenizer.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfArray' => $vendorDir . '/setasign/fpdi/src/PdfParser/Type/PdfArray.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfBoolean' => $vendorDir . '/setasign/fpdi/src/PdfParser/Type/PdfBoolean.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfDictionary' => $vendorDir . '/setasign/fpdi/src/PdfParser/Type/PdfDictionary.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfHexString' => $vendorDir . '/setasign/fpdi/src/PdfParser/Type/PdfHexString.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfIndirectObject' => $vendorDir . '/setasign/fpdi/src/PdfParser/Type/PdfIndirectObject.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfIndirectObjectReference' => $vendorDir . '/setasign/fpdi/src/PdfParser/Type/PdfIndirectObjectReference.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfName' => $vendorDir . '/setasign/fpdi/src/PdfParser/Type/PdfName.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfNull' => $vendorDir . '/setasign/fpdi/src/PdfParser/Type/PdfNull.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfNumeric' => $vendorDir . '/setasign/fpdi/src/PdfParser/Type/PdfNumeric.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfStream' => $vendorDir . '/setasign/fpdi/src/PdfParser/Type/PdfStream.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfString' => $vendorDir . '/setasign/fpdi/src/PdfParser/Type/PdfString.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfToken' => $vendorDir . '/setasign/fpdi/src/PdfParser/Type/PdfToken.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfType' => $vendorDir . '/setasign/fpdi/src/PdfParser/Type/PdfType.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfTypeException' => $vendorDir . '/setasign/fpdi/src/PdfParser/Type/PdfTypeException.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfReader\\DataStructure\\Rectangle' => $vendorDir . '/setasign/fpdi/src/PdfReader/DataStructure/Rectangle.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfReader\\Page' => $vendorDir . '/setasign/fpdi/src/PdfReader/Page.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfReader\\PageBoundaries' => $vendorDir . '/setasign/fpdi/src/PdfReader/PageBoundaries.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfReader\\PdfReader' => $vendorDir . '/setasign/fpdi/src/PdfReader/PdfReader.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfReader\\PdfReaderException' => $vendorDir . '/setasign/fpdi/src/PdfReader/PdfReaderException.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\TcpdfFpdi' => $vendorDir . '/setasign/fpdi/src/TcpdfFpdi.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\Tcpdf\\Fpdi' => $vendorDir . '/setasign/fpdi/src/Tcpdf/Fpdi.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\Tfpdf\\FpdfTpl' => $vendorDir . '/setasign/fpdi/src/Tfpdf/FpdfTpl.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\Tfpdf\\Fpdi' => $vendorDir . '/setasign/fpdi/src/Tfpdf/Fpdi.php'); +return array('OCA\\Libresign\\Vendor\\BaconQrCode\\Common\\BitArray' => $vendorDir . '/bacon/bacon-qr-code/src/Common/BitArray.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Common\\BitMatrix' => $vendorDir . '/bacon/bacon-qr-code/src/Common/BitMatrix.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Common\\BitUtils' => $vendorDir . '/bacon/bacon-qr-code/src/Common/BitUtils.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Common\\CharacterSetEci' => $vendorDir . '/bacon/bacon-qr-code/src/Common/CharacterSetEci.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Common\\EcBlock' => $vendorDir . '/bacon/bacon-qr-code/src/Common/EcBlock.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Common\\EcBlocks' => $vendorDir . '/bacon/bacon-qr-code/src/Common/EcBlocks.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Common\\ErrorCorrectionLevel' => $vendorDir . '/bacon/bacon-qr-code/src/Common/ErrorCorrectionLevel.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Common\\FormatInformation' => $vendorDir . '/bacon/bacon-qr-code/src/Common/FormatInformation.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Common\\Mode' => $vendorDir . '/bacon/bacon-qr-code/src/Common/Mode.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Common\\ReedSolomonCodec' => $vendorDir . '/bacon/bacon-qr-code/src/Common/ReedSolomonCodec.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Common\\Version' => $vendorDir . '/bacon/bacon-qr-code/src/Common/Version.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Encoder\\BlockPair' => $vendorDir . '/bacon/bacon-qr-code/src/Encoder/BlockPair.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Encoder\\ByteMatrix' => $vendorDir . '/bacon/bacon-qr-code/src/Encoder/ByteMatrix.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Encoder\\Encoder' => $vendorDir . '/bacon/bacon-qr-code/src/Encoder/Encoder.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Encoder\\MaskUtil' => $vendorDir . '/bacon/bacon-qr-code/src/Encoder/MaskUtil.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Encoder\\MatrixUtil' => $vendorDir . '/bacon/bacon-qr-code/src/Encoder/MatrixUtil.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Encoder\\QrCode' => $vendorDir . '/bacon/bacon-qr-code/src/Encoder/QrCode.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Exception\\ExceptionInterface' => $vendorDir . '/bacon/bacon-qr-code/src/Exception/ExceptionInterface.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Exception\\InvalidArgumentException' => $vendorDir . '/bacon/bacon-qr-code/src/Exception/InvalidArgumentException.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Exception\\OutOfBoundsException' => $vendorDir . '/bacon/bacon-qr-code/src/Exception/OutOfBoundsException.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Exception\\RuntimeException' => $vendorDir . '/bacon/bacon-qr-code/src/Exception/RuntimeException.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Exception\\UnexpectedValueException' => $vendorDir . '/bacon/bacon-qr-code/src/Exception/UnexpectedValueException.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Exception\\WriterException' => $vendorDir . '/bacon/bacon-qr-code/src/Exception/WriterException.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Color\\Alpha' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Color/Alpha.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Color\\Cmyk' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Color/Cmyk.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Color\\ColorInterface' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Color/ColorInterface.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Color\\Gray' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Color/Gray.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Color\\Rgb' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Color/Rgb.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Eye\\CompositeEye' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Eye/CompositeEye.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Eye\\EyeInterface' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Eye/EyeInterface.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Eye\\ModuleEye' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Eye/ModuleEye.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Eye\\PointyEye' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Eye/PointyEye.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Eye\\SimpleCircleEye' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Eye/SimpleCircleEye.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Eye\\SquareEye' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Eye/SquareEye.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\GDLibRenderer' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/GDLibRenderer.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\ImageRenderer' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/ImageRenderer.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Image\\EpsImageBackEnd' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Image/EpsImageBackEnd.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Image\\ImageBackEndInterface' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Image/ImageBackEndInterface.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Image\\ImagickImageBackEnd' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Image/ImagickImageBackEnd.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Image\\SvgImageBackEnd' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Image/SvgImageBackEnd.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Image\\TransformationMatrix' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Image/TransformationMatrix.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Module\\DotsModule' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Module/DotsModule.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Module\\EdgeIterator\\Edge' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Module/EdgeIterator/Edge.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Module\\EdgeIterator\\EdgeIterator' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Module/EdgeIterator/EdgeIterator.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Module\\ModuleInterface' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Module/ModuleInterface.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Module\\RoundnessModule' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Module/RoundnessModule.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Module\\SquareModule' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Module/SquareModule.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Path\\Close' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Path/Close.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Path\\Curve' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Path/Curve.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Path\\EllipticArc' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Path/EllipticArc.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Path\\Line' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Path/Line.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Path\\Move' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Path/Move.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Path\\OperationInterface' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Path/OperationInterface.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Path\\Path' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/Path/Path.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\PlainTextRenderer' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/PlainTextRenderer.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\RendererInterface' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/RendererInterface.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\RendererStyle\\EyeFill' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/RendererStyle/EyeFill.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\RendererStyle\\Fill' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/RendererStyle/Fill.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\RendererStyle\\Gradient' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/RendererStyle/Gradient.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\RendererStyle\\GradientType' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/RendererStyle/GradientType.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\RendererStyle\\RendererStyle' => $vendorDir . '/bacon/bacon-qr-code/src/Renderer/RendererStyle/RendererStyle.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Writer' => $vendorDir . '/bacon/bacon-qr-code/src/Writer.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\ApplicationFactory\\FreshInstanceApplicationFactory' => $vendorDir . '/bamarni/composer-bin-plugin/src/ApplicationFactory/FreshInstanceApplicationFactory.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\ApplicationFactory\\NamespaceApplicationFactory' => $vendorDir . '/bamarni/composer-bin-plugin/src/ApplicationFactory/NamespaceApplicationFactory.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\BamarniBinPlugin' => $vendorDir . '/bamarni/composer-bin-plugin/src/BamarniBinPlugin.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\CommandProvider' => $vendorDir . '/bamarni/composer-bin-plugin/src/CommandProvider.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\Command\\BinCommand' => $vendorDir . '/bamarni/composer-bin-plugin/src/Command/BinCommand.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\Command\\CouldNotCreateNamespaceDir' => $vendorDir . '/bamarni/composer-bin-plugin/src/Command/CouldNotCreateNamespaceDir.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\Config\\Config' => $vendorDir . '/bamarni/composer-bin-plugin/src/Config/Config.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\Config\\ConfigFactory' => $vendorDir . '/bamarni/composer-bin-plugin/src/Config/ConfigFactory.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\Config\\InvalidBamarniComposerExtraConfig' => $vendorDir . '/bamarni/composer-bin-plugin/src/Config/InvalidBamarniComposerExtraConfig.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\Input\\BinInputFactory' => $vendorDir . '/bamarni/composer-bin-plugin/src/Input/BinInputFactory.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\Input\\InvalidBinInput' => $vendorDir . '/bamarni/composer-bin-plugin/src/Input/InvalidBinInput.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\Logger' => $vendorDir . '/bamarni/composer-bin-plugin/src/Logger.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\PublicIO' => $vendorDir . '/bamarni/composer-bin-plugin/src/PublicIO.php', 'OCA\\Libresign\\Vendor\\Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', 'OCA\\Libresign\\Vendor\\DASPRiD\\Enum\\AbstractEnum' => $vendorDir . '/dasprid/enum/src/AbstractEnum.php', 'OCA\\Libresign\\Vendor\\DASPRiD\\Enum\\EnumMap' => $vendorDir . '/dasprid/enum/src/EnumMap.php', 'OCA\\Libresign\\Vendor\\DASPRiD\\Enum\\Exception\\CloneNotSupportedException' => $vendorDir . '/dasprid/enum/src/Exception/CloneNotSupportedException.php', 'OCA\\Libresign\\Vendor\\DASPRiD\\Enum\\Exception\\ExceptionInterface' => $vendorDir . '/dasprid/enum/src/Exception/ExceptionInterface.php', 'OCA\\Libresign\\Vendor\\DASPRiD\\Enum\\Exception\\ExpectationException' => $vendorDir . '/dasprid/enum/src/Exception/ExpectationException.php', 'OCA\\Libresign\\Vendor\\DASPRiD\\Enum\\Exception\\IllegalArgumentException' => $vendorDir . '/dasprid/enum/src/Exception/IllegalArgumentException.php', 'OCA\\Libresign\\Vendor\\DASPRiD\\Enum\\Exception\\MismatchException' => $vendorDir . '/dasprid/enum/src/Exception/MismatchException.php', 'OCA\\Libresign\\Vendor\\DASPRiD\\Enum\\Exception\\SerializeNotSupportedException' => $vendorDir . '/dasprid/enum/src/Exception/SerializeNotSupportedException.php', 'OCA\\Libresign\\Vendor\\DASPRiD\\Enum\\Exception\\UnserializeNotSupportedException' => $vendorDir . '/dasprid/enum/src/Exception/UnserializeNotSupportedException.php', 'OCA\\Libresign\\Vendor\\DASPRiD\\Enum\\NullValue' => $vendorDir . '/dasprid/enum/src/NullValue.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\DeepCopy' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/DeepCopy.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Exception\\CloneException' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Exception\\PropertyException' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Exception/PropertyException.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Filter\\ChainableFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/ChainableFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Filter\\Doctrine\\DoctrineCollectionFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Filter\\Doctrine\\DoctrineEmptyCollectionFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Filter\\Doctrine\\DoctrineProxyFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Filter\\Filter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Filter\\KeepFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/KeepFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Filter\\ReplaceFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/ReplaceFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Filter\\SetNullFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Matcher\\Doctrine\\DoctrineProxyMatcher' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Matcher\\Matcher' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Matcher/Matcher.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Matcher\\PropertyMatcher' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyMatcher.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Matcher\\PropertyNameMatcher' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Matcher\\PropertyTypeMatcher' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Reflection\\ReflectionHelper' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\TypeFilter\\Date\\DateIntervalFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\TypeFilter\\Date\\DatePeriodFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DatePeriodFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\TypeFilter\\ReplaceFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\TypeFilter\\ShallowCopyFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\TypeFilter\\Spl\\ArrayObjectFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/ArrayObjectFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\TypeFilter\\Spl\\SplDoublyLinkedList' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\TypeFilter\\Spl\\SplDoublyLinkedListFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedListFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\TypeFilter\\TypeFilter' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\TypeMatcher\\TypeMatcher' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/TypeMatcher/TypeMatcher.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Bacon\\ErrorCorrectionLevelConverter' => $vendorDir . '/endroid/qr-code/src/Bacon/ErrorCorrectionLevelConverter.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Bacon\\MatrixFactory' => $vendorDir . '/endroid/qr-code/src/Bacon/MatrixFactory.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Builder\\Builder' => $vendorDir . '/endroid/qr-code/src/Builder/Builder.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Builder\\BuilderInterface' => $vendorDir . '/endroid/qr-code/src/Builder/BuilderInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Builder\\BuilderRegistry' => $vendorDir . '/endroid/qr-code/src/Builder/BuilderRegistry.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Builder\\BuilderRegistryInterface' => $vendorDir . '/endroid/qr-code/src/Builder/BuilderRegistryInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Color\\Color' => $vendorDir . '/endroid/qr-code/src/Color/Color.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Color\\ColorInterface' => $vendorDir . '/endroid/qr-code/src/Color/ColorInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Encoding\\Encoding' => $vendorDir . '/endroid/qr-code/src/Encoding/Encoding.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Encoding\\EncodingInterface' => $vendorDir . '/endroid/qr-code/src/Encoding/EncodingInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\ErrorCorrectionLevel' => $vendorDir . '/endroid/qr-code/src/ErrorCorrectionLevel.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Exception\\BlockSizeTooSmallException' => $vendorDir . '/endroid/qr-code/src/Exception/BlockSizeTooSmallException.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Exception\\ValidationException' => $vendorDir . '/endroid/qr-code/src/Exception/ValidationException.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\ImageData\\LabelImageData' => $vendorDir . '/endroid/qr-code/src/ImageData/LabelImageData.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\ImageData\\LogoImageData' => $vendorDir . '/endroid/qr-code/src/ImageData/LogoImageData.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Label\\Font\\Font' => $vendorDir . '/endroid/qr-code/src/Label/Font/Font.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Label\\Font\\FontInterface' => $vendorDir . '/endroid/qr-code/src/Label/Font/FontInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Label\\Font\\OpenSans' => $vendorDir . '/endroid/qr-code/src/Label/Font/OpenSans.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Label\\Label' => $vendorDir . '/endroid/qr-code/src/Label/Label.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Label\\LabelAlignment' => $vendorDir . '/endroid/qr-code/src/Label/LabelAlignment.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Label\\LabelInterface' => $vendorDir . '/endroid/qr-code/src/Label/LabelInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Label\\Margin\\Margin' => $vendorDir . '/endroid/qr-code/src/Label/Margin/Margin.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Label\\Margin\\MarginInterface' => $vendorDir . '/endroid/qr-code/src/Label/Margin/MarginInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Logo\\Logo' => $vendorDir . '/endroid/qr-code/src/Logo/Logo.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Logo\\LogoInterface' => $vendorDir . '/endroid/qr-code/src/Logo/LogoInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Matrix\\Matrix' => $vendorDir . '/endroid/qr-code/src/Matrix/Matrix.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Matrix\\MatrixFactoryInterface' => $vendorDir . '/endroid/qr-code/src/Matrix/MatrixFactoryInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Matrix\\MatrixInterface' => $vendorDir . '/endroid/qr-code/src/Matrix/MatrixInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\QrCode' => $vendorDir . '/endroid/qr-code/src/QrCode.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\QrCodeInterface' => $vendorDir . '/endroid/qr-code/src/QrCodeInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\RoundBlockSizeMode' => $vendorDir . '/endroid/qr-code/src/RoundBlockSizeMode.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\AbstractGdWriter' => $vendorDir . '/endroid/qr-code/src/Writer/AbstractGdWriter.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\BinaryWriter' => $vendorDir . '/endroid/qr-code/src/Writer/BinaryWriter.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\ConsoleWriter' => $vendorDir . '/endroid/qr-code/src/Writer/ConsoleWriter.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\DebugWriter' => $vendorDir . '/endroid/qr-code/src/Writer/DebugWriter.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\EpsWriter' => $vendorDir . '/endroid/qr-code/src/Writer/EpsWriter.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\GifWriter' => $vendorDir . '/endroid/qr-code/src/Writer/GifWriter.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\PdfWriter' => $vendorDir . '/endroid/qr-code/src/Writer/PdfWriter.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\PngWriter' => $vendorDir . '/endroid/qr-code/src/Writer/PngWriter.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\AbstractResult' => $vendorDir . '/endroid/qr-code/src/Writer/Result/AbstractResult.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\BinaryResult' => $vendorDir . '/endroid/qr-code/src/Writer/Result/BinaryResult.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\ConsoleResult' => $vendorDir . '/endroid/qr-code/src/Writer/Result/ConsoleResult.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\DebugResult' => $vendorDir . '/endroid/qr-code/src/Writer/Result/DebugResult.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\EpsResult' => $vendorDir . '/endroid/qr-code/src/Writer/Result/EpsResult.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\GdResult' => $vendorDir . '/endroid/qr-code/src/Writer/Result/GdResult.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\GifResult' => $vendorDir . '/endroid/qr-code/src/Writer/Result/GifResult.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\PdfResult' => $vendorDir . '/endroid/qr-code/src/Writer/Result/PdfResult.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\PngResult' => $vendorDir . '/endroid/qr-code/src/Writer/Result/PngResult.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\ResultInterface' => $vendorDir . '/endroid/qr-code/src/Writer/Result/ResultInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\SvgResult' => $vendorDir . '/endroid/qr-code/src/Writer/Result/SvgResult.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\WebPResult' => $vendorDir . '/endroid/qr-code/src/Writer/Result/WebPResult.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\SvgWriter' => $vendorDir . '/endroid/qr-code/src/Writer/SvgWriter.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\ValidatingWriterInterface' => $vendorDir . '/endroid/qr-code/src/Writer/ValidatingWriterInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\WebPWriter' => $vendorDir . '/endroid/qr-code/src/Writer/WebPWriter.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\WriterInterface' => $vendorDir . '/endroid/qr-code/src/Writer/WriterInterface.php', 'OCA\\Libresign\\Vendor\\Jeidison\\JSignPDF\\JSignFileService' => $vendorDir . '/jsignpdf/jsignpdf-php/src/JSignFileService.php', 'OCA\\Libresign\\Vendor\\Jeidison\\JSignPDF\\JSignPDF' => $vendorDir . '/jsignpdf/jsignpdf-php/src/JSignPDF.php', 'OCA\\Libresign\\Vendor\\Jeidison\\JSignPDF\\Runtime\\JSignPdfRuntimeService' => $vendorDir . '/jsignpdf/jsignpdf-php/src/Runtime/JSignPdfRuntimeService.php', 'OCA\\Libresign\\Vendor\\Jeidison\\JSignPDF\\Runtime\\JavaRuntimeService' => $vendorDir . '/jsignpdf/jsignpdf-php/src/Runtime/JavaRuntimeService.php', 'OCA\\Libresign\\Vendor\\Jeidison\\JSignPDF\\Sign\\JSignParam' => $vendorDir . '/jsignpdf/jsignpdf-php/src/Sign/JSignParam.php', 'OCA\\Libresign\\Vendor\\Jeidison\\JSignPDF\\Sign\\JSignService' => $vendorDir . '/jsignpdf/jsignpdf-php/src/Sign/JSignService.php', 'OCA\\Libresign\\Vendor\\LibreSign\\WhatOSAmI\\OperatingSystem' => $vendorDir . '/libresign/whatosami/src/OperatingSystem.php', 'OCA\\Libresign\\Vendor\\Mpdf\\AssetFetcher' => $vendorDir . '/mpdf/mpdf/src/AssetFetcher.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode' => $vendorDir . '/mpdf/mpdf/src/Barcode.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\AbstractBarcode' => $vendorDir . '/mpdf/mpdf/src/Barcode/AbstractBarcode.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\BarcodeException' => $vendorDir . '/mpdf/mpdf/src/Barcode/BarcodeException.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\BarcodeInterface' => $vendorDir . '/mpdf/mpdf/src/Barcode/BarcodeInterface.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\Codabar' => $vendorDir . '/mpdf/mpdf/src/Barcode/Codabar.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\Code11' => $vendorDir . '/mpdf/mpdf/src/Barcode/Code11.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\Code128' => $vendorDir . '/mpdf/mpdf/src/Barcode/Code128.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\Code39' => $vendorDir . '/mpdf/mpdf/src/Barcode/Code39.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\Code93' => $vendorDir . '/mpdf/mpdf/src/Barcode/Code93.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\EanExt' => $vendorDir . '/mpdf/mpdf/src/Barcode/EanExt.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\EanUpc' => $vendorDir . '/mpdf/mpdf/src/Barcode/EanUpc.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\I25' => $vendorDir . '/mpdf/mpdf/src/Barcode/I25.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\Imb' => $vendorDir . '/mpdf/mpdf/src/Barcode/Imb.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\Msi' => $vendorDir . '/mpdf/mpdf/src/Barcode/Msi.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\Postnet' => $vendorDir . '/mpdf/mpdf/src/Barcode/Postnet.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\Rm4Scc' => $vendorDir . '/mpdf/mpdf/src/Barcode/Rm4Scc.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\S25' => $vendorDir . '/mpdf/mpdf/src/Barcode/S25.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Cache' => $vendorDir . '/mpdf/mpdf/src/Cache.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Color\\ColorConverter' => $vendorDir . '/mpdf/mpdf/src/Color/ColorConverter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Color\\ColorModeConverter' => $vendorDir . '/mpdf/mpdf/src/Color/ColorModeConverter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Color\\ColorSpaceRestrictor' => $vendorDir . '/mpdf/mpdf/src/Color/ColorSpaceRestrictor.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Color\\NamedColors' => $vendorDir . '/mpdf/mpdf/src/Color/NamedColors.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Config\\ConfigVariables' => $vendorDir . '/mpdf/mpdf/src/Config/ConfigVariables.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Config\\FontVariables' => $vendorDir . '/mpdf/mpdf/src/Config/FontVariables.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Container\\ContainerInterface' => $vendorDir . '/mpdf/mpdf/src/Container/ContainerInterface.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Container\\NotFoundException' => $vendorDir . '/mpdf/mpdf/src/Container/NotFoundException.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Container\\SimpleContainer' => $vendorDir . '/mpdf/mpdf/src/Container/SimpleContainer.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Conversion\\DecToAlpha' => $vendorDir . '/mpdf/mpdf/src/Conversion/DecToAlpha.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Conversion\\DecToCjk' => $vendorDir . '/mpdf/mpdf/src/Conversion/DecToCjk.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Conversion\\DecToHebrew' => $vendorDir . '/mpdf/mpdf/src/Conversion/DecToHebrew.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Conversion\\DecToOther' => $vendorDir . '/mpdf/mpdf/src/Conversion/DecToOther.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Conversion\\DecToRoman' => $vendorDir . '/mpdf/mpdf/src/Conversion/DecToRoman.php', 'OCA\\Libresign\\Vendor\\Mpdf\\CssManager' => $vendorDir . '/mpdf/mpdf/src/CssManager.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Css\\Border' => $vendorDir . '/mpdf/mpdf/src/Css/Border.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Css\\DefaultCss' => $vendorDir . '/mpdf/mpdf/src/Css/DefaultCss.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Css\\TextVars' => $vendorDir . '/mpdf/mpdf/src/Css/TextVars.php', 'OCA\\Libresign\\Vendor\\Mpdf\\DirectWrite' => $vendorDir . '/mpdf/mpdf/src/DirectWrite.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Exception\\AssetFetchingException' => $vendorDir . '/mpdf/mpdf/src/Exception/AssetFetchingException.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Exception\\FontException' => $vendorDir . '/mpdf/mpdf/src/Exception/FontException.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Exception\\InvalidArgumentException' => $vendorDir . '/mpdf/mpdf/src/Exception/InvalidArgumentException.php', 'OCA\\Libresign\\Vendor\\Mpdf\\File\\LocalContentLoader' => $vendorDir . '/mpdf/mpdf/src/File/LocalContentLoader.php', 'OCA\\Libresign\\Vendor\\Mpdf\\File\\LocalContentLoaderInterface' => $vendorDir . '/mpdf/mpdf/src/File/LocalContentLoaderInterface.php', 'OCA\\Libresign\\Vendor\\Mpdf\\File\\StreamWrapperChecker' => $vendorDir . '/mpdf/mpdf/src/File/StreamWrapperChecker.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Fonts\\FontCache' => $vendorDir . '/mpdf/mpdf/src/Fonts/FontCache.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Fonts\\FontFileFinder' => $vendorDir . '/mpdf/mpdf/src/Fonts/FontFileFinder.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Fonts\\GlyphOperator' => $vendorDir . '/mpdf/mpdf/src/Fonts/GlyphOperator.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Fonts\\MetricsGenerator' => $vendorDir . '/mpdf/mpdf/src/Fonts/MetricsGenerator.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Form' => $vendorDir . '/mpdf/mpdf/src/Form.php', 'OCA\\Libresign\\Vendor\\Mpdf\\FpdiTrait' => $vendorDir . '/mpdf/mpdf/src/FpdiTrait.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Gif\\ColorTable' => $vendorDir . '/mpdf/mpdf/src/Gif/ColorTable.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Gif\\FileHeader' => $vendorDir . '/mpdf/mpdf/src/Gif/FileHeader.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Gif\\Gif' => $vendorDir . '/mpdf/mpdf/src/Gif/Gif.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Gif\\Image' => $vendorDir . '/mpdf/mpdf/src/Gif/Image.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Gif\\ImageHeader' => $vendorDir . '/mpdf/mpdf/src/Gif/ImageHeader.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Gif\\Lzw' => $vendorDir . '/mpdf/mpdf/src/Gif/Lzw.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Gradient' => $vendorDir . '/mpdf/mpdf/src/Gradient.php', 'OCA\\Libresign\\Vendor\\Mpdf\\HTMLParserMode' => $vendorDir . '/mpdf/mpdf/src/HTMLParserMode.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Http\\ClientInterface' => $vendorDir . '/mpdf/mpdf/src/Http/ClientInterface.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Http\\CurlHttpClient' => $vendorDir . '/mpdf/mpdf/src/Http/CurlHttpClient.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Http\\Exception\\ClientException' => $vendorDir . '/mpdf/mpdf/src/Http/Exception/ClientException.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Http\\Exception\\ForbiddenRequestException' => $vendorDir . '/mpdf/mpdf/src/Http/Exception/ForbiddenRequestException.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Http\\Exception\\NetworkException' => $vendorDir . '/mpdf/mpdf/src/Http/Exception/NetworkException.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Http\\Exception\\RequestException' => $vendorDir . '/mpdf/mpdf/src/Http/Exception/RequestException.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Http\\SocketHttpClient' => $vendorDir . '/mpdf/mpdf/src/Http/SocketHttpClient.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Hyphenator' => $vendorDir . '/mpdf/mpdf/src/Hyphenator.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Image\\Bmp' => $vendorDir . '/mpdf/mpdf/src/Image/Bmp.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Image\\ImageProcessor' => $vendorDir . '/mpdf/mpdf/src/Image/ImageProcessor.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Image\\ImageTypeGuesser' => $vendorDir . '/mpdf/mpdf/src/Image/ImageTypeGuesser.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Image\\Svg' => $vendorDir . '/mpdf/mpdf/src/Image/Svg.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Image\\Wmf' => $vendorDir . '/mpdf/mpdf/src/Image/Wmf.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Language\\LanguageToFont' => $vendorDir . '/mpdf/mpdf/src/Language/LanguageToFont.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Language\\LanguageToFontInterface' => $vendorDir . '/mpdf/mpdf/src/Language/LanguageToFontInterface.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Language\\ScriptToLanguage' => $vendorDir . '/mpdf/mpdf/src/Language/ScriptToLanguage.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Language\\ScriptToLanguageInterface' => $vendorDir . '/mpdf/mpdf/src/Language/ScriptToLanguageInterface.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Log\\Context' => $vendorDir . '/mpdf/mpdf/src/Log/Context.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Mpdf' => $vendorDir . '/mpdf/mpdf/src/Mpdf.php', 'OCA\\Libresign\\Vendor\\Mpdf\\MpdfException' => $vendorDir . '/mpdf/mpdf/src/MpdfException.php', 'OCA\\Libresign\\Vendor\\Mpdf\\MpdfImageException' => $vendorDir . '/mpdf/mpdf/src/MpdfImageException.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Otl' => $vendorDir . '/mpdf/mpdf/src/Otl.php', 'OCA\\Libresign\\Vendor\\Mpdf\\OtlDump' => $vendorDir . '/mpdf/mpdf/src/OtlDump.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Output\\Destination' => $vendorDir . '/mpdf/mpdf/src/Output/Destination.php', 'OCA\\Libresign\\Vendor\\Mpdf\\PageBox' => $vendorDir . '/mpdf/mpdf/src/PageBox.php', 'OCA\\Libresign\\Vendor\\Mpdf\\PageFormat' => $vendorDir . '/mpdf/mpdf/src/PageFormat.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Pdf\\Protection' => $vendorDir . '/mpdf/mpdf/src/Pdf/Protection.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Pdf\\Protection\\UniqidGenerator' => $vendorDir . '/mpdf/mpdf/src/Pdf/Protection/UniqidGenerator.php', 'OCA\\Libresign\\Vendor\\Mpdf\\PsrHttpMessageShim\\Request' => $vendorDir . '/mpdf/psr-http-message-shim/src/Request.php', 'OCA\\Libresign\\Vendor\\Mpdf\\PsrHttpMessageShim\\Response' => $vendorDir . '/mpdf/psr-http-message-shim/src/Response.php', 'OCA\\Libresign\\Vendor\\Mpdf\\PsrHttpMessageShim\\Stream' => $vendorDir . '/mpdf/psr-http-message-shim/src/Stream.php', 'OCA\\Libresign\\Vendor\\Mpdf\\PsrHttpMessageShim\\Uri' => $vendorDir . '/mpdf/psr-http-message-shim/src/Uri.php', 'OCA\\Libresign\\Vendor\\Mpdf\\PsrLogAwareTrait\\MpdfPsrLogAwareTrait' => $vendorDir . '/mpdf/psr-log-aware-trait/src/MpdfPsrLogAwareTrait.php', 'OCA\\Libresign\\Vendor\\Mpdf\\PsrLogAwareTrait\\PsrLogAwareTrait' => $vendorDir . '/mpdf/psr-log-aware-trait/src/PsrLogAwareTrait.php', 'OCA\\Libresign\\Vendor\\Mpdf\\ServiceFactory' => $vendorDir . '/mpdf/mpdf/src/ServiceFactory.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Shaper\\Indic' => $vendorDir . '/mpdf/mpdf/src/Shaper/Indic.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Shaper\\Myanmar' => $vendorDir . '/mpdf/mpdf/src/Shaper/Myanmar.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Shaper\\Sea' => $vendorDir . '/mpdf/mpdf/src/Shaper/Sea.php', 'OCA\\Libresign\\Vendor\\Mpdf\\SizeConverter' => $vendorDir . '/mpdf/mpdf/src/SizeConverter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Strict' => $vendorDir . '/mpdf/mpdf/src/Strict.php', 'OCA\\Libresign\\Vendor\\Mpdf\\TTFontFile' => $vendorDir . '/mpdf/mpdf/src/TTFontFile.php', 'OCA\\Libresign\\Vendor\\Mpdf\\TTFontFileAnalysis' => $vendorDir . '/mpdf/mpdf/src/TTFontFileAnalysis.php', 'OCA\\Libresign\\Vendor\\Mpdf\\TableOfContents' => $vendorDir . '/mpdf/mpdf/src/TableOfContents.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag' => $vendorDir . '/mpdf/mpdf/src/Tag.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\A' => $vendorDir . '/mpdf/mpdf/src/Tag/A.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Acronym' => $vendorDir . '/mpdf/mpdf/src/Tag/Acronym.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Address' => $vendorDir . '/mpdf/mpdf/src/Tag/Address.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Annotation' => $vendorDir . '/mpdf/mpdf/src/Tag/Annotation.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Article' => $vendorDir . '/mpdf/mpdf/src/Tag/Article.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Aside' => $vendorDir . '/mpdf/mpdf/src/Tag/Aside.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\B' => $vendorDir . '/mpdf/mpdf/src/Tag/B.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\BarCode' => $vendorDir . '/mpdf/mpdf/src/Tag/BarCode.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Bdi' => $vendorDir . '/mpdf/mpdf/src/Tag/Bdi.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Bdo' => $vendorDir . '/mpdf/mpdf/src/Tag/Bdo.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Big' => $vendorDir . '/mpdf/mpdf/src/Tag/Big.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\BlockQuote' => $vendorDir . '/mpdf/mpdf/src/Tag/BlockQuote.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\BlockTag' => $vendorDir . '/mpdf/mpdf/src/Tag/BlockTag.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Bookmark' => $vendorDir . '/mpdf/mpdf/src/Tag/Bookmark.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Br' => $vendorDir . '/mpdf/mpdf/src/Tag/Br.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Caption' => $vendorDir . '/mpdf/mpdf/src/Tag/Caption.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Center' => $vendorDir . '/mpdf/mpdf/src/Tag/Center.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Cite' => $vendorDir . '/mpdf/mpdf/src/Tag/Cite.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Code' => $vendorDir . '/mpdf/mpdf/src/Tag/Code.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\ColumnBreak' => $vendorDir . '/mpdf/mpdf/src/Tag/ColumnBreak.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Columns' => $vendorDir . '/mpdf/mpdf/src/Tag/Columns.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Dd' => $vendorDir . '/mpdf/mpdf/src/Tag/Dd.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Del' => $vendorDir . '/mpdf/mpdf/src/Tag/Del.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Details' => $vendorDir . '/mpdf/mpdf/src/Tag/Details.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Div' => $vendorDir . '/mpdf/mpdf/src/Tag/Div.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Dl' => $vendorDir . '/mpdf/mpdf/src/Tag/Dl.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\DotTab' => $vendorDir . '/mpdf/mpdf/src/Tag/DotTab.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Dt' => $vendorDir . '/mpdf/mpdf/src/Tag/Dt.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Em' => $vendorDir . '/mpdf/mpdf/src/Tag/Em.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\FieldSet' => $vendorDir . '/mpdf/mpdf/src/Tag/FieldSet.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\FigCaption' => $vendorDir . '/mpdf/mpdf/src/Tag/FigCaption.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Figure' => $vendorDir . '/mpdf/mpdf/src/Tag/Figure.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Font' => $vendorDir . '/mpdf/mpdf/src/Tag/Font.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Footer' => $vendorDir . '/mpdf/mpdf/src/Tag/Footer.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Form' => $vendorDir . '/mpdf/mpdf/src/Tag/Form.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\FormFeed' => $vendorDir . '/mpdf/mpdf/src/Tag/FormFeed.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\H1' => $vendorDir . '/mpdf/mpdf/src/Tag/H1.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\H2' => $vendorDir . '/mpdf/mpdf/src/Tag/H2.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\H3' => $vendorDir . '/mpdf/mpdf/src/Tag/H3.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\H4' => $vendorDir . '/mpdf/mpdf/src/Tag/H4.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\H5' => $vendorDir . '/mpdf/mpdf/src/Tag/H5.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\H6' => $vendorDir . '/mpdf/mpdf/src/Tag/H6.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\HGroup' => $vendorDir . '/mpdf/mpdf/src/Tag/HGroup.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Header' => $vendorDir . '/mpdf/mpdf/src/Tag/Header.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Hr' => $vendorDir . '/mpdf/mpdf/src/Tag/Hr.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\I' => $vendorDir . '/mpdf/mpdf/src/Tag/I.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Img' => $vendorDir . '/mpdf/mpdf/src/Tag/Img.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\IndexEntry' => $vendorDir . '/mpdf/mpdf/src/Tag/IndexEntry.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\IndexInsert' => $vendorDir . '/mpdf/mpdf/src/Tag/IndexInsert.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\InlineTag' => $vendorDir . '/mpdf/mpdf/src/Tag/InlineTag.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Input' => $vendorDir . '/mpdf/mpdf/src/Tag/Input.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Ins' => $vendorDir . '/mpdf/mpdf/src/Tag/Ins.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Kbd' => $vendorDir . '/mpdf/mpdf/src/Tag/Kbd.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Legend' => $vendorDir . '/mpdf/mpdf/src/Tag/Legend.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Li' => $vendorDir . '/mpdf/mpdf/src/Tag/Li.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Main' => $vendorDir . '/mpdf/mpdf/src/Tag/Main.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Mark' => $vendorDir . '/mpdf/mpdf/src/Tag/Mark.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Meter' => $vendorDir . '/mpdf/mpdf/src/Tag/Meter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Nav' => $vendorDir . '/mpdf/mpdf/src/Tag/Nav.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\NewColumn' => $vendorDir . '/mpdf/mpdf/src/Tag/NewColumn.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\NewPage' => $vendorDir . '/mpdf/mpdf/src/Tag/NewPage.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Ol' => $vendorDir . '/mpdf/mpdf/src/Tag/Ol.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Option' => $vendorDir . '/mpdf/mpdf/src/Tag/Option.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\P' => $vendorDir . '/mpdf/mpdf/src/Tag/P.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\PageBreak' => $vendorDir . '/mpdf/mpdf/src/Tag/PageBreak.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\PageFooter' => $vendorDir . '/mpdf/mpdf/src/Tag/PageFooter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\PageHeader' => $vendorDir . '/mpdf/mpdf/src/Tag/PageHeader.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Pre' => $vendorDir . '/mpdf/mpdf/src/Tag/Pre.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Progress' => $vendorDir . '/mpdf/mpdf/src/Tag/Progress.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Q' => $vendorDir . '/mpdf/mpdf/src/Tag/Q.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\S' => $vendorDir . '/mpdf/mpdf/src/Tag/S.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Samp' => $vendorDir . '/mpdf/mpdf/src/Tag/Samp.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Section' => $vendorDir . '/mpdf/mpdf/src/Tag/Section.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Select' => $vendorDir . '/mpdf/mpdf/src/Tag/Select.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\SetHtmlPageFooter' => $vendorDir . '/mpdf/mpdf/src/Tag/SetHtmlPageFooter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\SetHtmlPageHeader' => $vendorDir . '/mpdf/mpdf/src/Tag/SetHtmlPageHeader.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\SetPageFooter' => $vendorDir . '/mpdf/mpdf/src/Tag/SetPageFooter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\SetPageHeader' => $vendorDir . '/mpdf/mpdf/src/Tag/SetPageHeader.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Small' => $vendorDir . '/mpdf/mpdf/src/Tag/Small.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Span' => $vendorDir . '/mpdf/mpdf/src/Tag/Span.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Strike' => $vendorDir . '/mpdf/mpdf/src/Tag/Strike.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Strong' => $vendorDir . '/mpdf/mpdf/src/Tag/Strong.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Sub' => $vendorDir . '/mpdf/mpdf/src/Tag/Sub.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\SubstituteTag' => $vendorDir . '/mpdf/mpdf/src/Tag/SubstituteTag.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Summary' => $vendorDir . '/mpdf/mpdf/src/Tag/Summary.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Sup' => $vendorDir . '/mpdf/mpdf/src/Tag/Sup.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\TBody' => $vendorDir . '/mpdf/mpdf/src/Tag/TBody.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\TFoot' => $vendorDir . '/mpdf/mpdf/src/Tag/TFoot.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\THead' => $vendorDir . '/mpdf/mpdf/src/Tag/THead.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Table' => $vendorDir . '/mpdf/mpdf/src/Tag/Table.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Tag' => $vendorDir . '/mpdf/mpdf/src/Tag/Tag.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Td' => $vendorDir . '/mpdf/mpdf/src/Tag/Td.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\TextArea' => $vendorDir . '/mpdf/mpdf/src/Tag/TextArea.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\TextCircle' => $vendorDir . '/mpdf/mpdf/src/Tag/TextCircle.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Th' => $vendorDir . '/mpdf/mpdf/src/Tag/Th.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Time' => $vendorDir . '/mpdf/mpdf/src/Tag/Time.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Toc' => $vendorDir . '/mpdf/mpdf/src/Tag/Toc.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\TocEntry' => $vendorDir . '/mpdf/mpdf/src/Tag/TocEntry.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\TocPageBreak' => $vendorDir . '/mpdf/mpdf/src/Tag/TocPageBreak.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Tr' => $vendorDir . '/mpdf/mpdf/src/Tag/Tr.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Tt' => $vendorDir . '/mpdf/mpdf/src/Tag/Tt.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Tta' => $vendorDir . '/mpdf/mpdf/src/Tag/Tta.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Tts' => $vendorDir . '/mpdf/mpdf/src/Tag/Tts.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Ttz' => $vendorDir . '/mpdf/mpdf/src/Tag/Ttz.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\U' => $vendorDir . '/mpdf/mpdf/src/Tag/U.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Ul' => $vendorDir . '/mpdf/mpdf/src/Tag/Ul.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\VarTag' => $vendorDir . '/mpdf/mpdf/src/Tag/VarTag.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\WatermarkImage' => $vendorDir . '/mpdf/mpdf/src/Tag/WatermarkImage.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\WatermarkText' => $vendorDir . '/mpdf/mpdf/src/Tag/WatermarkText.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Ucdn' => $vendorDir . '/mpdf/mpdf/src/Ucdn.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Utils\\Arrays' => $vendorDir . '/mpdf/mpdf/src/Utils/Arrays.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Utils\\NumericString' => $vendorDir . '/mpdf/mpdf/src/Utils/NumericString.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Utils\\PdfDate' => $vendorDir . '/mpdf/mpdf/src/Utils/PdfDate.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Utils\\UtfString' => $vendorDir . '/mpdf/mpdf/src/Utils/UtfString.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Watermark' => $vendorDir . '/mpdf/mpdf/src/Watermark.php', 'OCA\\Libresign\\Vendor\\Mpdf\\WatermarkImage' => $vendorDir . '/mpdf/mpdf/src/WatermarkImage.php', 'OCA\\Libresign\\Vendor\\Mpdf\\WatermarkText' => $vendorDir . '/mpdf/mpdf/src/WatermarkText.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\BackgroundWriter' => $vendorDir . '/mpdf/mpdf/src/Writer/BackgroundWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\BaseWriter' => $vendorDir . '/mpdf/mpdf/src/Writer/BaseWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\BookmarkWriter' => $vendorDir . '/mpdf/mpdf/src/Writer/BookmarkWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\ColorWriter' => $vendorDir . '/mpdf/mpdf/src/Writer/ColorWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\FontWriter' => $vendorDir . '/mpdf/mpdf/src/Writer/FontWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\FormWriter' => $vendorDir . '/mpdf/mpdf/src/Writer/FormWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\ImageWriter' => $vendorDir . '/mpdf/mpdf/src/Writer/ImageWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\JavaScriptWriter' => $vendorDir . '/mpdf/mpdf/src/Writer/JavaScriptWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\MetadataWriter' => $vendorDir . '/mpdf/mpdf/src/Writer/MetadataWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\ObjectWriter' => $vendorDir . '/mpdf/mpdf/src/Writer/ObjectWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\OptionalContentWriter' => $vendorDir . '/mpdf/mpdf/src/Writer/OptionalContentWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\PageWriter' => $vendorDir . '/mpdf/mpdf/src/Writer/PageWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\ResourceWriter' => $vendorDir . '/mpdf/mpdf/src/Writer/ResourceWriter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Adapter\\AdapterInterface' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/Adapter/AdapterInterface.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Adapter\\ArrayAdapter' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/Adapter/ArrayAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Adapter\\CallbackAdapter' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/Adapter/CallbackAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Adapter\\ConcatenationAdapter' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/Adapter/ConcatenationAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Adapter\\EmptyAdapter' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/Adapter/EmptyAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Adapter\\FixedAdapter' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/Adapter/FixedAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Adapter\\NullAdapter' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/Adapter/NullAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Adapter\\TransformingAdapter' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/Adapter/TransformingAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Doctrine\\Collections\\CollectionAdapter' => $vendorDir . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/Collections/CollectionAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Doctrine\\Collections\\SelectableAdapter' => $vendorDir . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/Collections/SelectableAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Doctrine\\DBAL\\QueryAdapter' => $vendorDir . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/DBAL/QueryAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Doctrine\\DBAL\\SingleTableQueryAdapter' => $vendorDir . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/DBAL/SingleTableQueryAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Doctrine\\MongoDBODM\\AggregationAdapter' => $vendorDir . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/MongoDBODM/AggregationAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Doctrine\\MongoDBODM\\QueryAdapter' => $vendorDir . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/MongoDBODM/QueryAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Doctrine\\ORM\\QueryAdapter' => $vendorDir . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/ORM/QueryAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Doctrine\\PHPCRODM\\QueryAdapter' => $vendorDir . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/PHPCRODM/QueryAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Elastica\\ElasticaAdapter' => $vendorDir . '/pagerfanta/pagerfanta/lib/Adapter/Elastica/ElasticaAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\InvalidArgumentException' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/Exception/InvalidArgumentException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\LessThan1CurrentPageException' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/Exception/LessThan1CurrentPageException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\LessThan1MaxPagesException' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/Exception/LessThan1MaxPagesException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\LessThan1MaxPerPageException' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/Exception/LessThan1MaxPerPageException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\LogicException' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/Exception/LogicException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\NotValidCurrentPageException' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/Exception/NotValidCurrentPageException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\NotValidMaxPerPageException' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/Exception/NotValidMaxPerPageException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\NotValidResultCountException' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/Exception/NotValidResultCountException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\OutOfBoundsException' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/Exception/OutOfBoundsException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\OutOfRangeCurrentPageException' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/Exception/OutOfRangeCurrentPageException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\PagerfantaException' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/Exception/PagerfantaException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\RuntimeException' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/Exception/RuntimeException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Pagerfanta' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/Pagerfanta.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\PagerfantaInterface' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/PagerfantaInterface.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\RouteGenerator\\RouteGeneratorDecorator' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/RouteGenerator/RouteGeneratorDecorator.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\RouteGenerator\\RouteGeneratorFactoryInterface' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/RouteGenerator/RouteGeneratorFactoryInterface.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\RouteGenerator\\RouteGeneratorInterface' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/RouteGenerator/RouteGeneratorInterface.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Solarium\\SolariumAdapter' => $vendorDir . '/pagerfanta/pagerfanta/lib/Adapter/Solarium/SolariumAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Twig\\Extension\\PagerfantaExtension' => $vendorDir . '/pagerfanta/pagerfanta/lib/Twig/Extension/PagerfantaExtension.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Twig\\Extension\\PagerfantaRuntime' => $vendorDir . '/pagerfanta/pagerfanta/lib/Twig/Extension/PagerfantaRuntime.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Twig\\View\\TwigView' => $vendorDir . '/pagerfanta/pagerfanta/lib/Twig/View/TwigView.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\DefaultView' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/View/DefaultView.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\Foundation6View' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/View/Foundation6View.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\OptionableView' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/View/OptionableView.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\SemanticUiView' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/View/SemanticUiView.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\TemplateView' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/View/TemplateView.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\Template\\DefaultTemplate' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/View/Template/DefaultTemplate.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\Template\\Foundation6Template' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/View/Template/Foundation6Template.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\Template\\SemanticUiTemplate' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/View/Template/SemanticUiTemplate.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\Template\\Template' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/View/Template/Template.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\Template\\TemplateInterface' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/View/Template/TemplateInterface.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\Template\\TwitterBootstrap3Template' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/View/Template/TwitterBootstrap3Template.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\Template\\TwitterBootstrap4Template' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/View/Template/TwitterBootstrap4Template.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\Template\\TwitterBootstrap5Template' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/View/Template/TwitterBootstrap5Template.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\Template\\TwitterBootstrapTemplate' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/View/Template/TwitterBootstrapTemplate.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\TwitterBootstrap3View' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/View/TwitterBootstrap3View.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\TwitterBootstrap4View' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/View/TwitterBootstrap4View.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\TwitterBootstrap5View' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/View/TwitterBootstrap5View.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\TwitterBootstrapView' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/View/TwitterBootstrapView.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\View' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/View/View.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\ViewFactory' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/View/ViewFactory.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\ViewFactoryInterface' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/View/ViewFactoryInterface.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\ViewInterface' => $vendorDir . '/pagerfanta/pagerfanta/lib/Core/View/ViewInterface.php', 'OCA\\Libresign\\Vendor\\Psr\\Http\\Message\\MessageInterface' => $vendorDir . '/psr/http-message/src/MessageInterface.php', 'OCA\\Libresign\\Vendor\\Psr\\Http\\Message\\RequestInterface' => $vendorDir . '/psr/http-message/src/RequestInterface.php', 'OCA\\Libresign\\Vendor\\Psr\\Http\\Message\\ResponseInterface' => $vendorDir . '/psr/http-message/src/ResponseInterface.php', 'OCA\\Libresign\\Vendor\\Psr\\Http\\Message\\ServerRequestInterface' => $vendorDir . '/psr/http-message/src/ServerRequestInterface.php', 'OCA\\Libresign\\Vendor\\Psr\\Http\\Message\\StreamInterface' => $vendorDir . '/psr/http-message/src/StreamInterface.php', 'OCA\\Libresign\\Vendor\\Psr\\Http\\Message\\UploadedFileInterface' => $vendorDir . '/psr/http-message/src/UploadedFileInterface.php', 'OCA\\Libresign\\Vendor\\Psr\\Http\\Message\\UriInterface' => $vendorDir . '/psr/http-message/src/UriInterface.php', 'OCA\\Libresign\\Vendor\\Psr\\Log\\AbstractLogger' => $vendorDir . '/psr/log/src/AbstractLogger.php', 'OCA\\Libresign\\Vendor\\Psr\\Log\\InvalidArgumentException' => $vendorDir . '/psr/log/src/InvalidArgumentException.php', 'OCA\\Libresign\\Vendor\\Psr\\Log\\LogLevel' => $vendorDir . '/psr/log/src/LogLevel.php', 'OCA\\Libresign\\Vendor\\Psr\\Log\\LoggerAwareInterface' => $vendorDir . '/psr/log/src/LoggerAwareInterface.php', 'OCA\\Libresign\\Vendor\\Psr\\Log\\LoggerAwareTrait' => $vendorDir . '/psr/log/src/LoggerAwareTrait.php', 'OCA\\Libresign\\Vendor\\Psr\\Log\\LoggerInterface' => $vendorDir . '/psr/log/src/LoggerInterface.php', 'OCA\\Libresign\\Vendor\\Psr\\Log\\LoggerTrait' => $vendorDir . '/psr/log/src/LoggerTrait.php', 'OCA\\Libresign\\Vendor\\Psr\\Log\\NullLogger' => $vendorDir . '/psr/log/src/NullLogger.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Config' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Config.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Document' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Document.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Element.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element\\ElementArray' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementArray.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element\\ElementBoolean' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementBoolean.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element\\ElementDate' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementDate.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element\\ElementHexa' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementHexa.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element\\ElementMissing' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementMissing.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element\\ElementName' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementName.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element\\ElementNull' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementNull.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element\\ElementNumeric' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementNumeric.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element\\ElementString' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementString.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element\\ElementStruct' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementStruct.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element\\ElementXRef' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementXRef.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Encoding' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Encoding.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Encoding\\AbstractEncoding' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Encoding/AbstractEncoding.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Encoding\\EncodingLocator' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Encoding/EncodingLocator.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Encoding\\ISOLatin1Encoding' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Encoding/ISOLatin1Encoding.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Encoding\\ISOLatin9Encoding' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Encoding/ISOLatin9Encoding.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Encoding\\MacRomanEncoding' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Encoding/MacRomanEncoding.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Encoding\\PDFDocEncoding' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Encoding/PDFDocEncoding.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Encoding\\PostScriptGlyphs' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Encoding/PostScriptGlyphs.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Encoding\\StandardEncoding' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Encoding/StandardEncoding.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Encoding\\WinAnsiEncoding' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Encoding/WinAnsiEncoding.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Exception\\EmptyPdfException' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Exception/EmptyPdfException.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Exception\\EncodingNotFoundException' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Exception/EncodingNotFoundException.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Exception\\InvalidDictionaryObjectException' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Exception/InvalidDictionaryObjectException.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Exception\\MissingCatalogException' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Exception/MissingCatalogException.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Exception\\MissingPdfHeaderException' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Exception/MissingPdfHeaderException.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Exception\\NotImplementedException' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Exception/NotImplementedException.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Font' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Font.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Font\\FontCIDFontType0' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Font/FontCIDFontType0.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Font\\FontCIDFontType2' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Font/FontCIDFontType2.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Font\\FontTrueType' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Font/FontTrueType.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Font\\FontType0' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Font/FontType0.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Font\\FontType1' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Font/FontType1.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Font\\FontType3' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Font/FontType3.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Header' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Header.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\PDFObject' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/PDFObject.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Page' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Page.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Pages' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Pages.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Parser' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/Parser.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\RawData\\FilterHelper' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/RawData/FilterHelper.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\RawData\\RawDataParser' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/RawData/RawDataParser.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\XObject\\Form' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/XObject/Form.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\XObject\\Image' => $vendorDir . '/smalot/pdfparser/src/Smalot/PdfParser/XObject/Image.php', 'OCA\\Libresign\\Vendor\\Symfony\\Polyfill\\Ctype\\Ctype' => $vendorDir . '/symfony/polyfill-ctype/Ctype.php', 'OCA\\Libresign\\Vendor\\Symfony\\Polyfill\\Mbstring\\Mbstring' => $vendorDir . '/symfony/polyfill-mbstring/Mbstring.php', 'OCA\\Libresign\\Vendor\\Twig\\AbstractTwigCallable' => $vendorDir . '/twig/twig/src/AbstractTwigCallable.php', 'OCA\\Libresign\\Vendor\\Twig\\Attribute\\AsTwigFilter' => $vendorDir . '/twig/twig/src/Attribute/AsTwigFilter.php', 'OCA\\Libresign\\Vendor\\Twig\\Attribute\\AsTwigFunction' => $vendorDir . '/twig/twig/src/Attribute/AsTwigFunction.php', 'OCA\\Libresign\\Vendor\\Twig\\Attribute\\AsTwigTest' => $vendorDir . '/twig/twig/src/Attribute/AsTwigTest.php', 'OCA\\Libresign\\Vendor\\Twig\\Attribute\\FirstClassTwigCallableReady' => $vendorDir . '/twig/twig/src/Attribute/FirstClassTwigCallableReady.php', 'OCA\\Libresign\\Vendor\\Twig\\Attribute\\YieldReady' => $vendorDir . '/twig/twig/src/Attribute/YieldReady.php', 'OCA\\Libresign\\Vendor\\Twig\\Cache\\CacheInterface' => $vendorDir . '/twig/twig/src/Cache/CacheInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Cache\\ChainCache' => $vendorDir . '/twig/twig/src/Cache/ChainCache.php', 'OCA\\Libresign\\Vendor\\Twig\\Cache\\FilesystemCache' => $vendorDir . '/twig/twig/src/Cache/FilesystemCache.php', 'OCA\\Libresign\\Vendor\\Twig\\Cache\\NullCache' => $vendorDir . '/twig/twig/src/Cache/NullCache.php', 'OCA\\Libresign\\Vendor\\Twig\\Cache\\ReadOnlyFilesystemCache' => $vendorDir . '/twig/twig/src/Cache/ReadOnlyFilesystemCache.php', 'OCA\\Libresign\\Vendor\\Twig\\Cache\\RemovableCacheInterface' => $vendorDir . '/twig/twig/src/Cache/RemovableCacheInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Compiler' => $vendorDir . '/twig/twig/src/Compiler.php', 'OCA\\Libresign\\Vendor\\Twig\\DeprecatedCallableInfo' => $vendorDir . '/twig/twig/src/DeprecatedCallableInfo.php', 'OCA\\Libresign\\Vendor\\Twig\\Environment' => $vendorDir . '/twig/twig/src/Environment.php', 'OCA\\Libresign\\Vendor\\Twig\\Error\\Error' => $vendorDir . '/twig/twig/src/Error/Error.php', 'OCA\\Libresign\\Vendor\\Twig\\Error\\LoaderError' => $vendorDir . '/twig/twig/src/Error/LoaderError.php', 'OCA\\Libresign\\Vendor\\Twig\\Error\\RuntimeError' => $vendorDir . '/twig/twig/src/Error/RuntimeError.php', 'OCA\\Libresign\\Vendor\\Twig\\Error\\SyntaxError' => $vendorDir . '/twig/twig/src/Error/SyntaxError.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser' => $vendorDir . '/twig/twig/src/ExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\AbstractExpressionParser' => $vendorDir . '/twig/twig/src/ExpressionParser/AbstractExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\ExpressionParserDescriptionInterface' => $vendorDir . '/twig/twig/src/ExpressionParser/ExpressionParserDescriptionInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\ExpressionParserInterface' => $vendorDir . '/twig/twig/src/ExpressionParser/ExpressionParserInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\ExpressionParserType' => $vendorDir . '/twig/twig/src/ExpressionParser/ExpressionParserType.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\ExpressionParsers' => $vendorDir . '/twig/twig/src/ExpressionParser/ExpressionParsers.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\InfixAssociativity' => $vendorDir . '/twig/twig/src/ExpressionParser/InfixAssociativity.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\InfixExpressionParserInterface' => $vendorDir . '/twig/twig/src/ExpressionParser/InfixExpressionParserInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Infix\\ArgumentsTrait' => $vendorDir . '/twig/twig/src/ExpressionParser/Infix/ArgumentsTrait.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Infix\\ArrowExpressionParser' => $vendorDir . '/twig/twig/src/ExpressionParser/Infix/ArrowExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Infix\\BinaryOperatorExpressionParser' => $vendorDir . '/twig/twig/src/ExpressionParser/Infix/BinaryOperatorExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Infix\\ConditionalTernaryExpressionParser' => $vendorDir . '/twig/twig/src/ExpressionParser/Infix/ConditionalTernaryExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Infix\\DotExpressionParser' => $vendorDir . '/twig/twig/src/ExpressionParser/Infix/DotExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Infix\\FilterExpressionParser' => $vendorDir . '/twig/twig/src/ExpressionParser/Infix/FilterExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Infix\\FunctionExpressionParser' => $vendorDir . '/twig/twig/src/ExpressionParser/Infix/FunctionExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Infix\\IsExpressionParser' => $vendorDir . '/twig/twig/src/ExpressionParser/Infix/IsExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Infix\\IsNotExpressionParser' => $vendorDir . '/twig/twig/src/ExpressionParser/Infix/IsNotExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Infix\\SquareBracketExpressionParser' => $vendorDir . '/twig/twig/src/ExpressionParser/Infix/SquareBracketExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\PrecedenceChange' => $vendorDir . '/twig/twig/src/ExpressionParser/PrecedenceChange.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\PrefixExpressionParserInterface' => $vendorDir . '/twig/twig/src/ExpressionParser/PrefixExpressionParserInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Prefix\\GroupingExpressionParser' => $vendorDir . '/twig/twig/src/ExpressionParser/Prefix/GroupingExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Prefix\\LiteralExpressionParser' => $vendorDir . '/twig/twig/src/ExpressionParser/Prefix/LiteralExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Prefix\\UnaryOperatorExpressionParser' => $vendorDir . '/twig/twig/src/ExpressionParser/Prefix/UnaryOperatorExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExtensionSet' => $vendorDir . '/twig/twig/src/ExtensionSet.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\AbstractExtension' => $vendorDir . '/twig/twig/src/Extension/AbstractExtension.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\AttributeExtension' => $vendorDir . '/twig/twig/src/Extension/AttributeExtension.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\CoreExtension' => $vendorDir . '/twig/twig/src/Extension/CoreExtension.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\DebugExtension' => $vendorDir . '/twig/twig/src/Extension/DebugExtension.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\EscaperExtension' => $vendorDir . '/twig/twig/src/Extension/EscaperExtension.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\ExtensionInterface' => $vendorDir . '/twig/twig/src/Extension/ExtensionInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\GlobalsInterface' => $vendorDir . '/twig/twig/src/Extension/GlobalsInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\LastModifiedExtensionInterface' => $vendorDir . '/twig/twig/src/Extension/LastModifiedExtensionInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\OptimizerExtension' => $vendorDir . '/twig/twig/src/Extension/OptimizerExtension.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\ProfilerExtension' => $vendorDir . '/twig/twig/src/Extension/ProfilerExtension.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\RuntimeExtensionInterface' => $vendorDir . '/twig/twig/src/Extension/RuntimeExtensionInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\SandboxExtension' => $vendorDir . '/twig/twig/src/Extension/SandboxExtension.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\StagingExtension' => $vendorDir . '/twig/twig/src/Extension/StagingExtension.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\StringLoaderExtension' => $vendorDir . '/twig/twig/src/Extension/StringLoaderExtension.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\YieldNotReadyExtension' => $vendorDir . '/twig/twig/src/Extension/YieldNotReadyExtension.php', 'OCA\\Libresign\\Vendor\\Twig\\FileExtensionEscapingStrategy' => $vendorDir . '/twig/twig/src/FileExtensionEscapingStrategy.php', 'OCA\\Libresign\\Vendor\\Twig\\Lexer' => $vendorDir . '/twig/twig/src/Lexer.php', 'OCA\\Libresign\\Vendor\\Twig\\Loader\\ArrayLoader' => $vendorDir . '/twig/twig/src/Loader/ArrayLoader.php', 'OCA\\Libresign\\Vendor\\Twig\\Loader\\ChainLoader' => $vendorDir . '/twig/twig/src/Loader/ChainLoader.php', 'OCA\\Libresign\\Vendor\\Twig\\Loader\\FilesystemLoader' => $vendorDir . '/twig/twig/src/Loader/FilesystemLoader.php', 'OCA\\Libresign\\Vendor\\Twig\\Loader\\LoaderInterface' => $vendorDir . '/twig/twig/src/Loader/LoaderInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Markup' => $vendorDir . '/twig/twig/src/Markup.php', 'OCA\\Libresign\\Vendor\\Twig\\NodeTraverser' => $vendorDir . '/twig/twig/src/NodeTraverser.php', 'OCA\\Libresign\\Vendor\\Twig\\NodeVisitor\\AbstractNodeVisitor' => $vendorDir . '/twig/twig/src/NodeVisitor/AbstractNodeVisitor.php', 'OCA\\Libresign\\Vendor\\Twig\\NodeVisitor\\EscaperNodeVisitor' => $vendorDir . '/twig/twig/src/NodeVisitor/EscaperNodeVisitor.php', 'OCA\\Libresign\\Vendor\\Twig\\NodeVisitor\\NodeVisitorInterface' => $vendorDir . '/twig/twig/src/NodeVisitor/NodeVisitorInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\NodeVisitor\\OptimizerNodeVisitor' => $vendorDir . '/twig/twig/src/NodeVisitor/OptimizerNodeVisitor.php', 'OCA\\Libresign\\Vendor\\Twig\\NodeVisitor\\SafeAnalysisNodeVisitor' => $vendorDir . '/twig/twig/src/NodeVisitor/SafeAnalysisNodeVisitor.php', 'OCA\\Libresign\\Vendor\\Twig\\NodeVisitor\\SandboxNodeVisitor' => $vendorDir . '/twig/twig/src/NodeVisitor/SandboxNodeVisitor.php', 'OCA\\Libresign\\Vendor\\Twig\\NodeVisitor\\YieldNotReadyNodeVisitor' => $vendorDir . '/twig/twig/src/NodeVisitor/YieldNotReadyNodeVisitor.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\AutoEscapeNode' => $vendorDir . '/twig/twig/src/Node/AutoEscapeNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\BlockNode' => $vendorDir . '/twig/twig/src/Node/BlockNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\BlockReferenceNode' => $vendorDir . '/twig/twig/src/Node/BlockReferenceNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\BodyNode' => $vendorDir . '/twig/twig/src/Node/BodyNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\CaptureNode' => $vendorDir . '/twig/twig/src/Node/CaptureNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\CheckSecurityCallNode' => $vendorDir . '/twig/twig/src/Node/CheckSecurityCallNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\CheckSecurityNode' => $vendorDir . '/twig/twig/src/Node/CheckSecurityNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\CheckToStringNode' => $vendorDir . '/twig/twig/src/Node/CheckToStringNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\DeprecatedNode' => $vendorDir . '/twig/twig/src/Node/DeprecatedNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\DoNode' => $vendorDir . '/twig/twig/src/Node/DoNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\EmbedNode' => $vendorDir . '/twig/twig/src/Node/EmbedNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\EmptyNode' => $vendorDir . '/twig/twig/src/Node/EmptyNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\AbstractExpression' => $vendorDir . '/twig/twig/src/Node/Expression/AbstractExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\ArrayExpression' => $vendorDir . '/twig/twig/src/Node/Expression/ArrayExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\ArrowFunctionExpression' => $vendorDir . '/twig/twig/src/Node/Expression/ArrowFunctionExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\AssignNameExpression' => $vendorDir . '/twig/twig/src/Node/Expression/AssignNameExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\AbstractBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/AbstractBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\AddBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/AddBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\AndBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/AndBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\BinaryInterface' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/BinaryInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\BitwiseAndBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/BitwiseAndBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\BitwiseOrBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/BitwiseOrBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\BitwiseXorBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/BitwiseXorBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\ConcatBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/ConcatBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\DivBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/DivBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\ElvisBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/ElvisBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\EndsWithBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/EndsWithBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\EqualBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/EqualBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\FloorDivBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/FloorDivBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\GreaterBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/GreaterBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\GreaterEqualBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/GreaterEqualBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\HasEveryBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/HasEveryBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\HasSomeBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/HasSomeBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\InBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/InBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\LessBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/LessBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\LessEqualBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/LessEqualBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\MatchesBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/MatchesBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\ModBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/ModBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\MulBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/MulBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\NotEqualBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/NotEqualBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\NotInBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/NotInBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\NullCoalesceBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/NullCoalesceBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\OrBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/OrBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\PowerBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/PowerBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\RangeBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/RangeBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\SpaceshipBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/SpaceshipBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\StartsWithBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/StartsWithBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\SubBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/SubBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\XorBinary' => $vendorDir . '/twig/twig/src/Node/Expression/Binary/XorBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\BlockReferenceExpression' => $vendorDir . '/twig/twig/src/Node/Expression/BlockReferenceExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\CallExpression' => $vendorDir . '/twig/twig/src/Node/Expression/CallExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\ConditionalExpression' => $vendorDir . '/twig/twig/src/Node/Expression/ConditionalExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\ConstantExpression' => $vendorDir . '/twig/twig/src/Node/Expression/ConstantExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\FilterExpression' => $vendorDir . '/twig/twig/src/Node/Expression/FilterExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Filter\\DefaultFilter' => $vendorDir . '/twig/twig/src/Node/Expression/Filter/DefaultFilter.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Filter\\RawFilter' => $vendorDir . '/twig/twig/src/Node/Expression/Filter/RawFilter.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\FunctionExpression' => $vendorDir . '/twig/twig/src/Node/Expression/FunctionExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\FunctionNode\\EnumCasesFunction' => $vendorDir . '/twig/twig/src/Node/Expression/FunctionNode/EnumCasesFunction.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\FunctionNode\\EnumFunction' => $vendorDir . '/twig/twig/src/Node/Expression/FunctionNode/EnumFunction.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\GetAttrExpression' => $vendorDir . '/twig/twig/src/Node/Expression/GetAttrExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\InlinePrint' => $vendorDir . '/twig/twig/src/Node/Expression/InlinePrint.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\ListExpression' => $vendorDir . '/twig/twig/src/Node/Expression/ListExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\MacroReferenceExpression' => $vendorDir . '/twig/twig/src/Node/Expression/MacroReferenceExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\MethodCallExpression' => $vendorDir . '/twig/twig/src/Node/Expression/MethodCallExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\NameExpression' => $vendorDir . '/twig/twig/src/Node/Expression/NameExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\NullCoalesceExpression' => $vendorDir . '/twig/twig/src/Node/Expression/NullCoalesceExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\OperatorEscapeInterface' => $vendorDir . '/twig/twig/src/Node/Expression/OperatorEscapeInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\ParentExpression' => $vendorDir . '/twig/twig/src/Node/Expression/ParentExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\ReturnArrayInterface' => $vendorDir . '/twig/twig/src/Node/Expression/ReturnArrayInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\ReturnBoolInterface' => $vendorDir . '/twig/twig/src/Node/Expression/ReturnBoolInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\ReturnNumberInterface' => $vendorDir . '/twig/twig/src/Node/Expression/ReturnNumberInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\ReturnPrimitiveTypeInterface' => $vendorDir . '/twig/twig/src/Node/Expression/ReturnPrimitiveTypeInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\ReturnStringInterface' => $vendorDir . '/twig/twig/src/Node/Expression/ReturnStringInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\SupportDefinedTestDeprecationTrait' => $vendorDir . '/twig/twig/src/Node/Expression/SupportDefinedTestDeprecationTrait.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\SupportDefinedTestInterface' => $vendorDir . '/twig/twig/src/Node/Expression/SupportDefinedTestInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\SupportDefinedTestTrait' => $vendorDir . '/twig/twig/src/Node/Expression/SupportDefinedTestTrait.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\TempNameExpression' => $vendorDir . '/twig/twig/src/Node/Expression/TempNameExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Ternary\\ConditionalTernary' => $vendorDir . '/twig/twig/src/Node/Expression/Ternary/ConditionalTernary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\TestExpression' => $vendorDir . '/twig/twig/src/Node/Expression/TestExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Test\\ConstantTest' => $vendorDir . '/twig/twig/src/Node/Expression/Test/ConstantTest.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Test\\DefinedTest' => $vendorDir . '/twig/twig/src/Node/Expression/Test/DefinedTest.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Test\\DivisiblebyTest' => $vendorDir . '/twig/twig/src/Node/Expression/Test/DivisiblebyTest.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Test\\EvenTest' => $vendorDir . '/twig/twig/src/Node/Expression/Test/EvenTest.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Test\\NullTest' => $vendorDir . '/twig/twig/src/Node/Expression/Test/NullTest.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Test\\OddTest' => $vendorDir . '/twig/twig/src/Node/Expression/Test/OddTest.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Test\\SameasTest' => $vendorDir . '/twig/twig/src/Node/Expression/Test/SameasTest.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Test\\TrueTest' => $vendorDir . '/twig/twig/src/Node/Expression/Test/TrueTest.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Unary\\AbstractUnary' => $vendorDir . '/twig/twig/src/Node/Expression/Unary/AbstractUnary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Unary\\NegUnary' => $vendorDir . '/twig/twig/src/Node/Expression/Unary/NegUnary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Unary\\NotUnary' => $vendorDir . '/twig/twig/src/Node/Expression/Unary/NotUnary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Unary\\PosUnary' => $vendorDir . '/twig/twig/src/Node/Expression/Unary/PosUnary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Unary\\SpreadUnary' => $vendorDir . '/twig/twig/src/Node/Expression/Unary/SpreadUnary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Unary\\StringCastUnary' => $vendorDir . '/twig/twig/src/Node/Expression/Unary/StringCastUnary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Unary\\UnaryInterface' => $vendorDir . '/twig/twig/src/Node/Expression/Unary/UnaryInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Variable\\AssignContextVariable' => $vendorDir . '/twig/twig/src/Node/Expression/Variable/AssignContextVariable.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Variable\\AssignTemplateVariable' => $vendorDir . '/twig/twig/src/Node/Expression/Variable/AssignTemplateVariable.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Variable\\ContextVariable' => $vendorDir . '/twig/twig/src/Node/Expression/Variable/ContextVariable.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Variable\\LocalVariable' => $vendorDir . '/twig/twig/src/Node/Expression/Variable/LocalVariable.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Variable\\TemplateVariable' => $vendorDir . '/twig/twig/src/Node/Expression/Variable/TemplateVariable.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\VariadicExpression' => $vendorDir . '/twig/twig/src/Node/Expression/VariadicExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\FlushNode' => $vendorDir . '/twig/twig/src/Node/FlushNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\ForElseNode' => $vendorDir . '/twig/twig/src/Node/ForElseNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\ForLoopNode' => $vendorDir . '/twig/twig/src/Node/ForLoopNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\ForNode' => $vendorDir . '/twig/twig/src/Node/ForNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\IfNode' => $vendorDir . '/twig/twig/src/Node/IfNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\ImportNode' => $vendorDir . '/twig/twig/src/Node/ImportNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\IncludeNode' => $vendorDir . '/twig/twig/src/Node/IncludeNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\MacroNode' => $vendorDir . '/twig/twig/src/Node/MacroNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\ModuleNode' => $vendorDir . '/twig/twig/src/Node/ModuleNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\NameDeprecation' => $vendorDir . '/twig/twig/src/Node/NameDeprecation.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Node' => $vendorDir . '/twig/twig/src/Node/Node.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\NodeCaptureInterface' => $vendorDir . '/twig/twig/src/Node/NodeCaptureInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\NodeOutputInterface' => $vendorDir . '/twig/twig/src/Node/NodeOutputInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Nodes' => $vendorDir . '/twig/twig/src/Node/Nodes.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\PrintNode' => $vendorDir . '/twig/twig/src/Node/PrintNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\SandboxNode' => $vendorDir . '/twig/twig/src/Node/SandboxNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\SetNode' => $vendorDir . '/twig/twig/src/Node/SetNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\TextNode' => $vendorDir . '/twig/twig/src/Node/TextNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\TypesNode' => $vendorDir . '/twig/twig/src/Node/TypesNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\WithNode' => $vendorDir . '/twig/twig/src/Node/WithNode.php', 'OCA\\Libresign\\Vendor\\Twig\\OperatorPrecedenceChange' => $vendorDir . '/twig/twig/src/OperatorPrecedenceChange.php', 'OCA\\Libresign\\Vendor\\Twig\\Parser' => $vendorDir . '/twig/twig/src/Parser.php', 'OCA\\Libresign\\Vendor\\Twig\\Profiler\\Dumper\\BaseDumper' => $vendorDir . '/twig/twig/src/Profiler/Dumper/BaseDumper.php', 'OCA\\Libresign\\Vendor\\Twig\\Profiler\\Dumper\\BlackfireDumper' => $vendorDir . '/twig/twig/src/Profiler/Dumper/BlackfireDumper.php', 'OCA\\Libresign\\Vendor\\Twig\\Profiler\\Dumper\\HtmlDumper' => $vendorDir . '/twig/twig/src/Profiler/Dumper/HtmlDumper.php', 'OCA\\Libresign\\Vendor\\Twig\\Profiler\\Dumper\\TextDumper' => $vendorDir . '/twig/twig/src/Profiler/Dumper/TextDumper.php', 'OCA\\Libresign\\Vendor\\Twig\\Profiler\\NodeVisitor\\ProfilerNodeVisitor' => $vendorDir . '/twig/twig/src/Profiler/NodeVisitor/ProfilerNodeVisitor.php', 'OCA\\Libresign\\Vendor\\Twig\\Profiler\\Node\\EnterProfileNode' => $vendorDir . '/twig/twig/src/Profiler/Node/EnterProfileNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Profiler\\Node\\LeaveProfileNode' => $vendorDir . '/twig/twig/src/Profiler/Node/LeaveProfileNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Profiler\\Profile' => $vendorDir . '/twig/twig/src/Profiler/Profile.php', 'OCA\\Libresign\\Vendor\\Twig\\RuntimeLoader\\ContainerRuntimeLoader' => $vendorDir . '/twig/twig/src/RuntimeLoader/ContainerRuntimeLoader.php', 'OCA\\Libresign\\Vendor\\Twig\\RuntimeLoader\\FactoryRuntimeLoader' => $vendorDir . '/twig/twig/src/RuntimeLoader/FactoryRuntimeLoader.php', 'OCA\\Libresign\\Vendor\\Twig\\RuntimeLoader\\RuntimeLoaderInterface' => $vendorDir . '/twig/twig/src/RuntimeLoader/RuntimeLoaderInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Runtime\\EscaperRuntime' => $vendorDir . '/twig/twig/src/Runtime/EscaperRuntime.php', 'OCA\\Libresign\\Vendor\\Twig\\Sandbox\\SecurityError' => $vendorDir . '/twig/twig/src/Sandbox/SecurityError.php', 'OCA\\Libresign\\Vendor\\Twig\\Sandbox\\SecurityNotAllowedFilterError' => $vendorDir . '/twig/twig/src/Sandbox/SecurityNotAllowedFilterError.php', 'OCA\\Libresign\\Vendor\\Twig\\Sandbox\\SecurityNotAllowedFunctionError' => $vendorDir . '/twig/twig/src/Sandbox/SecurityNotAllowedFunctionError.php', 'OCA\\Libresign\\Vendor\\Twig\\Sandbox\\SecurityNotAllowedMethodError' => $vendorDir . '/twig/twig/src/Sandbox/SecurityNotAllowedMethodError.php', 'OCA\\Libresign\\Vendor\\Twig\\Sandbox\\SecurityNotAllowedPropertyError' => $vendorDir . '/twig/twig/src/Sandbox/SecurityNotAllowedPropertyError.php', 'OCA\\Libresign\\Vendor\\Twig\\Sandbox\\SecurityNotAllowedTagError' => $vendorDir . '/twig/twig/src/Sandbox/SecurityNotAllowedTagError.php', 'OCA\\Libresign\\Vendor\\Twig\\Sandbox\\SecurityPolicy' => $vendorDir . '/twig/twig/src/Sandbox/SecurityPolicy.php', 'OCA\\Libresign\\Vendor\\Twig\\Sandbox\\SecurityPolicyInterface' => $vendorDir . '/twig/twig/src/Sandbox/SecurityPolicyInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Sandbox\\SourcePolicyInterface' => $vendorDir . '/twig/twig/src/Sandbox/SourcePolicyInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Source' => $vendorDir . '/twig/twig/src/Source.php', 'OCA\\Libresign\\Vendor\\Twig\\Template' => $vendorDir . '/twig/twig/src/Template.php', 'OCA\\Libresign\\Vendor\\Twig\\TemplateWrapper' => $vendorDir . '/twig/twig/src/TemplateWrapper.php', 'OCA\\Libresign\\Vendor\\Twig\\Test\\IntegrationTestCase' => $vendorDir . '/twig/twig/src/Test/IntegrationTestCase.php', 'OCA\\Libresign\\Vendor\\Twig\\Test\\NodeTestCase' => $vendorDir . '/twig/twig/src/Test/NodeTestCase.php', 'OCA\\Libresign\\Vendor\\Twig\\Token' => $vendorDir . '/twig/twig/src/Token.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\AbstractTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/AbstractTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\ApplyTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/ApplyTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\AutoEscapeTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/AutoEscapeTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\BlockTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/BlockTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\DeprecatedTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/DeprecatedTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\DoTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/DoTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\EmbedTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/EmbedTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\ExtendsTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/ExtendsTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\FlushTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/FlushTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\ForTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/ForTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\FromTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/FromTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\GuardTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/GuardTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\IfTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/IfTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\ImportTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/ImportTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\IncludeTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/IncludeTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\MacroTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/MacroTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\SandboxTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/SandboxTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\SetTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/SetTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\TokenParserInterface' => $vendorDir . '/twig/twig/src/TokenParser/TokenParserInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\TypesTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/TypesTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\UseTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/UseTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\WithTokenParser' => $vendorDir . '/twig/twig/src/TokenParser/WithTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenStream' => $vendorDir . '/twig/twig/src/TokenStream.php', 'OCA\\Libresign\\Vendor\\Twig\\TwigCallableInterface' => $vendorDir . '/twig/twig/src/TwigCallableInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\TwigFilter' => $vendorDir . '/twig/twig/src/TwigFilter.php', 'OCA\\Libresign\\Vendor\\Twig\\TwigFunction' => $vendorDir . '/twig/twig/src/TwigFunction.php', 'OCA\\Libresign\\Vendor\\Twig\\TwigTest' => $vendorDir . '/twig/twig/src/TwigTest.php', 'OCA\\Libresign\\Vendor\\Twig\\Util\\CallableArgumentsExtractor' => $vendorDir . '/twig/twig/src/Util/CallableArgumentsExtractor.php', 'OCA\\Libresign\\Vendor\\Twig\\Util\\DeprecationCollector' => $vendorDir . '/twig/twig/src/Util/DeprecationCollector.php', 'OCA\\Libresign\\Vendor\\Twig\\Util\\ReflectionCallable' => $vendorDir . '/twig/twig/src/Util/ReflectionCallable.php', 'OCA\\Libresign\\Vendor\\Twig\\Util\\TemplateDirIterator' => $vendorDir . '/twig/twig/src/Util/TemplateDirIterator.php', 'OCA\\Libresign\\Vendor\\Wobeto\\EmailBlur\\Blur' => $vendorDir . '/wobeto/email-blur/Wobeto/EmailBlur/Blur.php', 'OCA\\Libresign\\Vendor\\mikehaertl\\pdftk\\Command' => $vendorDir . '/mikehaertl/php-pdftk/src/Command.php', 'OCA\\Libresign\\Vendor\\mikehaertl\\pdftk\\DataFields' => $vendorDir . '/mikehaertl/php-pdftk/src/DataFields.php', 'OCA\\Libresign\\Vendor\\mikehaertl\\pdftk\\FdfFile' => $vendorDir . '/mikehaertl/php-pdftk/src/FdfFile.php', 'OCA\\Libresign\\Vendor\\mikehaertl\\pdftk\\InfoFields' => $vendorDir . '/mikehaertl/php-pdftk/src/InfoFields.php', 'OCA\\Libresign\\Vendor\\mikehaertl\\pdftk\\InfoFile' => $vendorDir . '/mikehaertl/php-pdftk/src/InfoFile.php', 'OCA\\Libresign\\Vendor\\mikehaertl\\pdftk\\Pdf' => $vendorDir . '/mikehaertl/php-pdftk/src/Pdf.php', 'OCA\\Libresign\\Vendor\\mikehaertl\\pdftk\\XfdfFile' => $vendorDir . '/mikehaertl/php-pdftk/src/XfdfFile.php', 'OCA\\Libresign\\Vendor\\mikehaertl\\shellcommand\\Command' => $vendorDir . '/mikehaertl/php-shellcommand/src/Command.php', 'OCA\\Libresign\\Vendor\\mikehaertl\\tmp\\File' => $vendorDir . '/mikehaertl/php-tmpfile/src/File.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\FpdfTpl' => $vendorDir . '/setasign/fpdi/src/FpdfTpl.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\FpdfTplTrait' => $vendorDir . '/setasign/fpdi/src/FpdfTplTrait.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\FpdfTrait' => $vendorDir . '/setasign/fpdi/src/FpdfTrait.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\Fpdi' => $vendorDir . '/setasign/fpdi/src/Fpdi.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\FpdiException' => $vendorDir . '/setasign/fpdi/src/FpdiException.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\FpdiTrait' => $vendorDir . '/setasign/fpdi/src/FpdiTrait.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\GraphicsState' => $vendorDir . '/setasign/fpdi/src/GraphicsState.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\Math\\Matrix' => $vendorDir . '/setasign/fpdi/src/Math/Matrix.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\Math\\Vector' => $vendorDir . '/setasign/fpdi/src/Math/Vector.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\CrossReference\\AbstractReader' => $vendorDir . '/setasign/fpdi/src/PdfParser/CrossReference/AbstractReader.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\CrossReference\\CrossReference' => $vendorDir . '/setasign/fpdi/src/PdfParser/CrossReference/CrossReference.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\CrossReference\\CrossReferenceException' => $vendorDir . '/setasign/fpdi/src/PdfParser/CrossReference/CrossReferenceException.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\CrossReference\\FixedReader' => $vendorDir . '/setasign/fpdi/src/PdfParser/CrossReference/FixedReader.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\CrossReference\\LineReader' => $vendorDir . '/setasign/fpdi/src/PdfParser/CrossReference/LineReader.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\CrossReference\\ReaderInterface' => $vendorDir . '/setasign/fpdi/src/PdfParser/CrossReference/ReaderInterface.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Filter\\Ascii85' => $vendorDir . '/setasign/fpdi/src/PdfParser/Filter/Ascii85.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Filter\\Ascii85Exception' => $vendorDir . '/setasign/fpdi/src/PdfParser/Filter/Ascii85Exception.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Filter\\AsciiHex' => $vendorDir . '/setasign/fpdi/src/PdfParser/Filter/AsciiHex.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Filter\\FilterException' => $vendorDir . '/setasign/fpdi/src/PdfParser/Filter/FilterException.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Filter\\FilterInterface' => $vendorDir . '/setasign/fpdi/src/PdfParser/Filter/FilterInterface.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Filter\\Flate' => $vendorDir . '/setasign/fpdi/src/PdfParser/Filter/Flate.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Filter\\FlateException' => $vendorDir . '/setasign/fpdi/src/PdfParser/Filter/FlateException.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Filter\\Lzw' => $vendorDir . '/setasign/fpdi/src/PdfParser/Filter/Lzw.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Filter\\LzwException' => $vendorDir . '/setasign/fpdi/src/PdfParser/Filter/LzwException.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\PdfParser' => $vendorDir . '/setasign/fpdi/src/PdfParser/PdfParser.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\PdfParserException' => $vendorDir . '/setasign/fpdi/src/PdfParser/PdfParserException.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\StreamReader' => $vendorDir . '/setasign/fpdi/src/PdfParser/StreamReader.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Tokenizer' => $vendorDir . '/setasign/fpdi/src/PdfParser/Tokenizer.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfArray' => $vendorDir . '/setasign/fpdi/src/PdfParser/Type/PdfArray.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfBoolean' => $vendorDir . '/setasign/fpdi/src/PdfParser/Type/PdfBoolean.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfDictionary' => $vendorDir . '/setasign/fpdi/src/PdfParser/Type/PdfDictionary.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfHexString' => $vendorDir . '/setasign/fpdi/src/PdfParser/Type/PdfHexString.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfIndirectObject' => $vendorDir . '/setasign/fpdi/src/PdfParser/Type/PdfIndirectObject.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfIndirectObjectReference' => $vendorDir . '/setasign/fpdi/src/PdfParser/Type/PdfIndirectObjectReference.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfName' => $vendorDir . '/setasign/fpdi/src/PdfParser/Type/PdfName.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfNull' => $vendorDir . '/setasign/fpdi/src/PdfParser/Type/PdfNull.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfNumeric' => $vendorDir . '/setasign/fpdi/src/PdfParser/Type/PdfNumeric.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfStream' => $vendorDir . '/setasign/fpdi/src/PdfParser/Type/PdfStream.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfString' => $vendorDir . '/setasign/fpdi/src/PdfParser/Type/PdfString.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfToken' => $vendorDir . '/setasign/fpdi/src/PdfParser/Type/PdfToken.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfType' => $vendorDir . '/setasign/fpdi/src/PdfParser/Type/PdfType.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfTypeException' => $vendorDir . '/setasign/fpdi/src/PdfParser/Type/PdfTypeException.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfReader\\DataStructure\\Rectangle' => $vendorDir . '/setasign/fpdi/src/PdfReader/DataStructure/Rectangle.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfReader\\Page' => $vendorDir . '/setasign/fpdi/src/PdfReader/Page.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfReader\\PageBoundaries' => $vendorDir . '/setasign/fpdi/src/PdfReader/PageBoundaries.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfReader\\PdfReader' => $vendorDir . '/setasign/fpdi/src/PdfReader/PdfReader.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfReader\\PdfReaderException' => $vendorDir . '/setasign/fpdi/src/PdfReader/PdfReaderException.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\TcpdfFpdi' => $vendorDir . '/setasign/fpdi/src/TcpdfFpdi.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\Tcpdf\\Fpdi' => $vendorDir . '/setasign/fpdi/src/Tcpdf/Fpdi.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\Tfpdf\\FpdfTpl' => $vendorDir . '/setasign/fpdi/src/Tfpdf/FpdfTpl.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\Tfpdf\\Fpdi' => $vendorDir . '/setasign/fpdi/src/Tfpdf/Fpdi.php'); diff --git a/composer/composer/autoload_files.php b/composer/composer/autoload_files.php index f46c158..c4cb918 100644 --- a/composer/composer/autoload_files.php +++ b/composer/composer/autoload_files.php @@ -5,4 +5,4 @@ // autoload_files.php @generated by Composer $vendorDir = \dirname(__DIR__); $baseDir = \dirname($vendorDir); -return array('6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php', '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php', '6124b4c8570aa390c21fafd04a26c69f' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php', '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php', 'db356362850385d08a5381de2638b5fd' => $vendorDir . '/mpdf/mpdf/src/functions.php', 'decc78cc4436b1292c6c0d151b19445c' => $vendorDir . '/phpseclib/phpseclib/phpseclib/bootstrap.php', '89efb1254ef2d1c5d80096acd12c4098' => $vendorDir . '/twig/twig/src/Resources/core.php', 'ffecb95d45175fd40f75be8a23b34f90' => $vendorDir . '/twig/twig/src/Resources/debug.php', 'c7baa00073ee9c61edf148c51917cfb4' => $vendorDir . '/twig/twig/src/Resources/escaper.php', 'f844ccf1d25df8663951193c3fc307c8' => $vendorDir . '/twig/twig/src/Resources/string_loader.php'); +return array('6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php', '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php', '6124b4c8570aa390c21fafd04a26c69f' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php', '320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php', 'db356362850385d08a5381de2638b5fd' => $vendorDir . '/mpdf/mpdf/src/functions.php', '89efb1254ef2d1c5d80096acd12c4098' => $vendorDir . '/twig/twig/src/Resources/core.php', 'ffecb95d45175fd40f75be8a23b34f90' => $vendorDir . '/twig/twig/src/Resources/debug.php', 'c7baa00073ee9c61edf148c51917cfb4' => $vendorDir . '/twig/twig/src/Resources/escaper.php', 'f844ccf1d25df8663951193c3fc307c8' => $vendorDir . '/twig/twig/src/Resources/string_loader.php'); diff --git a/composer/composer/autoload_psr4.php b/composer/composer/autoload_psr4.php index 6b29fb1..be27f00 100644 --- a/composer/composer/autoload_psr4.php +++ b/composer/composer/autoload_psr4.php @@ -5,4 +5,4 @@ // autoload_psr4.php @generated by Composer $vendorDir = \dirname(__DIR__); $baseDir = \dirname($vendorDir); -return array('setasign\\Fpdi\\' => array($vendorDir . '/setasign/fpdi/src'), 'phpseclib3\\' => array($vendorDir . '/phpseclib/phpseclib/phpseclib'), 'mikehaertl\\tmp\\' => array($vendorDir . '/mikehaertl/php-tmpfile/src'), 'mikehaertl\\shellcommand\\' => array($vendorDir . '/mikehaertl/php-shellcommand/src'), 'mikehaertl\\pdftk\\' => array($vendorDir . '/mikehaertl/php-pdftk/src'), 'Wobeto\\EmailBlur\\' => array($vendorDir . '/wobeto/email-blur/Wobeto/EmailBlur'), 'Twig\\' => array($vendorDir . '/twig/twig/src'), 'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'), 'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'), 'Psr\\Log\\' => array($vendorDir . '/psr/log/src'), 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'), 'ParagonIE\\ConstantTime\\' => array($vendorDir . '/paragonie/constant_time_encoding/src'), 'Pagerfanta\\Twig\\' => array($vendorDir . '/pagerfanta/pagerfanta/lib/Twig'), 'Pagerfanta\\Solarium\\' => array($vendorDir . '/pagerfanta/pagerfanta/lib/Adapter/Solarium'), 'Pagerfanta\\Elastica\\' => array($vendorDir . '/pagerfanta/pagerfanta/lib/Adapter/Elastica'), 'Pagerfanta\\Doctrine\\PHPCRODM\\' => array($vendorDir . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/PHPCRODM'), 'Pagerfanta\\Doctrine\\ORM\\' => array($vendorDir . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/ORM'), 'Pagerfanta\\Doctrine\\MongoDBODM\\' => array($vendorDir . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/MongoDBODM'), 'Pagerfanta\\Doctrine\\DBAL\\' => array($vendorDir . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/DBAL'), 'Pagerfanta\\Doctrine\\Collections\\' => array($vendorDir . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/Collections'), 'Pagerfanta\\' => array($vendorDir . '/pagerfanta/pagerfanta/lib/Core'), 'OCA\\Libresign\\3rdparty\\' => array($baseDir . '/3rdparty/composer'), 'Mpdf\\PsrLogAwareTrait\\' => array($vendorDir . '/mpdf/psr-log-aware-trait/src'), 'Mpdf\\PsrHttpMessageShim\\' => array($vendorDir . '/mpdf/psr-http-message-shim/src'), 'Mpdf\\' => array($vendorDir . '/mpdf/mpdf/src'), 'LibreSign\\WhatOSAmI\\' => array($vendorDir . '/libresign/whatosami/src'), 'Jeidison\\JSignPDF\\' => array($vendorDir . '/jsignpdf/jsignpdf-php/src'), 'Endroid\\QrCode\\' => array($vendorDir . '/endroid/qr-code/src'), 'DeepCopy\\' => array($vendorDir . '/myclabs/deep-copy/src/DeepCopy'), 'DASPRiD\\Enum\\' => array($vendorDir . '/dasprid/enum/src'), 'Bamarni\\Composer\\Bin\\' => array($vendorDir . '/bamarni/composer-bin-plugin/src'), 'BaconQrCode\\' => array($vendorDir . '/bacon/bacon-qr-code/src')); +return array('setasign\\Fpdi\\' => array($vendorDir . '/setasign/fpdi/src'), 'mikehaertl\\tmp\\' => array($vendorDir . '/mikehaertl/php-tmpfile/src'), 'mikehaertl\\shellcommand\\' => array($vendorDir . '/mikehaertl/php-shellcommand/src'), 'mikehaertl\\pdftk\\' => array($vendorDir . '/mikehaertl/php-pdftk/src'), 'Wobeto\\EmailBlur\\' => array($vendorDir . '/wobeto/email-blur/Wobeto/EmailBlur'), 'Twig\\' => array($vendorDir . '/twig/twig/src'), 'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'), 'Symfony\\Polyfill\\Ctype\\' => array($vendorDir . '/symfony/polyfill-ctype'), 'Psr\\Log\\' => array($vendorDir . '/psr/log/src'), 'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'), 'Pagerfanta\\Twig\\' => array($vendorDir . '/pagerfanta/pagerfanta/lib/Twig'), 'Pagerfanta\\Solarium\\' => array($vendorDir . '/pagerfanta/pagerfanta/lib/Adapter/Solarium'), 'Pagerfanta\\Elastica\\' => array($vendorDir . '/pagerfanta/pagerfanta/lib/Adapter/Elastica'), 'Pagerfanta\\Doctrine\\PHPCRODM\\' => array($vendorDir . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/PHPCRODM'), 'Pagerfanta\\Doctrine\\ORM\\' => array($vendorDir . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/ORM'), 'Pagerfanta\\Doctrine\\MongoDBODM\\' => array($vendorDir . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/MongoDBODM'), 'Pagerfanta\\Doctrine\\DBAL\\' => array($vendorDir . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/DBAL'), 'Pagerfanta\\Doctrine\\Collections\\' => array($vendorDir . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/Collections'), 'Pagerfanta\\' => array($vendorDir . '/pagerfanta/pagerfanta/lib/Core'), 'OCA\\Libresign\\3rdparty\\' => array($baseDir . '/3rdparty/composer'), 'Mpdf\\PsrLogAwareTrait\\' => array($vendorDir . '/mpdf/psr-log-aware-trait/src'), 'Mpdf\\PsrHttpMessageShim\\' => array($vendorDir . '/mpdf/psr-http-message-shim/src'), 'Mpdf\\' => array($vendorDir . '/mpdf/mpdf/src'), 'LibreSign\\WhatOSAmI\\' => array($vendorDir . '/libresign/whatosami/src'), 'Jeidison\\JSignPDF\\' => array($vendorDir . '/jsignpdf/jsignpdf-php/src'), 'Endroid\\QrCode\\' => array($vendorDir . '/endroid/qr-code/src'), 'DeepCopy\\' => array($vendorDir . '/myclabs/deep-copy/src/DeepCopy'), 'DASPRiD\\Enum\\' => array($vendorDir . '/dasprid/enum/src'), 'Bamarni\\Composer\\Bin\\' => array($vendorDir . '/bamarni/composer-bin-plugin/src'), 'BaconQrCode\\' => array($vendorDir . '/bacon/bacon-qr-code/src')); diff --git a/composer/composer/autoload_static.php b/composer/composer/autoload_static.php index fe9feb4..bc17231 100644 --- a/composer/composer/autoload_static.php +++ b/composer/composer/autoload_static.php @@ -6,11 +6,11 @@ /** @internal */ class ComposerStaticInitLibresign { - public static $files = array('6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php', '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php', '6124b4c8570aa390c21fafd04a26c69f' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php', '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php', 'db356362850385d08a5381de2638b5fd' => __DIR__ . '/..' . '/mpdf/mpdf/src/functions.php', 'decc78cc4436b1292c6c0d151b19445c' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/bootstrap.php', '89efb1254ef2d1c5d80096acd12c4098' => __DIR__ . '/..' . '/twig/twig/src/Resources/core.php', 'ffecb95d45175fd40f75be8a23b34f90' => __DIR__ . '/..' . '/twig/twig/src/Resources/debug.php', 'c7baa00073ee9c61edf148c51917cfb4' => __DIR__ . '/..' . '/twig/twig/src/Resources/escaper.php', 'f844ccf1d25df8663951193c3fc307c8' => __DIR__ . '/..' . '/twig/twig/src/Resources/string_loader.php'); - public static $prefixLengthsPsr4 = array('s' => array('setasign\\Fpdi\\' => 14), 'p' => array('phpseclib3\\' => 11), 'm' => array('mikehaertl\\tmp\\' => 15, 'mikehaertl\\shellcommand\\' => 24, 'mikehaertl\\pdftk\\' => 17), 'W' => array('Wobeto\\EmailBlur\\' => 17), 'T' => array('Twig\\' => 5), 'S' => array('Symfony\\Polyfill\\Mbstring\\' => 26, 'Symfony\\Polyfill\\Ctype\\' => 23), 'P' => array('Psr\\Log\\' => 8, 'Psr\\Http\\Message\\' => 17, 'ParagonIE\\ConstantTime\\' => 23, 'Pagerfanta\\Twig\\' => 16, 'Pagerfanta\\Solarium\\' => 20, 'Pagerfanta\\Elastica\\' => 20, 'Pagerfanta\\Doctrine\\PHPCRODM\\' => 29, 'Pagerfanta\\Doctrine\\ORM\\' => 24, 'Pagerfanta\\Doctrine\\MongoDBODM\\' => 31, 'Pagerfanta\\Doctrine\\DBAL\\' => 25, 'Pagerfanta\\Doctrine\\Collections\\' => 32, 'Pagerfanta\\' => 11), 'O' => array('OCA\\Libresign\\3rdparty\\' => 23), 'M' => array('Mpdf\\PsrLogAwareTrait\\' => 22, 'Mpdf\\PsrHttpMessageShim\\' => 24, 'Mpdf\\' => 5), 'L' => array('LibreSign\\WhatOSAmI\\' => 20), 'J' => array('Jeidison\\JSignPDF\\' => 18), 'E' => array('Endroid\\QrCode\\' => 15), 'D' => array('DeepCopy\\' => 9, 'DASPRiD\\Enum\\' => 13), 'B' => array('Bamarni\\Composer\\Bin\\' => 21, 'BaconQrCode\\' => 12)); - public static $prefixDirsPsr4 = array('setasign\\Fpdi\\' => array(0 => __DIR__ . '/..' . '/setasign/fpdi/src'), 'phpseclib3\\' => array(0 => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib'), 'mikehaertl\\tmp\\' => array(0 => __DIR__ . '/..' . '/mikehaertl/php-tmpfile/src'), 'mikehaertl\\shellcommand\\' => array(0 => __DIR__ . '/..' . '/mikehaertl/php-shellcommand/src'), 'mikehaertl\\pdftk\\' => array(0 => __DIR__ . '/..' . '/mikehaertl/php-pdftk/src'), 'Wobeto\\EmailBlur\\' => array(0 => __DIR__ . '/..' . '/wobeto/email-blur/Wobeto/EmailBlur'), 'Twig\\' => array(0 => __DIR__ . '/..' . '/twig/twig/src'), 'Symfony\\Polyfill\\Mbstring\\' => array(0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring'), 'Symfony\\Polyfill\\Ctype\\' => array(0 => __DIR__ . '/..' . '/symfony/polyfill-ctype'), 'Psr\\Log\\' => array(0 => __DIR__ . '/..' . '/psr/log/src'), 'Psr\\Http\\Message\\' => array(0 => __DIR__ . '/..' . '/psr/http-message/src'), 'ParagonIE\\ConstantTime\\' => array(0 => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src'), 'Pagerfanta\\Twig\\' => array(0 => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Twig'), 'Pagerfanta\\Solarium\\' => array(0 => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Adapter/Solarium'), 'Pagerfanta\\Elastica\\' => array(0 => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Adapter/Elastica'), 'Pagerfanta\\Doctrine\\PHPCRODM\\' => array(0 => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/PHPCRODM'), 'Pagerfanta\\Doctrine\\ORM\\' => array(0 => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/ORM'), 'Pagerfanta\\Doctrine\\MongoDBODM\\' => array(0 => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/MongoDBODM'), 'Pagerfanta\\Doctrine\\DBAL\\' => array(0 => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/DBAL'), 'Pagerfanta\\Doctrine\\Collections\\' => array(0 => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/Collections'), 'Pagerfanta\\' => array(0 => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core'), 'OCA\\Libresign\\3rdparty\\' => array(0 => __DIR__ . '/../..' . '/3rdparty/composer'), 'Mpdf\\PsrLogAwareTrait\\' => array(0 => __DIR__ . '/..' . '/mpdf/psr-log-aware-trait/src'), 'Mpdf\\PsrHttpMessageShim\\' => array(0 => __DIR__ . '/..' . '/mpdf/psr-http-message-shim/src'), 'Mpdf\\' => array(0 => __DIR__ . '/..' . '/mpdf/mpdf/src'), 'LibreSign\\WhatOSAmI\\' => array(0 => __DIR__ . '/..' . '/libresign/whatosami/src'), 'Jeidison\\JSignPDF\\' => array(0 => __DIR__ . '/..' . '/jsignpdf/jsignpdf-php/src'), 'Endroid\\QrCode\\' => array(0 => __DIR__ . '/..' . '/endroid/qr-code/src'), 'DeepCopy\\' => array(0 => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy'), 'DASPRiD\\Enum\\' => array(0 => __DIR__ . '/..' . '/dasprid/enum/src'), 'Bamarni\\Composer\\Bin\\' => array(0 => __DIR__ . '/..' . '/bamarni/composer-bin-plugin/src'), 'BaconQrCode\\' => array(0 => __DIR__ . '/..' . '/bacon/bacon-qr-code/src')); + public static $files = array('6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php', '0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php', '6124b4c8570aa390c21fafd04a26c69f' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php', '320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php', 'db356362850385d08a5381de2638b5fd' => __DIR__ . '/..' . '/mpdf/mpdf/src/functions.php', '89efb1254ef2d1c5d80096acd12c4098' => __DIR__ . '/..' . '/twig/twig/src/Resources/core.php', 'ffecb95d45175fd40f75be8a23b34f90' => __DIR__ . '/..' . '/twig/twig/src/Resources/debug.php', 'c7baa00073ee9c61edf148c51917cfb4' => __DIR__ . '/..' . '/twig/twig/src/Resources/escaper.php', 'f844ccf1d25df8663951193c3fc307c8' => __DIR__ . '/..' . '/twig/twig/src/Resources/string_loader.php'); + public static $prefixLengthsPsr4 = array('s' => array('setasign\\Fpdi\\' => 14), 'm' => array('mikehaertl\\tmp\\' => 15, 'mikehaertl\\shellcommand\\' => 24, 'mikehaertl\\pdftk\\' => 17), 'W' => array('Wobeto\\EmailBlur\\' => 17), 'T' => array('Twig\\' => 5), 'S' => array('Symfony\\Polyfill\\Mbstring\\' => 26, 'Symfony\\Polyfill\\Ctype\\' => 23), 'P' => array('Psr\\Log\\' => 8, 'Psr\\Http\\Message\\' => 17, 'Pagerfanta\\Twig\\' => 16, 'Pagerfanta\\Solarium\\' => 20, 'Pagerfanta\\Elastica\\' => 20, 'Pagerfanta\\Doctrine\\PHPCRODM\\' => 29, 'Pagerfanta\\Doctrine\\ORM\\' => 24, 'Pagerfanta\\Doctrine\\MongoDBODM\\' => 31, 'Pagerfanta\\Doctrine\\DBAL\\' => 25, 'Pagerfanta\\Doctrine\\Collections\\' => 32, 'Pagerfanta\\' => 11), 'O' => array('OCA\\Libresign\\3rdparty\\' => 23), 'M' => array('Mpdf\\PsrLogAwareTrait\\' => 22, 'Mpdf\\PsrHttpMessageShim\\' => 24, 'Mpdf\\' => 5), 'L' => array('LibreSign\\WhatOSAmI\\' => 20), 'J' => array('Jeidison\\JSignPDF\\' => 18), 'E' => array('Endroid\\QrCode\\' => 15), 'D' => array('DeepCopy\\' => 9, 'DASPRiD\\Enum\\' => 13), 'B' => array('Bamarni\\Composer\\Bin\\' => 21, 'BaconQrCode\\' => 12)); + public static $prefixDirsPsr4 = array('setasign\\Fpdi\\' => array(0 => __DIR__ . '/..' . '/setasign/fpdi/src'), 'mikehaertl\\tmp\\' => array(0 => __DIR__ . '/..' . '/mikehaertl/php-tmpfile/src'), 'mikehaertl\\shellcommand\\' => array(0 => __DIR__ . '/..' . '/mikehaertl/php-shellcommand/src'), 'mikehaertl\\pdftk\\' => array(0 => __DIR__ . '/..' . '/mikehaertl/php-pdftk/src'), 'Wobeto\\EmailBlur\\' => array(0 => __DIR__ . '/..' . '/wobeto/email-blur/Wobeto/EmailBlur'), 'Twig\\' => array(0 => __DIR__ . '/..' . '/twig/twig/src'), 'Symfony\\Polyfill\\Mbstring\\' => array(0 => __DIR__ . '/..' . '/symfony/polyfill-mbstring'), 'Symfony\\Polyfill\\Ctype\\' => array(0 => __DIR__ . '/..' . '/symfony/polyfill-ctype'), 'Psr\\Log\\' => array(0 => __DIR__ . '/..' . '/psr/log/src'), 'Psr\\Http\\Message\\' => array(0 => __DIR__ . '/..' . '/psr/http-message/src'), 'Pagerfanta\\Twig\\' => array(0 => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Twig'), 'Pagerfanta\\Solarium\\' => array(0 => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Adapter/Solarium'), 'Pagerfanta\\Elastica\\' => array(0 => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Adapter/Elastica'), 'Pagerfanta\\Doctrine\\PHPCRODM\\' => array(0 => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/PHPCRODM'), 'Pagerfanta\\Doctrine\\ORM\\' => array(0 => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/ORM'), 'Pagerfanta\\Doctrine\\MongoDBODM\\' => array(0 => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/MongoDBODM'), 'Pagerfanta\\Doctrine\\DBAL\\' => array(0 => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/DBAL'), 'Pagerfanta\\Doctrine\\Collections\\' => array(0 => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/Collections'), 'Pagerfanta\\' => array(0 => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core'), 'OCA\\Libresign\\3rdparty\\' => array(0 => __DIR__ . '/../..' . '/3rdparty/composer'), 'Mpdf\\PsrLogAwareTrait\\' => array(0 => __DIR__ . '/..' . '/mpdf/psr-log-aware-trait/src'), 'Mpdf\\PsrHttpMessageShim\\' => array(0 => __DIR__ . '/..' . '/mpdf/psr-http-message-shim/src'), 'Mpdf\\' => array(0 => __DIR__ . '/..' . '/mpdf/mpdf/src'), 'LibreSign\\WhatOSAmI\\' => array(0 => __DIR__ . '/..' . '/libresign/whatosami/src'), 'Jeidison\\JSignPDF\\' => array(0 => __DIR__ . '/..' . '/jsignpdf/jsignpdf-php/src'), 'Endroid\\QrCode\\' => array(0 => __DIR__ . '/..' . '/endroid/qr-code/src'), 'DeepCopy\\' => array(0 => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy'), 'DASPRiD\\Enum\\' => array(0 => __DIR__ . '/..' . '/dasprid/enum/src'), 'Bamarni\\Composer\\Bin\\' => array(0 => __DIR__ . '/..' . '/bamarni/composer-bin-plugin/src'), 'BaconQrCode\\' => array(0 => __DIR__ . '/..' . '/bacon/bacon-qr-code/src')); public static $prefixesPsr0 = array('S' => array('Smalot\\PdfParser\\' => array(0 => __DIR__ . '/..' . '/smalot/pdfparser/src'))); - public static $classMap = array('OCA\\Libresign\\Vendor\\BaconQrCode\\Common\\BitArray' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Common/BitArray.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Common\\BitMatrix' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Common/BitMatrix.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Common\\BitUtils' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Common/BitUtils.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Common\\CharacterSetEci' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Common/CharacterSetEci.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Common\\EcBlock' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Common/EcBlock.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Common\\EcBlocks' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Common/EcBlocks.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Common\\ErrorCorrectionLevel' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Common/ErrorCorrectionLevel.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Common\\FormatInformation' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Common/FormatInformation.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Common\\Mode' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Common/Mode.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Common\\ReedSolomonCodec' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Common/ReedSolomonCodec.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Common\\Version' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Common/Version.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Encoder\\BlockPair' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Encoder/BlockPair.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Encoder\\ByteMatrix' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Encoder/ByteMatrix.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Encoder\\Encoder' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Encoder/Encoder.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Encoder\\MaskUtil' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Encoder/MaskUtil.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Encoder\\MatrixUtil' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Encoder/MatrixUtil.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Encoder\\QrCode' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Encoder/QrCode.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Exception/ExceptionInterface.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Exception/InvalidArgumentException.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Exception\\OutOfBoundsException' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Exception/OutOfBoundsException.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Exception\\RuntimeException' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Exception/RuntimeException.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Exception\\UnexpectedValueException' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Exception/UnexpectedValueException.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Exception\\WriterException' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Exception/WriterException.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Color\\Alpha' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Color/Alpha.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Color\\Cmyk' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Color/Cmyk.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Color\\ColorInterface' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Color/ColorInterface.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Color\\Gray' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Color/Gray.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Color\\Rgb' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Color/Rgb.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Eye\\CompositeEye' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Eye/CompositeEye.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Eye\\EyeInterface' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Eye/EyeInterface.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Eye\\ModuleEye' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Eye/ModuleEye.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Eye\\PointyEye' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Eye/PointyEye.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Eye\\SimpleCircleEye' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Eye/SimpleCircleEye.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Eye\\SquareEye' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Eye/SquareEye.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\GDLibRenderer' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/GDLibRenderer.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\ImageRenderer' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/ImageRenderer.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Image\\EpsImageBackEnd' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Image/EpsImageBackEnd.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Image\\ImageBackEndInterface' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Image/ImageBackEndInterface.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Image\\ImagickImageBackEnd' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Image/ImagickImageBackEnd.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Image\\SvgImageBackEnd' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Image/SvgImageBackEnd.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Image\\TransformationMatrix' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Image/TransformationMatrix.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Module\\DotsModule' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Module/DotsModule.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Module\\EdgeIterator\\Edge' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Module/EdgeIterator/Edge.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Module\\EdgeIterator\\EdgeIterator' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Module/EdgeIterator/EdgeIterator.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Module\\ModuleInterface' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Module/ModuleInterface.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Module\\RoundnessModule' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Module/RoundnessModule.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Module\\SquareModule' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Module/SquareModule.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Path\\Close' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Path/Close.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Path\\Curve' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Path/Curve.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Path\\EllipticArc' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Path/EllipticArc.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Path\\Line' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Path/Line.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Path\\Move' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Path/Move.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Path\\OperationInterface' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Path/OperationInterface.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Path\\Path' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Path/Path.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\PlainTextRenderer' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/PlainTextRenderer.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\RendererInterface' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/RendererInterface.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\RendererStyle\\EyeFill' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/RendererStyle/EyeFill.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\RendererStyle\\Fill' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/RendererStyle/Fill.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\RendererStyle\\Gradient' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/RendererStyle/Gradient.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\RendererStyle\\GradientType' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/RendererStyle/GradientType.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\RendererStyle\\RendererStyle' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/RendererStyle/RendererStyle.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Writer' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Writer.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\ApplicationFactory\\FreshInstanceApplicationFactory' => __DIR__ . '/..' . '/bamarni/composer-bin-plugin/src/ApplicationFactory/FreshInstanceApplicationFactory.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\ApplicationFactory\\NamespaceApplicationFactory' => __DIR__ . '/..' . '/bamarni/composer-bin-plugin/src/ApplicationFactory/NamespaceApplicationFactory.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\BamarniBinPlugin' => __DIR__ . '/..' . '/bamarni/composer-bin-plugin/src/BamarniBinPlugin.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\CommandProvider' => __DIR__ . '/..' . '/bamarni/composer-bin-plugin/src/CommandProvider.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\Command\\BinCommand' => __DIR__ . '/..' . '/bamarni/composer-bin-plugin/src/Command/BinCommand.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\Command\\CouldNotCreateNamespaceDir' => __DIR__ . '/..' . '/bamarni/composer-bin-plugin/src/Command/CouldNotCreateNamespaceDir.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\Config\\Config' => __DIR__ . '/..' . '/bamarni/composer-bin-plugin/src/Config/Config.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\Config\\ConfigFactory' => __DIR__ . '/..' . '/bamarni/composer-bin-plugin/src/Config/ConfigFactory.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\Config\\InvalidBamarniComposerExtraConfig' => __DIR__ . '/..' . '/bamarni/composer-bin-plugin/src/Config/InvalidBamarniComposerExtraConfig.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\Input\\BinInputFactory' => __DIR__ . '/..' . '/bamarni/composer-bin-plugin/src/Input/BinInputFactory.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\Input\\InvalidBinInput' => __DIR__ . '/..' . '/bamarni/composer-bin-plugin/src/Input/InvalidBinInput.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\Logger' => __DIR__ . '/..' . '/bamarni/composer-bin-plugin/src/Logger.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\PublicIO' => __DIR__ . '/..' . '/bamarni/composer-bin-plugin/src/PublicIO.php', 'OCA\\Libresign\\Vendor\\Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', 'OCA\\Libresign\\Vendor\\DASPRiD\\Enum\\AbstractEnum' => __DIR__ . '/..' . '/dasprid/enum/src/AbstractEnum.php', 'OCA\\Libresign\\Vendor\\DASPRiD\\Enum\\EnumMap' => __DIR__ . '/..' . '/dasprid/enum/src/EnumMap.php', 'OCA\\Libresign\\Vendor\\DASPRiD\\Enum\\Exception\\CloneNotSupportedException' => __DIR__ . '/..' . '/dasprid/enum/src/Exception/CloneNotSupportedException.php', 'OCA\\Libresign\\Vendor\\DASPRiD\\Enum\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/dasprid/enum/src/Exception/ExceptionInterface.php', 'OCA\\Libresign\\Vendor\\DASPRiD\\Enum\\Exception\\ExpectationException' => __DIR__ . '/..' . '/dasprid/enum/src/Exception/ExpectationException.php', 'OCA\\Libresign\\Vendor\\DASPRiD\\Enum\\Exception\\IllegalArgumentException' => __DIR__ . '/..' . '/dasprid/enum/src/Exception/IllegalArgumentException.php', 'OCA\\Libresign\\Vendor\\DASPRiD\\Enum\\Exception\\MismatchException' => __DIR__ . '/..' . '/dasprid/enum/src/Exception/MismatchException.php', 'OCA\\Libresign\\Vendor\\DASPRiD\\Enum\\Exception\\SerializeNotSupportedException' => __DIR__ . '/..' . '/dasprid/enum/src/Exception/SerializeNotSupportedException.php', 'OCA\\Libresign\\Vendor\\DASPRiD\\Enum\\Exception\\UnserializeNotSupportedException' => __DIR__ . '/..' . '/dasprid/enum/src/Exception/UnserializeNotSupportedException.php', 'OCA\\Libresign\\Vendor\\DASPRiD\\Enum\\NullValue' => __DIR__ . '/..' . '/dasprid/enum/src/NullValue.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\DeepCopy' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/DeepCopy.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Exception\\CloneException' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Exception\\PropertyException' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Exception/PropertyException.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Filter\\ChainableFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/ChainableFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Filter\\Doctrine\\DoctrineCollectionFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Filter\\Doctrine\\DoctrineEmptyCollectionFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Filter\\Doctrine\\DoctrineProxyFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Filter\\Filter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Filter\\KeepFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/KeepFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Filter\\ReplaceFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/ReplaceFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Filter\\SetNullFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Matcher\\Doctrine\\DoctrineProxyMatcher' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Matcher\\Matcher' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Matcher/Matcher.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Matcher\\PropertyMatcher' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyMatcher.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Matcher\\PropertyNameMatcher' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Matcher\\PropertyTypeMatcher' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Reflection\\ReflectionHelper' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\TypeFilter\\Date\\DateIntervalFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\TypeFilter\\Date\\DatePeriodFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DatePeriodFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\TypeFilter\\ReplaceFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\TypeFilter\\ShallowCopyFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\TypeFilter\\Spl\\ArrayObjectFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/ArrayObjectFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\TypeFilter\\Spl\\SplDoublyLinkedList' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\TypeFilter\\Spl\\SplDoublyLinkedListFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedListFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\TypeFilter\\TypeFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\TypeMatcher\\TypeMatcher' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeMatcher/TypeMatcher.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Bacon\\ErrorCorrectionLevelConverter' => __DIR__ . '/..' . '/endroid/qr-code/src/Bacon/ErrorCorrectionLevelConverter.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Bacon\\MatrixFactory' => __DIR__ . '/..' . '/endroid/qr-code/src/Bacon/MatrixFactory.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Builder\\Builder' => __DIR__ . '/..' . '/endroid/qr-code/src/Builder/Builder.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Builder\\BuilderInterface' => __DIR__ . '/..' . '/endroid/qr-code/src/Builder/BuilderInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Builder\\BuilderRegistry' => __DIR__ . '/..' . '/endroid/qr-code/src/Builder/BuilderRegistry.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Builder\\BuilderRegistryInterface' => __DIR__ . '/..' . '/endroid/qr-code/src/Builder/BuilderRegistryInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Color\\Color' => __DIR__ . '/..' . '/endroid/qr-code/src/Color/Color.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Color\\ColorInterface' => __DIR__ . '/..' . '/endroid/qr-code/src/Color/ColorInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Encoding\\Encoding' => __DIR__ . '/..' . '/endroid/qr-code/src/Encoding/Encoding.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Encoding\\EncodingInterface' => __DIR__ . '/..' . '/endroid/qr-code/src/Encoding/EncodingInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\ErrorCorrectionLevel' => __DIR__ . '/..' . '/endroid/qr-code/src/ErrorCorrectionLevel.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Exception\\BlockSizeTooSmallException' => __DIR__ . '/..' . '/endroid/qr-code/src/Exception/BlockSizeTooSmallException.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Exception\\ValidationException' => __DIR__ . '/..' . '/endroid/qr-code/src/Exception/ValidationException.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\ImageData\\LabelImageData' => __DIR__ . '/..' . '/endroid/qr-code/src/ImageData/LabelImageData.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\ImageData\\LogoImageData' => __DIR__ . '/..' . '/endroid/qr-code/src/ImageData/LogoImageData.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Label\\Font\\Font' => __DIR__ . '/..' . '/endroid/qr-code/src/Label/Font/Font.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Label\\Font\\FontInterface' => __DIR__ . '/..' . '/endroid/qr-code/src/Label/Font/FontInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Label\\Font\\OpenSans' => __DIR__ . '/..' . '/endroid/qr-code/src/Label/Font/OpenSans.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Label\\Label' => __DIR__ . '/..' . '/endroid/qr-code/src/Label/Label.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Label\\LabelAlignment' => __DIR__ . '/..' . '/endroid/qr-code/src/Label/LabelAlignment.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Label\\LabelInterface' => __DIR__ . '/..' . '/endroid/qr-code/src/Label/LabelInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Label\\Margin\\Margin' => __DIR__ . '/..' . '/endroid/qr-code/src/Label/Margin/Margin.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Label\\Margin\\MarginInterface' => __DIR__ . '/..' . '/endroid/qr-code/src/Label/Margin/MarginInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Logo\\Logo' => __DIR__ . '/..' . '/endroid/qr-code/src/Logo/Logo.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Logo\\LogoInterface' => __DIR__ . '/..' . '/endroid/qr-code/src/Logo/LogoInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Matrix\\Matrix' => __DIR__ . '/..' . '/endroid/qr-code/src/Matrix/Matrix.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Matrix\\MatrixFactoryInterface' => __DIR__ . '/..' . '/endroid/qr-code/src/Matrix/MatrixFactoryInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Matrix\\MatrixInterface' => __DIR__ . '/..' . '/endroid/qr-code/src/Matrix/MatrixInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\QrCode' => __DIR__ . '/..' . '/endroid/qr-code/src/QrCode.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\QrCodeInterface' => __DIR__ . '/..' . '/endroid/qr-code/src/QrCodeInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\RoundBlockSizeMode' => __DIR__ . '/..' . '/endroid/qr-code/src/RoundBlockSizeMode.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\AbstractGdWriter' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/AbstractGdWriter.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\BinaryWriter' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/BinaryWriter.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\ConsoleWriter' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/ConsoleWriter.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\DebugWriter' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/DebugWriter.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\EpsWriter' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/EpsWriter.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\GifWriter' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/GifWriter.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\PdfWriter' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/PdfWriter.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\PngWriter' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/PngWriter.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\AbstractResult' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/Result/AbstractResult.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\BinaryResult' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/Result/BinaryResult.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\ConsoleResult' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/Result/ConsoleResult.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\DebugResult' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/Result/DebugResult.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\EpsResult' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/Result/EpsResult.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\GdResult' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/Result/GdResult.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\GifResult' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/Result/GifResult.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\PdfResult' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/Result/PdfResult.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\PngResult' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/Result/PngResult.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\ResultInterface' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/Result/ResultInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\SvgResult' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/Result/SvgResult.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\WebPResult' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/Result/WebPResult.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\SvgWriter' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/SvgWriter.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\ValidatingWriterInterface' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/ValidatingWriterInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\WebPWriter' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/WebPWriter.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\WriterInterface' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/WriterInterface.php', 'OCA\\Libresign\\Vendor\\Jeidison\\JSignPDF\\JSignFileService' => __DIR__ . '/..' . '/jsignpdf/jsignpdf-php/src/JSignFileService.php', 'OCA\\Libresign\\Vendor\\Jeidison\\JSignPDF\\JSignPDF' => __DIR__ . '/..' . '/jsignpdf/jsignpdf-php/src/JSignPDF.php', 'OCA\\Libresign\\Vendor\\Jeidison\\JSignPDF\\Runtime\\JSignPdfRuntimeService' => __DIR__ . '/..' . '/jsignpdf/jsignpdf-php/src/Runtime/JSignPdfRuntimeService.php', 'OCA\\Libresign\\Vendor\\Jeidison\\JSignPDF\\Runtime\\JavaRuntimeService' => __DIR__ . '/..' . '/jsignpdf/jsignpdf-php/src/Runtime/JavaRuntimeService.php', 'OCA\\Libresign\\Vendor\\Jeidison\\JSignPDF\\Sign\\JSignParam' => __DIR__ . '/..' . '/jsignpdf/jsignpdf-php/src/Sign/JSignParam.php', 'OCA\\Libresign\\Vendor\\Jeidison\\JSignPDF\\Sign\\JSignService' => __DIR__ . '/..' . '/jsignpdf/jsignpdf-php/src/Sign/JSignService.php', 'OCA\\Libresign\\Vendor\\LibreSign\\WhatOSAmI\\OperatingSystem' => __DIR__ . '/..' . '/libresign/whatosami/src/OperatingSystem.php', 'OCA\\Libresign\\Vendor\\Mpdf\\AssetFetcher' => __DIR__ . '/..' . '/mpdf/mpdf/src/AssetFetcher.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\AbstractBarcode' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/AbstractBarcode.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\BarcodeException' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/BarcodeException.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\BarcodeInterface' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/BarcodeInterface.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\Codabar' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/Codabar.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\Code11' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/Code11.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\Code128' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/Code128.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\Code39' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/Code39.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\Code93' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/Code93.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\EanExt' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/EanExt.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\EanUpc' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/EanUpc.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\I25' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/I25.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\Imb' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/Imb.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\Msi' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/Msi.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\Postnet' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/Postnet.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\Rm4Scc' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/Rm4Scc.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\S25' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/S25.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Cache' => __DIR__ . '/..' . '/mpdf/mpdf/src/Cache.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Color\\ColorConverter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Color/ColorConverter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Color\\ColorModeConverter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Color/ColorModeConverter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Color\\ColorSpaceRestrictor' => __DIR__ . '/..' . '/mpdf/mpdf/src/Color/ColorSpaceRestrictor.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Color\\NamedColors' => __DIR__ . '/..' . '/mpdf/mpdf/src/Color/NamedColors.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Config\\ConfigVariables' => __DIR__ . '/..' . '/mpdf/mpdf/src/Config/ConfigVariables.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Config\\FontVariables' => __DIR__ . '/..' . '/mpdf/mpdf/src/Config/FontVariables.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Container\\ContainerInterface' => __DIR__ . '/..' . '/mpdf/mpdf/src/Container/ContainerInterface.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Container\\NotFoundException' => __DIR__ . '/..' . '/mpdf/mpdf/src/Container/NotFoundException.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Container\\SimpleContainer' => __DIR__ . '/..' . '/mpdf/mpdf/src/Container/SimpleContainer.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Conversion\\DecToAlpha' => __DIR__ . '/..' . '/mpdf/mpdf/src/Conversion/DecToAlpha.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Conversion\\DecToCjk' => __DIR__ . '/..' . '/mpdf/mpdf/src/Conversion/DecToCjk.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Conversion\\DecToHebrew' => __DIR__ . '/..' . '/mpdf/mpdf/src/Conversion/DecToHebrew.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Conversion\\DecToOther' => __DIR__ . '/..' . '/mpdf/mpdf/src/Conversion/DecToOther.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Conversion\\DecToRoman' => __DIR__ . '/..' . '/mpdf/mpdf/src/Conversion/DecToRoman.php', 'OCA\\Libresign\\Vendor\\Mpdf\\CssManager' => __DIR__ . '/..' . '/mpdf/mpdf/src/CssManager.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Css\\Border' => __DIR__ . '/..' . '/mpdf/mpdf/src/Css/Border.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Css\\DefaultCss' => __DIR__ . '/..' . '/mpdf/mpdf/src/Css/DefaultCss.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Css\\TextVars' => __DIR__ . '/..' . '/mpdf/mpdf/src/Css/TextVars.php', 'OCA\\Libresign\\Vendor\\Mpdf\\DirectWrite' => __DIR__ . '/..' . '/mpdf/mpdf/src/DirectWrite.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Exception\\AssetFetchingException' => __DIR__ . '/..' . '/mpdf/mpdf/src/Exception/AssetFetchingException.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Exception\\FontException' => __DIR__ . '/..' . '/mpdf/mpdf/src/Exception/FontException.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/mpdf/mpdf/src/Exception/InvalidArgumentException.php', 'OCA\\Libresign\\Vendor\\Mpdf\\File\\LocalContentLoader' => __DIR__ . '/..' . '/mpdf/mpdf/src/File/LocalContentLoader.php', 'OCA\\Libresign\\Vendor\\Mpdf\\File\\LocalContentLoaderInterface' => __DIR__ . '/..' . '/mpdf/mpdf/src/File/LocalContentLoaderInterface.php', 'OCA\\Libresign\\Vendor\\Mpdf\\File\\StreamWrapperChecker' => __DIR__ . '/..' . '/mpdf/mpdf/src/File/StreamWrapperChecker.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Fonts\\FontCache' => __DIR__ . '/..' . '/mpdf/mpdf/src/Fonts/FontCache.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Fonts\\FontFileFinder' => __DIR__ . '/..' . '/mpdf/mpdf/src/Fonts/FontFileFinder.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Fonts\\GlyphOperator' => __DIR__ . '/..' . '/mpdf/mpdf/src/Fonts/GlyphOperator.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Fonts\\MetricsGenerator' => __DIR__ . '/..' . '/mpdf/mpdf/src/Fonts/MetricsGenerator.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Form' => __DIR__ . '/..' . '/mpdf/mpdf/src/Form.php', 'OCA\\Libresign\\Vendor\\Mpdf\\FpdiTrait' => __DIR__ . '/..' . '/mpdf/mpdf/src/FpdiTrait.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Gif\\ColorTable' => __DIR__ . '/..' . '/mpdf/mpdf/src/Gif/ColorTable.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Gif\\FileHeader' => __DIR__ . '/..' . '/mpdf/mpdf/src/Gif/FileHeader.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Gif\\Gif' => __DIR__ . '/..' . '/mpdf/mpdf/src/Gif/Gif.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Gif\\Image' => __DIR__ . '/..' . '/mpdf/mpdf/src/Gif/Image.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Gif\\ImageHeader' => __DIR__ . '/..' . '/mpdf/mpdf/src/Gif/ImageHeader.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Gif\\Lzw' => __DIR__ . '/..' . '/mpdf/mpdf/src/Gif/Lzw.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Gradient' => __DIR__ . '/..' . '/mpdf/mpdf/src/Gradient.php', 'OCA\\Libresign\\Vendor\\Mpdf\\HTMLParserMode' => __DIR__ . '/..' . '/mpdf/mpdf/src/HTMLParserMode.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Http\\ClientInterface' => __DIR__ . '/..' . '/mpdf/mpdf/src/Http/ClientInterface.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Http\\CurlHttpClient' => __DIR__ . '/..' . '/mpdf/mpdf/src/Http/CurlHttpClient.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Http\\Exception\\ClientException' => __DIR__ . '/..' . '/mpdf/mpdf/src/Http/Exception/ClientException.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Http\\Exception\\ForbiddenRequestException' => __DIR__ . '/..' . '/mpdf/mpdf/src/Http/Exception/ForbiddenRequestException.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Http\\Exception\\NetworkException' => __DIR__ . '/..' . '/mpdf/mpdf/src/Http/Exception/NetworkException.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Http\\Exception\\RequestException' => __DIR__ . '/..' . '/mpdf/mpdf/src/Http/Exception/RequestException.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Http\\SocketHttpClient' => __DIR__ . '/..' . '/mpdf/mpdf/src/Http/SocketHttpClient.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Hyphenator' => __DIR__ . '/..' . '/mpdf/mpdf/src/Hyphenator.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Image\\Bmp' => __DIR__ . '/..' . '/mpdf/mpdf/src/Image/Bmp.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Image\\ImageProcessor' => __DIR__ . '/..' . '/mpdf/mpdf/src/Image/ImageProcessor.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Image\\ImageTypeGuesser' => __DIR__ . '/..' . '/mpdf/mpdf/src/Image/ImageTypeGuesser.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Image\\Svg' => __DIR__ . '/..' . '/mpdf/mpdf/src/Image/Svg.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Image\\Wmf' => __DIR__ . '/..' . '/mpdf/mpdf/src/Image/Wmf.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Language\\LanguageToFont' => __DIR__ . '/..' . '/mpdf/mpdf/src/Language/LanguageToFont.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Language\\LanguageToFontInterface' => __DIR__ . '/..' . '/mpdf/mpdf/src/Language/LanguageToFontInterface.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Language\\ScriptToLanguage' => __DIR__ . '/..' . '/mpdf/mpdf/src/Language/ScriptToLanguage.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Language\\ScriptToLanguageInterface' => __DIR__ . '/..' . '/mpdf/mpdf/src/Language/ScriptToLanguageInterface.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Log\\Context' => __DIR__ . '/..' . '/mpdf/mpdf/src/Log/Context.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Mpdf' => __DIR__ . '/..' . '/mpdf/mpdf/src/Mpdf.php', 'OCA\\Libresign\\Vendor\\Mpdf\\MpdfException' => __DIR__ . '/..' . '/mpdf/mpdf/src/MpdfException.php', 'OCA\\Libresign\\Vendor\\Mpdf\\MpdfImageException' => __DIR__ . '/..' . '/mpdf/mpdf/src/MpdfImageException.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Otl' => __DIR__ . '/..' . '/mpdf/mpdf/src/Otl.php', 'OCA\\Libresign\\Vendor\\Mpdf\\OtlDump' => __DIR__ . '/..' . '/mpdf/mpdf/src/OtlDump.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Output\\Destination' => __DIR__ . '/..' . '/mpdf/mpdf/src/Output/Destination.php', 'OCA\\Libresign\\Vendor\\Mpdf\\PageBox' => __DIR__ . '/..' . '/mpdf/mpdf/src/PageBox.php', 'OCA\\Libresign\\Vendor\\Mpdf\\PageFormat' => __DIR__ . '/..' . '/mpdf/mpdf/src/PageFormat.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Pdf\\Protection' => __DIR__ . '/..' . '/mpdf/mpdf/src/Pdf/Protection.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Pdf\\Protection\\UniqidGenerator' => __DIR__ . '/..' . '/mpdf/mpdf/src/Pdf/Protection/UniqidGenerator.php', 'OCA\\Libresign\\Vendor\\Mpdf\\PsrHttpMessageShim\\Request' => __DIR__ . '/..' . '/mpdf/psr-http-message-shim/src/Request.php', 'OCA\\Libresign\\Vendor\\Mpdf\\PsrHttpMessageShim\\Response' => __DIR__ . '/..' . '/mpdf/psr-http-message-shim/src/Response.php', 'OCA\\Libresign\\Vendor\\Mpdf\\PsrHttpMessageShim\\Stream' => __DIR__ . '/..' . '/mpdf/psr-http-message-shim/src/Stream.php', 'OCA\\Libresign\\Vendor\\Mpdf\\PsrHttpMessageShim\\Uri' => __DIR__ . '/..' . '/mpdf/psr-http-message-shim/src/Uri.php', 'OCA\\Libresign\\Vendor\\Mpdf\\PsrLogAwareTrait\\MpdfPsrLogAwareTrait' => __DIR__ . '/..' . '/mpdf/psr-log-aware-trait/src/MpdfPsrLogAwareTrait.php', 'OCA\\Libresign\\Vendor\\Mpdf\\PsrLogAwareTrait\\PsrLogAwareTrait' => __DIR__ . '/..' . '/mpdf/psr-log-aware-trait/src/PsrLogAwareTrait.php', 'OCA\\Libresign\\Vendor\\Mpdf\\ServiceFactory' => __DIR__ . '/..' . '/mpdf/mpdf/src/ServiceFactory.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Shaper\\Indic' => __DIR__ . '/..' . '/mpdf/mpdf/src/Shaper/Indic.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Shaper\\Myanmar' => __DIR__ . '/..' . '/mpdf/mpdf/src/Shaper/Myanmar.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Shaper\\Sea' => __DIR__ . '/..' . '/mpdf/mpdf/src/Shaper/Sea.php', 'OCA\\Libresign\\Vendor\\Mpdf\\SizeConverter' => __DIR__ . '/..' . '/mpdf/mpdf/src/SizeConverter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Strict' => __DIR__ . '/..' . '/mpdf/mpdf/src/Strict.php', 'OCA\\Libresign\\Vendor\\Mpdf\\TTFontFile' => __DIR__ . '/..' . '/mpdf/mpdf/src/TTFontFile.php', 'OCA\\Libresign\\Vendor\\Mpdf\\TTFontFileAnalysis' => __DIR__ . '/..' . '/mpdf/mpdf/src/TTFontFileAnalysis.php', 'OCA\\Libresign\\Vendor\\Mpdf\\TableOfContents' => __DIR__ . '/..' . '/mpdf/mpdf/src/TableOfContents.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\A' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/A.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Acronym' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Acronym.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Address' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Address.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Annotation' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Annotation.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Article' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Article.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Aside' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Aside.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\B' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/B.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\BarCode' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/BarCode.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Bdi' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Bdi.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Bdo' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Bdo.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Big' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Big.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\BlockQuote' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/BlockQuote.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\BlockTag' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/BlockTag.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Bookmark' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Bookmark.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Br' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Br.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Caption' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Caption.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Center' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Center.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Cite' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Cite.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Code' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Code.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\ColumnBreak' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/ColumnBreak.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Columns' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Columns.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Dd' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Dd.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Del' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Del.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Details' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Details.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Div' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Div.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Dl' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Dl.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\DotTab' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/DotTab.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Dt' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Dt.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Em' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Em.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\FieldSet' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/FieldSet.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\FigCaption' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/FigCaption.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Figure' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Figure.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Font' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Font.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Footer' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Footer.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Form' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Form.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\FormFeed' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/FormFeed.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\H1' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/H1.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\H2' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/H2.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\H3' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/H3.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\H4' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/H4.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\H5' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/H5.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\H6' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/H6.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\HGroup' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/HGroup.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Header' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Header.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Hr' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Hr.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\I' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/I.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Img' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Img.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\IndexEntry' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/IndexEntry.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\IndexInsert' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/IndexInsert.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\InlineTag' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/InlineTag.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Input' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Input.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Ins' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Ins.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Kbd' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Kbd.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Legend' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Legend.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Li' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Li.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Main' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Main.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Mark' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Mark.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Meter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Meter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Nav' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Nav.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\NewColumn' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/NewColumn.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\NewPage' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/NewPage.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Ol' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Ol.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Option' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Option.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\P' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/P.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\PageBreak' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/PageBreak.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\PageFooter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/PageFooter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\PageHeader' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/PageHeader.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Pre' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Pre.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Progress' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Progress.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Q' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Q.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\S' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/S.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Samp' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Samp.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Section' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Section.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Select' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Select.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\SetHtmlPageFooter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/SetHtmlPageFooter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\SetHtmlPageHeader' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/SetHtmlPageHeader.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\SetPageFooter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/SetPageFooter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\SetPageHeader' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/SetPageHeader.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Small' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Small.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Span' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Span.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Strike' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Strike.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Strong' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Strong.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Sub' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Sub.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\SubstituteTag' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/SubstituteTag.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Summary' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Summary.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Sup' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Sup.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\TBody' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/TBody.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\TFoot' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/TFoot.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\THead' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/THead.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Table' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Table.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Tag' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Tag.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Td' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Td.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\TextArea' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/TextArea.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\TextCircle' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/TextCircle.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Th' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Th.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Time' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Time.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Toc' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Toc.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\TocEntry' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/TocEntry.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\TocPageBreak' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/TocPageBreak.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Tr' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Tr.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Tt' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Tt.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Tta' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Tta.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Tts' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Tts.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Ttz' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Ttz.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\U' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/U.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Ul' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Ul.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\VarTag' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/VarTag.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\WatermarkImage' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/WatermarkImage.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\WatermarkText' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/WatermarkText.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Ucdn' => __DIR__ . '/..' . '/mpdf/mpdf/src/Ucdn.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Utils\\Arrays' => __DIR__ . '/..' . '/mpdf/mpdf/src/Utils/Arrays.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Utils\\NumericString' => __DIR__ . '/..' . '/mpdf/mpdf/src/Utils/NumericString.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Utils\\PdfDate' => __DIR__ . '/..' . '/mpdf/mpdf/src/Utils/PdfDate.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Utils\\UtfString' => __DIR__ . '/..' . '/mpdf/mpdf/src/Utils/UtfString.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Watermark' => __DIR__ . '/..' . '/mpdf/mpdf/src/Watermark.php', 'OCA\\Libresign\\Vendor\\Mpdf\\WatermarkImage' => __DIR__ . '/..' . '/mpdf/mpdf/src/WatermarkImage.php', 'OCA\\Libresign\\Vendor\\Mpdf\\WatermarkText' => __DIR__ . '/..' . '/mpdf/mpdf/src/WatermarkText.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\BackgroundWriter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Writer/BackgroundWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\BaseWriter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Writer/BaseWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\BookmarkWriter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Writer/BookmarkWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\ColorWriter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Writer/ColorWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\FontWriter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Writer/FontWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\FormWriter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Writer/FormWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\ImageWriter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Writer/ImageWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\JavaScriptWriter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Writer/JavaScriptWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\MetadataWriter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Writer/MetadataWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\ObjectWriter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Writer/ObjectWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\OptionalContentWriter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Writer/OptionalContentWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\PageWriter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Writer/PageWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\ResourceWriter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Writer/ResourceWriter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Adapter\\AdapterInterface' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/Adapter/AdapterInterface.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Adapter\\ArrayAdapter' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/Adapter/ArrayAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Adapter\\CallbackAdapter' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/Adapter/CallbackAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Adapter\\ConcatenationAdapter' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/Adapter/ConcatenationAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Adapter\\EmptyAdapter' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/Adapter/EmptyAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Adapter\\FixedAdapter' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/Adapter/FixedAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Adapter\\NullAdapter' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/Adapter/NullAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Adapter\\TransformingAdapter' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/Adapter/TransformingAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Doctrine\\Collections\\CollectionAdapter' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/Collections/CollectionAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Doctrine\\Collections\\SelectableAdapter' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/Collections/SelectableAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Doctrine\\DBAL\\QueryAdapter' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/DBAL/QueryAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Doctrine\\DBAL\\SingleTableQueryAdapter' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/DBAL/SingleTableQueryAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Doctrine\\MongoDBODM\\AggregationAdapter' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/MongoDBODM/AggregationAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Doctrine\\MongoDBODM\\QueryAdapter' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/MongoDBODM/QueryAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Doctrine\\ORM\\QueryAdapter' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/ORM/QueryAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Doctrine\\PHPCRODM\\QueryAdapter' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/PHPCRODM/QueryAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Elastica\\ElasticaAdapter' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Adapter/Elastica/ElasticaAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/Exception/InvalidArgumentException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\LessThan1CurrentPageException' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/Exception/LessThan1CurrentPageException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\LessThan1MaxPagesException' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/Exception/LessThan1MaxPagesException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\LessThan1MaxPerPageException' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/Exception/LessThan1MaxPerPageException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\LogicException' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/Exception/LogicException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\NotValidCurrentPageException' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/Exception/NotValidCurrentPageException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\NotValidMaxPerPageException' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/Exception/NotValidMaxPerPageException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\NotValidResultCountException' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/Exception/NotValidResultCountException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\OutOfBoundsException' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/Exception/OutOfBoundsException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\OutOfRangeCurrentPageException' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/Exception/OutOfRangeCurrentPageException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\PagerfantaException' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/Exception/PagerfantaException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\RuntimeException' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/Exception/RuntimeException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Pagerfanta' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/Pagerfanta.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\PagerfantaInterface' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/PagerfantaInterface.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\RouteGenerator\\RouteGeneratorDecorator' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/RouteGenerator/RouteGeneratorDecorator.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\RouteGenerator\\RouteGeneratorFactoryInterface' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/RouteGenerator/RouteGeneratorFactoryInterface.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\RouteGenerator\\RouteGeneratorInterface' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/RouteGenerator/RouteGeneratorInterface.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Solarium\\SolariumAdapter' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Adapter/Solarium/SolariumAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Twig\\Extension\\PagerfantaExtension' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Twig/Extension/PagerfantaExtension.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Twig\\Extension\\PagerfantaRuntime' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Twig/Extension/PagerfantaRuntime.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Twig\\View\\TwigView' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Twig/View/TwigView.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\DefaultView' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/View/DefaultView.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\Foundation6View' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/View/Foundation6View.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\OptionableView' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/View/OptionableView.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\SemanticUiView' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/View/SemanticUiView.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\TemplateView' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/View/TemplateView.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\Template\\DefaultTemplate' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/View/Template/DefaultTemplate.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\Template\\Foundation6Template' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/View/Template/Foundation6Template.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\Template\\SemanticUiTemplate' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/View/Template/SemanticUiTemplate.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\Template\\Template' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/View/Template/Template.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\Template\\TemplateInterface' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/View/Template/TemplateInterface.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\Template\\TwitterBootstrap3Template' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/View/Template/TwitterBootstrap3Template.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\Template\\TwitterBootstrap4Template' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/View/Template/TwitterBootstrap4Template.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\Template\\TwitterBootstrap5Template' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/View/Template/TwitterBootstrap5Template.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\Template\\TwitterBootstrapTemplate' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/View/Template/TwitterBootstrapTemplate.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\TwitterBootstrap3View' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/View/TwitterBootstrap3View.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\TwitterBootstrap4View' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/View/TwitterBootstrap4View.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\TwitterBootstrap5View' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/View/TwitterBootstrap5View.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\TwitterBootstrapView' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/View/TwitterBootstrapView.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\View' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/View/View.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\ViewFactory' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/View/ViewFactory.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\ViewFactoryInterface' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/View/ViewFactoryInterface.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\ViewInterface' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/View/ViewInterface.php', 'OCA\\Libresign\\Vendor\\ParagonIE\\ConstantTime\\Base32' => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src/Base32.php', 'OCA\\Libresign\\Vendor\\ParagonIE\\ConstantTime\\Base32Hex' => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src/Base32Hex.php', 'OCA\\Libresign\\Vendor\\ParagonIE\\ConstantTime\\Base64' => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src/Base64.php', 'OCA\\Libresign\\Vendor\\ParagonIE\\ConstantTime\\Base64DotSlash' => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src/Base64DotSlash.php', 'OCA\\Libresign\\Vendor\\ParagonIE\\ConstantTime\\Base64DotSlashOrdered' => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src/Base64DotSlashOrdered.php', 'OCA\\Libresign\\Vendor\\ParagonIE\\ConstantTime\\Base64UrlSafe' => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src/Base64UrlSafe.php', 'OCA\\Libresign\\Vendor\\ParagonIE\\ConstantTime\\Binary' => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src/Binary.php', 'OCA\\Libresign\\Vendor\\ParagonIE\\ConstantTime\\EncoderInterface' => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src/EncoderInterface.php', 'OCA\\Libresign\\Vendor\\ParagonIE\\ConstantTime\\Encoding' => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src/Encoding.php', 'OCA\\Libresign\\Vendor\\ParagonIE\\ConstantTime\\Hex' => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src/Hex.php', 'OCA\\Libresign\\Vendor\\ParagonIE\\ConstantTime\\RFC4648' => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src/RFC4648.php', 'OCA\\Libresign\\Vendor\\Psr\\Http\\Message\\MessageInterface' => __DIR__ . '/..' . '/psr/http-message/src/MessageInterface.php', 'OCA\\Libresign\\Vendor\\Psr\\Http\\Message\\RequestInterface' => __DIR__ . '/..' . '/psr/http-message/src/RequestInterface.php', 'OCA\\Libresign\\Vendor\\Psr\\Http\\Message\\ResponseInterface' => __DIR__ . '/..' . '/psr/http-message/src/ResponseInterface.php', 'OCA\\Libresign\\Vendor\\Psr\\Http\\Message\\ServerRequestInterface' => __DIR__ . '/..' . '/psr/http-message/src/ServerRequestInterface.php', 'OCA\\Libresign\\Vendor\\Psr\\Http\\Message\\StreamInterface' => __DIR__ . '/..' . '/psr/http-message/src/StreamInterface.php', 'OCA\\Libresign\\Vendor\\Psr\\Http\\Message\\UploadedFileInterface' => __DIR__ . '/..' . '/psr/http-message/src/UploadedFileInterface.php', 'OCA\\Libresign\\Vendor\\Psr\\Http\\Message\\UriInterface' => __DIR__ . '/..' . '/psr/http-message/src/UriInterface.php', 'OCA\\Libresign\\Vendor\\Psr\\Log\\AbstractLogger' => __DIR__ . '/..' . '/psr/log/src/AbstractLogger.php', 'OCA\\Libresign\\Vendor\\Psr\\Log\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/log/src/InvalidArgumentException.php', 'OCA\\Libresign\\Vendor\\Psr\\Log\\LogLevel' => __DIR__ . '/..' . '/psr/log/src/LogLevel.php', 'OCA\\Libresign\\Vendor\\Psr\\Log\\LoggerAwareInterface' => __DIR__ . '/..' . '/psr/log/src/LoggerAwareInterface.php', 'OCA\\Libresign\\Vendor\\Psr\\Log\\LoggerAwareTrait' => __DIR__ . '/..' . '/psr/log/src/LoggerAwareTrait.php', 'OCA\\Libresign\\Vendor\\Psr\\Log\\LoggerInterface' => __DIR__ . '/..' . '/psr/log/src/LoggerInterface.php', 'OCA\\Libresign\\Vendor\\Psr\\Log\\LoggerTrait' => __DIR__ . '/..' . '/psr/log/src/LoggerTrait.php', 'OCA\\Libresign\\Vendor\\Psr\\Log\\NullLogger' => __DIR__ . '/..' . '/psr/log/src/NullLogger.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Config' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Config.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Document' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Document.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Element.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element\\ElementArray' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementArray.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element\\ElementBoolean' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementBoolean.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element\\ElementDate' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementDate.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element\\ElementHexa' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementHexa.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element\\ElementMissing' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementMissing.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element\\ElementName' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementName.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element\\ElementNull' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementNull.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element\\ElementNumeric' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementNumeric.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element\\ElementString' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementString.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element\\ElementStruct' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementStruct.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element\\ElementXRef' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementXRef.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Encoding' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Encoding.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Encoding\\AbstractEncoding' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Encoding/AbstractEncoding.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Encoding\\EncodingLocator' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Encoding/EncodingLocator.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Encoding\\ISOLatin1Encoding' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Encoding/ISOLatin1Encoding.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Encoding\\ISOLatin9Encoding' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Encoding/ISOLatin9Encoding.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Encoding\\MacRomanEncoding' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Encoding/MacRomanEncoding.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Encoding\\PDFDocEncoding' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Encoding/PDFDocEncoding.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Encoding\\PostScriptGlyphs' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Encoding/PostScriptGlyphs.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Encoding\\StandardEncoding' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Encoding/StandardEncoding.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Encoding\\WinAnsiEncoding' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Encoding/WinAnsiEncoding.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Exception\\EmptyPdfException' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Exception/EmptyPdfException.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Exception\\EncodingNotFoundException' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Exception/EncodingNotFoundException.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Exception\\InvalidDictionaryObjectException' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Exception/InvalidDictionaryObjectException.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Exception\\MissingCatalogException' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Exception/MissingCatalogException.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Exception\\MissingPdfHeaderException' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Exception/MissingPdfHeaderException.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Exception\\NotImplementedException' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Exception/NotImplementedException.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Font' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Font.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Font\\FontCIDFontType0' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Font/FontCIDFontType0.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Font\\FontCIDFontType2' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Font/FontCIDFontType2.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Font\\FontTrueType' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Font/FontTrueType.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Font\\FontType0' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Font/FontType0.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Font\\FontType1' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Font/FontType1.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Font\\FontType3' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Font/FontType3.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Header' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Header.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\PDFObject' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/PDFObject.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Page' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Page.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Pages' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Pages.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Parser' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Parser.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\RawData\\FilterHelper' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/RawData/FilterHelper.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\RawData\\RawDataParser' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/RawData/RawDataParser.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\XObject\\Form' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/XObject/Form.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\XObject\\Image' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/XObject/Image.php', 'OCA\\Libresign\\Vendor\\Symfony\\Polyfill\\Ctype\\Ctype' => __DIR__ . '/..' . '/symfony/polyfill-ctype/Ctype.php', 'OCA\\Libresign\\Vendor\\Symfony\\Polyfill\\Mbstring\\Mbstring' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/Mbstring.php', 'OCA\\Libresign\\Vendor\\Twig\\AbstractTwigCallable' => __DIR__ . '/..' . '/twig/twig/src/AbstractTwigCallable.php', 'OCA\\Libresign\\Vendor\\Twig\\Attribute\\AsTwigFilter' => __DIR__ . '/..' . '/twig/twig/src/Attribute/AsTwigFilter.php', 'OCA\\Libresign\\Vendor\\Twig\\Attribute\\AsTwigFunction' => __DIR__ . '/..' . '/twig/twig/src/Attribute/AsTwigFunction.php', 'OCA\\Libresign\\Vendor\\Twig\\Attribute\\AsTwigTest' => __DIR__ . '/..' . '/twig/twig/src/Attribute/AsTwigTest.php', 'OCA\\Libresign\\Vendor\\Twig\\Attribute\\FirstClassTwigCallableReady' => __DIR__ . '/..' . '/twig/twig/src/Attribute/FirstClassTwigCallableReady.php', 'OCA\\Libresign\\Vendor\\Twig\\Attribute\\YieldReady' => __DIR__ . '/..' . '/twig/twig/src/Attribute/YieldReady.php', 'OCA\\Libresign\\Vendor\\Twig\\Cache\\CacheInterface' => __DIR__ . '/..' . '/twig/twig/src/Cache/CacheInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Cache\\ChainCache' => __DIR__ . '/..' . '/twig/twig/src/Cache/ChainCache.php', 'OCA\\Libresign\\Vendor\\Twig\\Cache\\FilesystemCache' => __DIR__ . '/..' . '/twig/twig/src/Cache/FilesystemCache.php', 'OCA\\Libresign\\Vendor\\Twig\\Cache\\NullCache' => __DIR__ . '/..' . '/twig/twig/src/Cache/NullCache.php', 'OCA\\Libresign\\Vendor\\Twig\\Cache\\ReadOnlyFilesystemCache' => __DIR__ . '/..' . '/twig/twig/src/Cache/ReadOnlyFilesystemCache.php', 'OCA\\Libresign\\Vendor\\Twig\\Cache\\RemovableCacheInterface' => __DIR__ . '/..' . '/twig/twig/src/Cache/RemovableCacheInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Compiler' => __DIR__ . '/..' . '/twig/twig/src/Compiler.php', 'OCA\\Libresign\\Vendor\\Twig\\DeprecatedCallableInfo' => __DIR__ . '/..' . '/twig/twig/src/DeprecatedCallableInfo.php', 'OCA\\Libresign\\Vendor\\Twig\\Environment' => __DIR__ . '/..' . '/twig/twig/src/Environment.php', 'OCA\\Libresign\\Vendor\\Twig\\Error\\Error' => __DIR__ . '/..' . '/twig/twig/src/Error/Error.php', 'OCA\\Libresign\\Vendor\\Twig\\Error\\LoaderError' => __DIR__ . '/..' . '/twig/twig/src/Error/LoaderError.php', 'OCA\\Libresign\\Vendor\\Twig\\Error\\RuntimeError' => __DIR__ . '/..' . '/twig/twig/src/Error/RuntimeError.php', 'OCA\\Libresign\\Vendor\\Twig\\Error\\SyntaxError' => __DIR__ . '/..' . '/twig/twig/src/Error/SyntaxError.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\AbstractExpressionParser' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser/AbstractExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\ExpressionParserDescriptionInterface' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser/ExpressionParserDescriptionInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\ExpressionParserInterface' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser/ExpressionParserInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\ExpressionParserType' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser/ExpressionParserType.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\ExpressionParsers' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser/ExpressionParsers.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\InfixAssociativity' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser/InfixAssociativity.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\InfixExpressionParserInterface' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser/InfixExpressionParserInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Infix\\ArgumentsTrait' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser/Infix/ArgumentsTrait.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Infix\\ArrowExpressionParser' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser/Infix/ArrowExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Infix\\BinaryOperatorExpressionParser' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser/Infix/BinaryOperatorExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Infix\\ConditionalTernaryExpressionParser' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser/Infix/ConditionalTernaryExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Infix\\DotExpressionParser' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser/Infix/DotExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Infix\\FilterExpressionParser' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser/Infix/FilterExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Infix\\FunctionExpressionParser' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser/Infix/FunctionExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Infix\\IsExpressionParser' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser/Infix/IsExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Infix\\IsNotExpressionParser' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser/Infix/IsNotExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Infix\\SquareBracketExpressionParser' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser/Infix/SquareBracketExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\PrecedenceChange' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser/PrecedenceChange.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\PrefixExpressionParserInterface' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser/PrefixExpressionParserInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Prefix\\GroupingExpressionParser' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser/Prefix/GroupingExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Prefix\\LiteralExpressionParser' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser/Prefix/LiteralExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Prefix\\UnaryOperatorExpressionParser' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser/Prefix/UnaryOperatorExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExtensionSet' => __DIR__ . '/..' . '/twig/twig/src/ExtensionSet.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\AbstractExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/AbstractExtension.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\AttributeExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/AttributeExtension.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\CoreExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/CoreExtension.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\DebugExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/DebugExtension.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\EscaperExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/EscaperExtension.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\ExtensionInterface' => __DIR__ . '/..' . '/twig/twig/src/Extension/ExtensionInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\GlobalsInterface' => __DIR__ . '/..' . '/twig/twig/src/Extension/GlobalsInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\LastModifiedExtensionInterface' => __DIR__ . '/..' . '/twig/twig/src/Extension/LastModifiedExtensionInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\OptimizerExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/OptimizerExtension.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\ProfilerExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/ProfilerExtension.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\RuntimeExtensionInterface' => __DIR__ . '/..' . '/twig/twig/src/Extension/RuntimeExtensionInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\SandboxExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/SandboxExtension.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\StagingExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/StagingExtension.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\StringLoaderExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/StringLoaderExtension.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\YieldNotReadyExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/YieldNotReadyExtension.php', 'OCA\\Libresign\\Vendor\\Twig\\FileExtensionEscapingStrategy' => __DIR__ . '/..' . '/twig/twig/src/FileExtensionEscapingStrategy.php', 'OCA\\Libresign\\Vendor\\Twig\\Lexer' => __DIR__ . '/..' . '/twig/twig/src/Lexer.php', 'OCA\\Libresign\\Vendor\\Twig\\Loader\\ArrayLoader' => __DIR__ . '/..' . '/twig/twig/src/Loader/ArrayLoader.php', 'OCA\\Libresign\\Vendor\\Twig\\Loader\\ChainLoader' => __DIR__ . '/..' . '/twig/twig/src/Loader/ChainLoader.php', 'OCA\\Libresign\\Vendor\\Twig\\Loader\\FilesystemLoader' => __DIR__ . '/..' . '/twig/twig/src/Loader/FilesystemLoader.php', 'OCA\\Libresign\\Vendor\\Twig\\Loader\\LoaderInterface' => __DIR__ . '/..' . '/twig/twig/src/Loader/LoaderInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Markup' => __DIR__ . '/..' . '/twig/twig/src/Markup.php', 'OCA\\Libresign\\Vendor\\Twig\\NodeTraverser' => __DIR__ . '/..' . '/twig/twig/src/NodeTraverser.php', 'OCA\\Libresign\\Vendor\\Twig\\NodeVisitor\\AbstractNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/AbstractNodeVisitor.php', 'OCA\\Libresign\\Vendor\\Twig\\NodeVisitor\\EscaperNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/EscaperNodeVisitor.php', 'OCA\\Libresign\\Vendor\\Twig\\NodeVisitor\\NodeVisitorInterface' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/NodeVisitorInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\NodeVisitor\\OptimizerNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/OptimizerNodeVisitor.php', 'OCA\\Libresign\\Vendor\\Twig\\NodeVisitor\\SafeAnalysisNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/SafeAnalysisNodeVisitor.php', 'OCA\\Libresign\\Vendor\\Twig\\NodeVisitor\\SandboxNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/SandboxNodeVisitor.php', 'OCA\\Libresign\\Vendor\\Twig\\NodeVisitor\\YieldNotReadyNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/YieldNotReadyNodeVisitor.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\AutoEscapeNode' => __DIR__ . '/..' . '/twig/twig/src/Node/AutoEscapeNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\BlockNode' => __DIR__ . '/..' . '/twig/twig/src/Node/BlockNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\BlockReferenceNode' => __DIR__ . '/..' . '/twig/twig/src/Node/BlockReferenceNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\BodyNode' => __DIR__ . '/..' . '/twig/twig/src/Node/BodyNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\CaptureNode' => __DIR__ . '/..' . '/twig/twig/src/Node/CaptureNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\CheckSecurityCallNode' => __DIR__ . '/..' . '/twig/twig/src/Node/CheckSecurityCallNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\CheckSecurityNode' => __DIR__ . '/..' . '/twig/twig/src/Node/CheckSecurityNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\CheckToStringNode' => __DIR__ . '/..' . '/twig/twig/src/Node/CheckToStringNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\DeprecatedNode' => __DIR__ . '/..' . '/twig/twig/src/Node/DeprecatedNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\DoNode' => __DIR__ . '/..' . '/twig/twig/src/Node/DoNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\EmbedNode' => __DIR__ . '/..' . '/twig/twig/src/Node/EmbedNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\EmptyNode' => __DIR__ . '/..' . '/twig/twig/src/Node/EmptyNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\AbstractExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/AbstractExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\ArrayExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/ArrayExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\ArrowFunctionExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/ArrowFunctionExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\AssignNameExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/AssignNameExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\AbstractBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/AbstractBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\AddBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/AddBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\AndBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/AndBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\BinaryInterface' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/BinaryInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\BitwiseAndBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/BitwiseAndBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\BitwiseOrBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/BitwiseOrBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\BitwiseXorBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/BitwiseXorBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\ConcatBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/ConcatBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\DivBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/DivBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\ElvisBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/ElvisBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\EndsWithBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/EndsWithBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\EqualBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/EqualBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\FloorDivBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/FloorDivBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\GreaterBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/GreaterBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\GreaterEqualBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/GreaterEqualBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\HasEveryBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/HasEveryBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\HasSomeBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/HasSomeBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\InBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/InBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\LessBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/LessBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\LessEqualBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/LessEqualBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\MatchesBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/MatchesBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\ModBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/ModBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\MulBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/MulBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\NotEqualBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/NotEqualBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\NotInBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/NotInBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\NullCoalesceBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/NullCoalesceBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\OrBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/OrBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\PowerBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/PowerBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\RangeBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/RangeBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\SpaceshipBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/SpaceshipBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\StartsWithBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/StartsWithBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\SubBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/SubBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\XorBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/XorBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\BlockReferenceExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/BlockReferenceExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\CallExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/CallExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\ConditionalExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/ConditionalExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\ConstantExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/ConstantExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\FilterExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/FilterExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Filter\\DefaultFilter' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Filter/DefaultFilter.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Filter\\RawFilter' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Filter/RawFilter.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\FunctionExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/FunctionExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\FunctionNode\\EnumCasesFunction' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/FunctionNode/EnumCasesFunction.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\FunctionNode\\EnumFunction' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/FunctionNode/EnumFunction.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\GetAttrExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/GetAttrExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\InlinePrint' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/InlinePrint.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\ListExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/ListExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\MacroReferenceExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/MacroReferenceExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\MethodCallExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/MethodCallExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\NameExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/NameExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\NullCoalesceExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/NullCoalesceExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\OperatorEscapeInterface' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/OperatorEscapeInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\ParentExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/ParentExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\ReturnArrayInterface' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/ReturnArrayInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\ReturnBoolInterface' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/ReturnBoolInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\ReturnNumberInterface' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/ReturnNumberInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\ReturnPrimitiveTypeInterface' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/ReturnPrimitiveTypeInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\ReturnStringInterface' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/ReturnStringInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\SupportDefinedTestDeprecationTrait' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/SupportDefinedTestDeprecationTrait.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\SupportDefinedTestInterface' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/SupportDefinedTestInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\SupportDefinedTestTrait' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/SupportDefinedTestTrait.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\TempNameExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/TempNameExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Ternary\\ConditionalTernary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Ternary/ConditionalTernary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\TestExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/TestExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Test\\ConstantTest' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Test/ConstantTest.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Test\\DefinedTest' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Test/DefinedTest.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Test\\DivisiblebyTest' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Test/DivisiblebyTest.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Test\\EvenTest' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Test/EvenTest.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Test\\NullTest' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Test/NullTest.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Test\\OddTest' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Test/OddTest.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Test\\SameasTest' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Test/SameasTest.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Test\\TrueTest' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Test/TrueTest.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Unary\\AbstractUnary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Unary/AbstractUnary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Unary\\NegUnary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Unary/NegUnary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Unary\\NotUnary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Unary/NotUnary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Unary\\PosUnary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Unary/PosUnary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Unary\\SpreadUnary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Unary/SpreadUnary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Unary\\StringCastUnary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Unary/StringCastUnary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Unary\\UnaryInterface' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Unary/UnaryInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Variable\\AssignContextVariable' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Variable/AssignContextVariable.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Variable\\AssignTemplateVariable' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Variable/AssignTemplateVariable.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Variable\\ContextVariable' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Variable/ContextVariable.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Variable\\LocalVariable' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Variable/LocalVariable.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Variable\\TemplateVariable' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Variable/TemplateVariable.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\VariadicExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/VariadicExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\FlushNode' => __DIR__ . '/..' . '/twig/twig/src/Node/FlushNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\ForElseNode' => __DIR__ . '/..' . '/twig/twig/src/Node/ForElseNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\ForLoopNode' => __DIR__ . '/..' . '/twig/twig/src/Node/ForLoopNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\ForNode' => __DIR__ . '/..' . '/twig/twig/src/Node/ForNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\IfNode' => __DIR__ . '/..' . '/twig/twig/src/Node/IfNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\ImportNode' => __DIR__ . '/..' . '/twig/twig/src/Node/ImportNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\IncludeNode' => __DIR__ . '/..' . '/twig/twig/src/Node/IncludeNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\MacroNode' => __DIR__ . '/..' . '/twig/twig/src/Node/MacroNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\ModuleNode' => __DIR__ . '/..' . '/twig/twig/src/Node/ModuleNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\NameDeprecation' => __DIR__ . '/..' . '/twig/twig/src/Node/NameDeprecation.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Node' => __DIR__ . '/..' . '/twig/twig/src/Node/Node.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\NodeCaptureInterface' => __DIR__ . '/..' . '/twig/twig/src/Node/NodeCaptureInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\NodeOutputInterface' => __DIR__ . '/..' . '/twig/twig/src/Node/NodeOutputInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Nodes' => __DIR__ . '/..' . '/twig/twig/src/Node/Nodes.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\PrintNode' => __DIR__ . '/..' . '/twig/twig/src/Node/PrintNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\SandboxNode' => __DIR__ . '/..' . '/twig/twig/src/Node/SandboxNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\SetNode' => __DIR__ . '/..' . '/twig/twig/src/Node/SetNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\TextNode' => __DIR__ . '/..' . '/twig/twig/src/Node/TextNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\TypesNode' => __DIR__ . '/..' . '/twig/twig/src/Node/TypesNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\WithNode' => __DIR__ . '/..' . '/twig/twig/src/Node/WithNode.php', 'OCA\\Libresign\\Vendor\\Twig\\OperatorPrecedenceChange' => __DIR__ . '/..' . '/twig/twig/src/OperatorPrecedenceChange.php', 'OCA\\Libresign\\Vendor\\Twig\\Parser' => __DIR__ . '/..' . '/twig/twig/src/Parser.php', 'OCA\\Libresign\\Vendor\\Twig\\Profiler\\Dumper\\BaseDumper' => __DIR__ . '/..' . '/twig/twig/src/Profiler/Dumper/BaseDumper.php', 'OCA\\Libresign\\Vendor\\Twig\\Profiler\\Dumper\\BlackfireDumper' => __DIR__ . '/..' . '/twig/twig/src/Profiler/Dumper/BlackfireDumper.php', 'OCA\\Libresign\\Vendor\\Twig\\Profiler\\Dumper\\HtmlDumper' => __DIR__ . '/..' . '/twig/twig/src/Profiler/Dumper/HtmlDumper.php', 'OCA\\Libresign\\Vendor\\Twig\\Profiler\\Dumper\\TextDumper' => __DIR__ . '/..' . '/twig/twig/src/Profiler/Dumper/TextDumper.php', 'OCA\\Libresign\\Vendor\\Twig\\Profiler\\NodeVisitor\\ProfilerNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/Profiler/NodeVisitor/ProfilerNodeVisitor.php', 'OCA\\Libresign\\Vendor\\Twig\\Profiler\\Node\\EnterProfileNode' => __DIR__ . '/..' . '/twig/twig/src/Profiler/Node/EnterProfileNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Profiler\\Node\\LeaveProfileNode' => __DIR__ . '/..' . '/twig/twig/src/Profiler/Node/LeaveProfileNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Profiler\\Profile' => __DIR__ . '/..' . '/twig/twig/src/Profiler/Profile.php', 'OCA\\Libresign\\Vendor\\Twig\\RuntimeLoader\\ContainerRuntimeLoader' => __DIR__ . '/..' . '/twig/twig/src/RuntimeLoader/ContainerRuntimeLoader.php', 'OCA\\Libresign\\Vendor\\Twig\\RuntimeLoader\\FactoryRuntimeLoader' => __DIR__ . '/..' . '/twig/twig/src/RuntimeLoader/FactoryRuntimeLoader.php', 'OCA\\Libresign\\Vendor\\Twig\\RuntimeLoader\\RuntimeLoaderInterface' => __DIR__ . '/..' . '/twig/twig/src/RuntimeLoader/RuntimeLoaderInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Runtime\\EscaperRuntime' => __DIR__ . '/..' . '/twig/twig/src/Runtime/EscaperRuntime.php', 'OCA\\Libresign\\Vendor\\Twig\\Sandbox\\SecurityError' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityError.php', 'OCA\\Libresign\\Vendor\\Twig\\Sandbox\\SecurityNotAllowedFilterError' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityNotAllowedFilterError.php', 'OCA\\Libresign\\Vendor\\Twig\\Sandbox\\SecurityNotAllowedFunctionError' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityNotAllowedFunctionError.php', 'OCA\\Libresign\\Vendor\\Twig\\Sandbox\\SecurityNotAllowedMethodError' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityNotAllowedMethodError.php', 'OCA\\Libresign\\Vendor\\Twig\\Sandbox\\SecurityNotAllowedPropertyError' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityNotAllowedPropertyError.php', 'OCA\\Libresign\\Vendor\\Twig\\Sandbox\\SecurityNotAllowedTagError' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityNotAllowedTagError.php', 'OCA\\Libresign\\Vendor\\Twig\\Sandbox\\SecurityPolicy' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityPolicy.php', 'OCA\\Libresign\\Vendor\\Twig\\Sandbox\\SecurityPolicyInterface' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityPolicyInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Sandbox\\SourcePolicyInterface' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SourcePolicyInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Source' => __DIR__ . '/..' . '/twig/twig/src/Source.php', 'OCA\\Libresign\\Vendor\\Twig\\Template' => __DIR__ . '/..' . '/twig/twig/src/Template.php', 'OCA\\Libresign\\Vendor\\Twig\\TemplateWrapper' => __DIR__ . '/..' . '/twig/twig/src/TemplateWrapper.php', 'OCA\\Libresign\\Vendor\\Twig\\Test\\IntegrationTestCase' => __DIR__ . '/..' . '/twig/twig/src/Test/IntegrationTestCase.php', 'OCA\\Libresign\\Vendor\\Twig\\Test\\NodeTestCase' => __DIR__ . '/..' . '/twig/twig/src/Test/NodeTestCase.php', 'OCA\\Libresign\\Vendor\\Twig\\Token' => __DIR__ . '/..' . '/twig/twig/src/Token.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\AbstractTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/AbstractTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\ApplyTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/ApplyTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\AutoEscapeTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/AutoEscapeTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\BlockTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/BlockTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\DeprecatedTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/DeprecatedTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\DoTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/DoTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\EmbedTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/EmbedTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\ExtendsTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/ExtendsTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\FlushTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/FlushTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\ForTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/ForTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\FromTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/FromTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\GuardTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/GuardTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\IfTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/IfTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\ImportTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/ImportTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\IncludeTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/IncludeTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\MacroTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/MacroTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\SandboxTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/SandboxTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\SetTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/SetTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\TokenParserInterface' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/TokenParserInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\TypesTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/TypesTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\UseTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/UseTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\WithTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/WithTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenStream' => __DIR__ . '/..' . '/twig/twig/src/TokenStream.php', 'OCA\\Libresign\\Vendor\\Twig\\TwigCallableInterface' => __DIR__ . '/..' . '/twig/twig/src/TwigCallableInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\TwigFilter' => __DIR__ . '/..' . '/twig/twig/src/TwigFilter.php', 'OCA\\Libresign\\Vendor\\Twig\\TwigFunction' => __DIR__ . '/..' . '/twig/twig/src/TwigFunction.php', 'OCA\\Libresign\\Vendor\\Twig\\TwigTest' => __DIR__ . '/..' . '/twig/twig/src/TwigTest.php', 'OCA\\Libresign\\Vendor\\Twig\\Util\\CallableArgumentsExtractor' => __DIR__ . '/..' . '/twig/twig/src/Util/CallableArgumentsExtractor.php', 'OCA\\Libresign\\Vendor\\Twig\\Util\\DeprecationCollector' => __DIR__ . '/..' . '/twig/twig/src/Util/DeprecationCollector.php', 'OCA\\Libresign\\Vendor\\Twig\\Util\\ReflectionCallable' => __DIR__ . '/..' . '/twig/twig/src/Util/ReflectionCallable.php', 'OCA\\Libresign\\Vendor\\Twig\\Util\\TemplateDirIterator' => __DIR__ . '/..' . '/twig/twig/src/Util/TemplateDirIterator.php', 'OCA\\Libresign\\Vendor\\Wobeto\\EmailBlur\\Blur' => __DIR__ . '/..' . '/wobeto/email-blur/Wobeto/EmailBlur/Blur.php', 'OCA\\Libresign\\Vendor\\mikehaertl\\pdftk\\Command' => __DIR__ . '/..' . '/mikehaertl/php-pdftk/src/Command.php', 'OCA\\Libresign\\Vendor\\mikehaertl\\pdftk\\DataFields' => __DIR__ . '/..' . '/mikehaertl/php-pdftk/src/DataFields.php', 'OCA\\Libresign\\Vendor\\mikehaertl\\pdftk\\FdfFile' => __DIR__ . '/..' . '/mikehaertl/php-pdftk/src/FdfFile.php', 'OCA\\Libresign\\Vendor\\mikehaertl\\pdftk\\InfoFields' => __DIR__ . '/..' . '/mikehaertl/php-pdftk/src/InfoFields.php', 'OCA\\Libresign\\Vendor\\mikehaertl\\pdftk\\InfoFile' => __DIR__ . '/..' . '/mikehaertl/php-pdftk/src/InfoFile.php', 'OCA\\Libresign\\Vendor\\mikehaertl\\pdftk\\Pdf' => __DIR__ . '/..' . '/mikehaertl/php-pdftk/src/Pdf.php', 'OCA\\Libresign\\Vendor\\mikehaertl\\pdftk\\XfdfFile' => __DIR__ . '/..' . '/mikehaertl/php-pdftk/src/XfdfFile.php', 'OCA\\Libresign\\Vendor\\mikehaertl\\shellcommand\\Command' => __DIR__ . '/..' . '/mikehaertl/php-shellcommand/src/Command.php', 'OCA\\Libresign\\Vendor\\mikehaertl\\tmp\\File' => __DIR__ . '/..' . '/mikehaertl/php-tmpfile/src/File.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Common\\Functions\\Strings' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Common/Functions/Strings.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\AES' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/AES.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Blowfish' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Blowfish.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\ChaCha20' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/ChaCha20.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Common\\AsymmetricKey' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Common/AsymmetricKey.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Common\\BlockCipher' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Common/BlockCipher.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Common\\Formats\\Keys\\JWK' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/JWK.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Common\\Formats\\Keys\\OpenSSH' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/OpenSSH.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Common\\Formats\\Keys\\PKCS' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Common\\Formats\\Keys\\PKCS1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Common\\Formats\\Keys\\PKCS8' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS8.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Common\\Formats\\Keys\\PuTTY' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PuTTY.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Common\\Formats\\Signature\\Raw' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Signature/Raw.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Common\\PrivateKey' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Common/PrivateKey.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Common\\PublicKey' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Common/PublicKey.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Common\\StreamCipher' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Common/StreamCipher.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Common\\SymmetricKey' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Common/SymmetricKey.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Common\\Traits\\Fingerprint' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Common/Traits/Fingerprint.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Common\\Traits\\PasswordProtected' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Common/Traits/PasswordProtected.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\DES' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/DES.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\DH' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/DH.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\DH\\Formats\\Keys\\PKCS1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/DH/Formats/Keys/PKCS1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\DH\\Formats\\Keys\\PKCS8' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/DH/Formats/Keys/PKCS8.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\DH\\Parameters' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/DH/Parameters.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\DH\\PrivateKey' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/DH/PrivateKey.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\DH\\PublicKey' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/DH/PublicKey.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\DSA' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/DSA.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\DSA\\Formats\\Keys\\OpenSSH' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/OpenSSH.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\DSA\\Formats\\Keys\\PKCS1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PKCS1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\DSA\\Formats\\Keys\\PKCS8' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PKCS8.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\DSA\\Formats\\Keys\\PuTTY' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PuTTY.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\DSA\\Formats\\Keys\\Raw' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/Raw.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\DSA\\Formats\\Keys\\XML' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/XML.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\DSA\\Formats\\Signature\\ASN1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/ASN1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\DSA\\Formats\\Signature\\Raw' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/Raw.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\DSA\\Formats\\Signature\\SSH2' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/SSH2.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\DSA\\Parameters' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/Parameters.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\DSA\\PrivateKey' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/PrivateKey.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\DSA\\PublicKey' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/DSA/PublicKey.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\BaseCurves\\Base' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Base.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\BaseCurves\\Binary' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Binary.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\BaseCurves\\KoblitzPrime' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/KoblitzPrime.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\BaseCurves\\Montgomery' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Montgomery.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\BaseCurves\\Prime' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Prime.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\BaseCurves\\TwistedEdwards' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/TwistedEdwards.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\Curve25519' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Curve25519.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\Curve448' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Curve448.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\Ed25519' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Ed25519.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\Ed448' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Ed448.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\brainpoolP160r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP160r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\brainpoolP160t1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP160t1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\brainpoolP192r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP192r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\brainpoolP192t1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP192t1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\brainpoolP224r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP224r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\brainpoolP224t1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP224t1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\brainpoolP256r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP256r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\brainpoolP256t1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP256t1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\brainpoolP320r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP320r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\brainpoolP320t1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP320t1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\brainpoolP384r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP384r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\brainpoolP384t1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP384t1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\brainpoolP512r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP512r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\brainpoolP512t1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP512t1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\nistb233' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistb233.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\nistb409' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistb409.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\nistk163' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk163.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\nistk233' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk233.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\nistk283' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk283.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\nistk409' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk409.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\nistp192' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp192.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\nistp224' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp224.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\nistp256' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp256.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\nistp384' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp384.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\nistp521' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp521.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\nistt571' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistt571.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\prime192v1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\prime192v2' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v2.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\prime192v3' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v3.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\prime239v1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\prime239v2' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v2.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\prime239v3' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v3.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\prime256v1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime256v1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\secp112r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp112r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\secp112r2' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp112r2.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\secp128r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp128r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\secp128r2' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp128r2.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\secp160k1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160k1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\secp160r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\secp160r2' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160r2.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\secp192k1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp192k1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\secp192r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp192r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\secp224k1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp224k1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\secp224r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp224r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\secp256k1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp256k1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\secp256r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp256r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\secp384r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp384r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\secp521r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp521r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\sect113r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect113r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\sect113r2' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect113r2.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\sect131r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect131r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\sect131r2' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect131r2.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\sect163k1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163k1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\sect163r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\sect163r2' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163r2.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\sect193r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect193r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\sect193r2' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect193r2.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\sect233k1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect233k1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\sect233r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect233r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\sect239k1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect239k1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\sect283k1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect283k1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\sect283r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect283r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\sect409k1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect409k1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\sect409r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect409r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\sect571k1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect571k1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Curves\\sect571r1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect571r1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Formats\\Keys\\Common' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/Common.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Formats\\Keys\\JWK' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/JWK.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Formats\\Keys\\MontgomeryPrivate' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/MontgomeryPrivate.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Formats\\Keys\\MontgomeryPublic' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/MontgomeryPublic.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Formats\\Keys\\OpenSSH' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/OpenSSH.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Formats\\Keys\\PKCS1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PKCS1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Formats\\Keys\\PKCS8' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PKCS8.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Formats\\Keys\\PuTTY' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PuTTY.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Formats\\Keys\\XML' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/XML.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Formats\\Keys\\libsodium' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/libsodium.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Formats\\Signature\\ASN1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/ASN1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Formats\\Signature\\IEEE' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/IEEE.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Formats\\Signature\\Raw' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/Raw.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Formats\\Signature\\SSH2' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/SSH2.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\Parameters' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/Parameters.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\PrivateKey' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/PrivateKey.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\EC\\PublicKey' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/EC/PublicKey.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Hash' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Hash.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\PublicKeyLoader' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/PublicKeyLoader.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\RC2' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/RC2.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\RC4' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/RC4.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\RSA' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/RSA.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\RSA\\Formats\\Keys\\JWK' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/JWK.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\RSA\\Formats\\Keys\\MSBLOB' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/MSBLOB.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\RSA\\Formats\\Keys\\OpenSSH' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/OpenSSH.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\RSA\\Formats\\Keys\\PKCS1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PKCS1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\RSA\\Formats\\Keys\\PKCS8' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PKCS8.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\RSA\\Formats\\Keys\\PSS' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PSS.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\RSA\\Formats\\Keys\\PuTTY' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PuTTY.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\RSA\\Formats\\Keys\\Raw' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/Raw.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\RSA\\Formats\\Keys\\XML' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/XML.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\RSA\\PrivateKey' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/RSA/PrivateKey.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\RSA\\PublicKey' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/RSA/PublicKey.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Random' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Random.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Rijndael' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Rijndael.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Salsa20' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Salsa20.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\TripleDES' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/TripleDES.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Crypt\\Twofish' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Crypt/Twofish.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Exception\\BadConfigurationException' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Exception/BadConfigurationException.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Exception\\BadDecryptionException' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Exception/BadDecryptionException.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Exception\\BadModeException' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Exception/BadModeException.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Exception\\ConnectionClosedException' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Exception/ConnectionClosedException.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Exception\\FileNotFoundException' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Exception/FileNotFoundException.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Exception\\InconsistentSetupException' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Exception/InconsistentSetupException.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Exception\\InsufficientSetupException' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Exception/InsufficientSetupException.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Exception\\InvalidPacketLengthException' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Exception/InvalidPacketLengthException.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Exception\\NoKeyLoadedException' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Exception/NoKeyLoadedException.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Exception\\NoSupportedAlgorithmsException' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Exception/NoSupportedAlgorithmsException.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Exception\\TimeoutException' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Exception/TimeoutException.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Exception\\UnableToConnectException' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Exception/UnableToConnectException.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Exception\\UnsupportedAlgorithmException' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Exception/UnsupportedAlgorithmException.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Exception\\UnsupportedCurveException' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Exception/UnsupportedCurveException.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Exception\\UnsupportedFormatException' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Exception/UnsupportedFormatException.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Exception\\UnsupportedOperationException' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Exception/UnsupportedOperationException.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ANSI' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ANSI.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Element' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Element.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\AccessDescription' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AccessDescription.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\AdministrationDomainName' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AdministrationDomainName.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\AlgorithmIdentifier' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AlgorithmIdentifier.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\AnotherName' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AnotherName.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\Attribute' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Attribute.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\AttributeType' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeType.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\AttributeTypeAndValue' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeTypeAndValue.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\AttributeValue' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeValue.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\Attributes' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Attributes.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\AuthorityInfoAccessSyntax' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AuthorityInfoAccessSyntax.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\AuthorityKeyIdentifier' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AuthorityKeyIdentifier.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\BaseDistance' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BaseDistance.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\BasicConstraints' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BasicConstraints.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\BuiltInDomainDefinedAttribute' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInDomainDefinedAttribute.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\BuiltInDomainDefinedAttributes' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInDomainDefinedAttributes.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\BuiltInStandardAttributes' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInStandardAttributes.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\CPSuri' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CPSuri.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\CRLDistributionPoints' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLDistributionPoints.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\CRLNumber' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLNumber.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\CRLReason' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLReason.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\CertPolicyId' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertPolicyId.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\Certificate' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Certificate.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\CertificateIssuer' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateIssuer.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\CertificateList' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateList.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\CertificatePolicies' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificatePolicies.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\CertificateSerialNumber' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateSerialNumber.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\CertificationRequest' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificationRequest.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\CertificationRequestInfo' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificationRequestInfo.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\Characteristic_two' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Characteristic_two.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\CountryName' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CountryName.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\Curve' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Curve.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\DHParameter' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DHParameter.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\DSAParams' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAParams.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\DSAPrivateKey' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAPrivateKey.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\DSAPublicKey' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAPublicKey.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\DigestInfo' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DigestInfo.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\DirectoryString' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DirectoryString.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\DisplayText' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DisplayText.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\DistributionPoint' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DistributionPoint.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\DistributionPointName' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DistributionPointName.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\DssSigValue' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DssSigValue.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\ECParameters' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECParameters.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\ECPoint' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECPoint.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\ECPrivateKey' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECPrivateKey.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\EDIPartyName' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EDIPartyName.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\EcdsaSigValue' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EcdsaSigValue.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\EncryptedData' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EncryptedData.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\EncryptedPrivateKeyInfo' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EncryptedPrivateKeyInfo.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\ExtKeyUsageSyntax' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtKeyUsageSyntax.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\Extension' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Extension.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\ExtensionAttribute' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtensionAttribute.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\ExtensionAttributes' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtensionAttributes.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\Extensions' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Extensions.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\FieldElement' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/FieldElement.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\FieldID' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/FieldID.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\GeneralName' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralName.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\GeneralNames' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralNames.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\GeneralSubtree' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralSubtree.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\GeneralSubtrees' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralSubtrees.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\HashAlgorithm' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/HashAlgorithm.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\HoldInstructionCode' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/HoldInstructionCode.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\InvalidityDate' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/InvalidityDate.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\IssuerAltName' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/IssuerAltName.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\IssuingDistributionPoint' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/IssuingDistributionPoint.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\KeyIdentifier' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyIdentifier.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\KeyPurposeId' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyPurposeId.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\KeyUsage' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyUsage.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\MaskGenAlgorithm' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/MaskGenAlgorithm.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\Name' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Name.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\NameConstraints' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NameConstraints.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\NetworkAddress' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NetworkAddress.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\NoticeReference' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NoticeReference.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\NumericUserIdentifier' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NumericUserIdentifier.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\ORAddress' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ORAddress.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\OneAsymmetricKey' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OneAsymmetricKey.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\OrganizationName' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OrganizationName.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\OrganizationalUnitNames' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OrganizationalUnitNames.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\OtherPrimeInfo' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OtherPrimeInfo.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\OtherPrimeInfos' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OtherPrimeInfos.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\PBEParameter' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBEParameter.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\PBES2params' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBES2params.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\PBKDF2params' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBKDF2params.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\PBMAC1params' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBMAC1params.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\PKCS9String' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PKCS9String.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\Pentanomial' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Pentanomial.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\PersonalName' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PersonalName.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\PolicyInformation' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyInformation.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\PolicyMappings' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyMappings.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\PolicyQualifierId' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyQualifierId.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\PolicyQualifierInfo' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyQualifierInfo.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\PostalAddress' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PostalAddress.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\Prime_p' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Prime_p.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\PrivateDomainName' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateDomainName.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\PrivateKey' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKey.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\PrivateKeyInfo' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKeyInfo.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\PrivateKeyUsagePeriod' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKeyUsagePeriod.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\PublicKey' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKey.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\PublicKeyAndChallenge' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKeyAndChallenge.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\PublicKeyInfo' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKeyInfo.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\RC2CBCParameter' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RC2CBCParameter.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\RDNSequence' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RDNSequence.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\RSAPrivateKey' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSAPrivateKey.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\RSAPublicKey' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSAPublicKey.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\RSASSA_PSS_params' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSASSA_PSS_params.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\ReasonFlags' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ReasonFlags.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\RelativeDistinguishedName' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RelativeDistinguishedName.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\RevokedCertificate' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RevokedCertificate.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\SignedPublicKeyAndChallenge' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SignedPublicKeyAndChallenge.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\SpecifiedECDomain' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SpecifiedECDomain.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\SubjectAltName' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectAltName.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\SubjectDirectoryAttributes' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectDirectoryAttributes.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\SubjectInfoAccessSyntax' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectInfoAccessSyntax.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\SubjectPublicKeyInfo' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectPublicKeyInfo.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\TBSCertList' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TBSCertList.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\TBSCertificate' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TBSCertificate.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\TerminalIdentifier' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TerminalIdentifier.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\Time' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Time.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\Trinomial' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Trinomial.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\UniqueIdentifier' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/UniqueIdentifier.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\UserNotice' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/UserNotice.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\Validity' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Validity.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\netscape_ca_policy_url' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_ca_policy_url.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\netscape_cert_type' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_cert_type.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\ASN1\\Maps\\netscape_comment' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_comment.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\File\\X509' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/File/X509.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\BCMath' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\BCMath\\Base' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Base.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\BCMath\\BuiltIn' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/BuiltIn.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\BCMath\\DefaultEngine' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/DefaultEngine.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\BCMath\\OpenSSL' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/OpenSSL.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\BCMath\\Reductions\\Barrett' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Reductions/Barrett.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\BCMath\\Reductions\\EvalBarrett' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Reductions/EvalBarrett.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\Engine' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/Engine.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\GMP' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/GMP.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\GMP\\DefaultEngine' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/GMP/DefaultEngine.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\OpenSSL' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/OpenSSL.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\PHP' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\PHP32' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP32.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\PHP64' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP64.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\PHP\\Base' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Base.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\PHP\\DefaultEngine' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/DefaultEngine.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\PHP\\Montgomery' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Montgomery.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\PHP\\OpenSSL' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/OpenSSL.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\PHP\\Reductions\\Barrett' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Barrett.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\PHP\\Reductions\\Classic' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Classic.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\PHP\\Reductions\\EvalBarrett' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/EvalBarrett.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\PHP\\Reductions\\Montgomery' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Montgomery.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\PHP\\Reductions\\MontgomeryMult' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/MontgomeryMult.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\PHP\\Reductions\\PowerOfTwo' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/PowerOfTwo.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BinaryField' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BinaryField.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BinaryField\\Integer' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/BinaryField/Integer.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\Common\\FiniteField' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/Common/FiniteField.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\Common\\FiniteField\\Integer' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/Common/FiniteField/Integer.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\PrimeField' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/PrimeField.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Math\\PrimeField\\Integer' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Math/PrimeField/Integer.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Net\\SFTP' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Net/SFTP.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Net\\SFTP\\Stream' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Net/SFTP/Stream.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\Net\\SSH2' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/Net/SSH2.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\System\\SSH\\Agent' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/System/SSH/Agent.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\System\\SSH\\Agent\\Identity' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/System/SSH/Agent/Identity.php', 'OCA\\Libresign\\Vendor\\phpseclib3\\System\\SSH\\Common\\Traits\\ReadBytes' => __DIR__ . '/..' . '/phpseclib/phpseclib/phpseclib/System/SSH/Common/Traits/ReadBytes.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\FpdfTpl' => __DIR__ . '/..' . '/setasign/fpdi/src/FpdfTpl.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\FpdfTplTrait' => __DIR__ . '/..' . '/setasign/fpdi/src/FpdfTplTrait.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\FpdfTrait' => __DIR__ . '/..' . '/setasign/fpdi/src/FpdfTrait.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\Fpdi' => __DIR__ . '/..' . '/setasign/fpdi/src/Fpdi.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\FpdiException' => __DIR__ . '/..' . '/setasign/fpdi/src/FpdiException.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\FpdiTrait' => __DIR__ . '/..' . '/setasign/fpdi/src/FpdiTrait.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\GraphicsState' => __DIR__ . '/..' . '/setasign/fpdi/src/GraphicsState.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\Math\\Matrix' => __DIR__ . '/..' . '/setasign/fpdi/src/Math/Matrix.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\Math\\Vector' => __DIR__ . '/..' . '/setasign/fpdi/src/Math/Vector.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\CrossReference\\AbstractReader' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/CrossReference/AbstractReader.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\CrossReference\\CrossReference' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/CrossReference/CrossReference.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\CrossReference\\CrossReferenceException' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/CrossReference/CrossReferenceException.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\CrossReference\\FixedReader' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/CrossReference/FixedReader.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\CrossReference\\LineReader' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/CrossReference/LineReader.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\CrossReference\\ReaderInterface' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/CrossReference/ReaderInterface.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Filter\\Ascii85' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Filter/Ascii85.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Filter\\Ascii85Exception' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Filter/Ascii85Exception.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Filter\\AsciiHex' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Filter/AsciiHex.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Filter\\FilterException' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Filter/FilterException.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Filter\\FilterInterface' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Filter/FilterInterface.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Filter\\Flate' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Filter/Flate.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Filter\\FlateException' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Filter/FlateException.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Filter\\Lzw' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Filter/Lzw.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Filter\\LzwException' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Filter/LzwException.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\PdfParser' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/PdfParser.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\PdfParserException' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/PdfParserException.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\StreamReader' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/StreamReader.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Tokenizer' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Tokenizer.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfArray' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Type/PdfArray.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfBoolean' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Type/PdfBoolean.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfDictionary' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Type/PdfDictionary.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfHexString' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Type/PdfHexString.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfIndirectObject' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Type/PdfIndirectObject.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfIndirectObjectReference' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Type/PdfIndirectObjectReference.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfName' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Type/PdfName.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfNull' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Type/PdfNull.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfNumeric' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Type/PdfNumeric.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfStream' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Type/PdfStream.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfString' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Type/PdfString.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfToken' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Type/PdfToken.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfType' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Type/PdfType.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfTypeException' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Type/PdfTypeException.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfReader\\DataStructure\\Rectangle' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfReader/DataStructure/Rectangle.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfReader\\Page' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfReader/Page.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfReader\\PageBoundaries' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfReader/PageBoundaries.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfReader\\PdfReader' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfReader/PdfReader.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfReader\\PdfReaderException' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfReader/PdfReaderException.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\TcpdfFpdi' => __DIR__ . '/..' . '/setasign/fpdi/src/TcpdfFpdi.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\Tcpdf\\Fpdi' => __DIR__ . '/..' . '/setasign/fpdi/src/Tcpdf/Fpdi.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\Tfpdf\\FpdfTpl' => __DIR__ . '/..' . '/setasign/fpdi/src/Tfpdf/FpdfTpl.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\Tfpdf\\Fpdi' => __DIR__ . '/..' . '/setasign/fpdi/src/Tfpdf/Fpdi.php'); + public static $classMap = array('OCA\\Libresign\\Vendor\\BaconQrCode\\Common\\BitArray' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Common/BitArray.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Common\\BitMatrix' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Common/BitMatrix.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Common\\BitUtils' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Common/BitUtils.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Common\\CharacterSetEci' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Common/CharacterSetEci.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Common\\EcBlock' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Common/EcBlock.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Common\\EcBlocks' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Common/EcBlocks.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Common\\ErrorCorrectionLevel' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Common/ErrorCorrectionLevel.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Common\\FormatInformation' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Common/FormatInformation.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Common\\Mode' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Common/Mode.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Common\\ReedSolomonCodec' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Common/ReedSolomonCodec.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Common\\Version' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Common/Version.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Encoder\\BlockPair' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Encoder/BlockPair.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Encoder\\ByteMatrix' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Encoder/ByteMatrix.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Encoder\\Encoder' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Encoder/Encoder.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Encoder\\MaskUtil' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Encoder/MaskUtil.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Encoder\\MatrixUtil' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Encoder/MatrixUtil.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Encoder\\QrCode' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Encoder/QrCode.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Exception/ExceptionInterface.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Exception/InvalidArgumentException.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Exception\\OutOfBoundsException' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Exception/OutOfBoundsException.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Exception\\RuntimeException' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Exception/RuntimeException.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Exception\\UnexpectedValueException' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Exception/UnexpectedValueException.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Exception\\WriterException' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Exception/WriterException.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Color\\Alpha' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Color/Alpha.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Color\\Cmyk' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Color/Cmyk.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Color\\ColorInterface' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Color/ColorInterface.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Color\\Gray' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Color/Gray.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Color\\Rgb' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Color/Rgb.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Eye\\CompositeEye' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Eye/CompositeEye.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Eye\\EyeInterface' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Eye/EyeInterface.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Eye\\ModuleEye' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Eye/ModuleEye.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Eye\\PointyEye' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Eye/PointyEye.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Eye\\SimpleCircleEye' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Eye/SimpleCircleEye.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Eye\\SquareEye' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Eye/SquareEye.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\GDLibRenderer' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/GDLibRenderer.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\ImageRenderer' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/ImageRenderer.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Image\\EpsImageBackEnd' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Image/EpsImageBackEnd.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Image\\ImageBackEndInterface' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Image/ImageBackEndInterface.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Image\\ImagickImageBackEnd' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Image/ImagickImageBackEnd.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Image\\SvgImageBackEnd' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Image/SvgImageBackEnd.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Image\\TransformationMatrix' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Image/TransformationMatrix.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Module\\DotsModule' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Module/DotsModule.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Module\\EdgeIterator\\Edge' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Module/EdgeIterator/Edge.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Module\\EdgeIterator\\EdgeIterator' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Module/EdgeIterator/EdgeIterator.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Module\\ModuleInterface' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Module/ModuleInterface.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Module\\RoundnessModule' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Module/RoundnessModule.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Module\\SquareModule' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Module/SquareModule.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Path\\Close' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Path/Close.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Path\\Curve' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Path/Curve.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Path\\EllipticArc' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Path/EllipticArc.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Path\\Line' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Path/Line.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Path\\Move' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Path/Move.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Path\\OperationInterface' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Path/OperationInterface.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\Path\\Path' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/Path/Path.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\PlainTextRenderer' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/PlainTextRenderer.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\RendererInterface' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/RendererInterface.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\RendererStyle\\EyeFill' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/RendererStyle/EyeFill.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\RendererStyle\\Fill' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/RendererStyle/Fill.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\RendererStyle\\Gradient' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/RendererStyle/Gradient.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\RendererStyle\\GradientType' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/RendererStyle/GradientType.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Renderer\\RendererStyle\\RendererStyle' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Renderer/RendererStyle/RendererStyle.php', 'OCA\\Libresign\\Vendor\\BaconQrCode\\Writer' => __DIR__ . '/..' . '/bacon/bacon-qr-code/src/Writer.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\ApplicationFactory\\FreshInstanceApplicationFactory' => __DIR__ . '/..' . '/bamarni/composer-bin-plugin/src/ApplicationFactory/FreshInstanceApplicationFactory.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\ApplicationFactory\\NamespaceApplicationFactory' => __DIR__ . '/..' . '/bamarni/composer-bin-plugin/src/ApplicationFactory/NamespaceApplicationFactory.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\BamarniBinPlugin' => __DIR__ . '/..' . '/bamarni/composer-bin-plugin/src/BamarniBinPlugin.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\CommandProvider' => __DIR__ . '/..' . '/bamarni/composer-bin-plugin/src/CommandProvider.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\Command\\BinCommand' => __DIR__ . '/..' . '/bamarni/composer-bin-plugin/src/Command/BinCommand.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\Command\\CouldNotCreateNamespaceDir' => __DIR__ . '/..' . '/bamarni/composer-bin-plugin/src/Command/CouldNotCreateNamespaceDir.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\Config\\Config' => __DIR__ . '/..' . '/bamarni/composer-bin-plugin/src/Config/Config.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\Config\\ConfigFactory' => __DIR__ . '/..' . '/bamarni/composer-bin-plugin/src/Config/ConfigFactory.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\Config\\InvalidBamarniComposerExtraConfig' => __DIR__ . '/..' . '/bamarni/composer-bin-plugin/src/Config/InvalidBamarniComposerExtraConfig.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\Input\\BinInputFactory' => __DIR__ . '/..' . '/bamarni/composer-bin-plugin/src/Input/BinInputFactory.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\Input\\InvalidBinInput' => __DIR__ . '/..' . '/bamarni/composer-bin-plugin/src/Input/InvalidBinInput.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\Logger' => __DIR__ . '/..' . '/bamarni/composer-bin-plugin/src/Logger.php', 'OCA\\Libresign\\Vendor\\Bamarni\\Composer\\Bin\\PublicIO' => __DIR__ . '/..' . '/bamarni/composer-bin-plugin/src/PublicIO.php', 'OCA\\Libresign\\Vendor\\Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', 'OCA\\Libresign\\Vendor\\DASPRiD\\Enum\\AbstractEnum' => __DIR__ . '/..' . '/dasprid/enum/src/AbstractEnum.php', 'OCA\\Libresign\\Vendor\\DASPRiD\\Enum\\EnumMap' => __DIR__ . '/..' . '/dasprid/enum/src/EnumMap.php', 'OCA\\Libresign\\Vendor\\DASPRiD\\Enum\\Exception\\CloneNotSupportedException' => __DIR__ . '/..' . '/dasprid/enum/src/Exception/CloneNotSupportedException.php', 'OCA\\Libresign\\Vendor\\DASPRiD\\Enum\\Exception\\ExceptionInterface' => __DIR__ . '/..' . '/dasprid/enum/src/Exception/ExceptionInterface.php', 'OCA\\Libresign\\Vendor\\DASPRiD\\Enum\\Exception\\ExpectationException' => __DIR__ . '/..' . '/dasprid/enum/src/Exception/ExpectationException.php', 'OCA\\Libresign\\Vendor\\DASPRiD\\Enum\\Exception\\IllegalArgumentException' => __DIR__ . '/..' . '/dasprid/enum/src/Exception/IllegalArgumentException.php', 'OCA\\Libresign\\Vendor\\DASPRiD\\Enum\\Exception\\MismatchException' => __DIR__ . '/..' . '/dasprid/enum/src/Exception/MismatchException.php', 'OCA\\Libresign\\Vendor\\DASPRiD\\Enum\\Exception\\SerializeNotSupportedException' => __DIR__ . '/..' . '/dasprid/enum/src/Exception/SerializeNotSupportedException.php', 'OCA\\Libresign\\Vendor\\DASPRiD\\Enum\\Exception\\UnserializeNotSupportedException' => __DIR__ . '/..' . '/dasprid/enum/src/Exception/UnserializeNotSupportedException.php', 'OCA\\Libresign\\Vendor\\DASPRiD\\Enum\\NullValue' => __DIR__ . '/..' . '/dasprid/enum/src/NullValue.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\DeepCopy' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/DeepCopy.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Exception\\CloneException' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Exception/CloneException.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Exception\\PropertyException' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Exception/PropertyException.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Filter\\ChainableFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/ChainableFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Filter\\Doctrine\\DoctrineCollectionFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Filter\\Doctrine\\DoctrineEmptyCollectionFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Filter\\Doctrine\\DoctrineProxyFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Filter\\Filter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/Filter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Filter\\KeepFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/KeepFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Filter\\ReplaceFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/ReplaceFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Filter\\SetNullFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Filter/SetNullFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Matcher\\Doctrine\\DoctrineProxyMatcher' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Matcher\\Matcher' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Matcher/Matcher.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Matcher\\PropertyMatcher' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyMatcher.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Matcher\\PropertyNameMatcher' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Matcher\\PropertyTypeMatcher' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\Reflection\\ReflectionHelper' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/Reflection/ReflectionHelper.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\TypeFilter\\Date\\DateIntervalFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\TypeFilter\\Date\\DatePeriodFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Date/DatePeriodFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\TypeFilter\\ReplaceFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\TypeFilter\\ShallowCopyFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\TypeFilter\\Spl\\ArrayObjectFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/ArrayObjectFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\TypeFilter\\Spl\\SplDoublyLinkedList' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\TypeFilter\\Spl\\SplDoublyLinkedListFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedListFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\TypeFilter\\TypeFilter' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeFilter/TypeFilter.php', 'OCA\\Libresign\\Vendor\\DeepCopy\\TypeMatcher\\TypeMatcher' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/TypeMatcher/TypeMatcher.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Bacon\\ErrorCorrectionLevelConverter' => __DIR__ . '/..' . '/endroid/qr-code/src/Bacon/ErrorCorrectionLevelConverter.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Bacon\\MatrixFactory' => __DIR__ . '/..' . '/endroid/qr-code/src/Bacon/MatrixFactory.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Builder\\Builder' => __DIR__ . '/..' . '/endroid/qr-code/src/Builder/Builder.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Builder\\BuilderInterface' => __DIR__ . '/..' . '/endroid/qr-code/src/Builder/BuilderInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Builder\\BuilderRegistry' => __DIR__ . '/..' . '/endroid/qr-code/src/Builder/BuilderRegistry.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Builder\\BuilderRegistryInterface' => __DIR__ . '/..' . '/endroid/qr-code/src/Builder/BuilderRegistryInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Color\\Color' => __DIR__ . '/..' . '/endroid/qr-code/src/Color/Color.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Color\\ColorInterface' => __DIR__ . '/..' . '/endroid/qr-code/src/Color/ColorInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Encoding\\Encoding' => __DIR__ . '/..' . '/endroid/qr-code/src/Encoding/Encoding.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Encoding\\EncodingInterface' => __DIR__ . '/..' . '/endroid/qr-code/src/Encoding/EncodingInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\ErrorCorrectionLevel' => __DIR__ . '/..' . '/endroid/qr-code/src/ErrorCorrectionLevel.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Exception\\BlockSizeTooSmallException' => __DIR__ . '/..' . '/endroid/qr-code/src/Exception/BlockSizeTooSmallException.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Exception\\ValidationException' => __DIR__ . '/..' . '/endroid/qr-code/src/Exception/ValidationException.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\ImageData\\LabelImageData' => __DIR__ . '/..' . '/endroid/qr-code/src/ImageData/LabelImageData.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\ImageData\\LogoImageData' => __DIR__ . '/..' . '/endroid/qr-code/src/ImageData/LogoImageData.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Label\\Font\\Font' => __DIR__ . '/..' . '/endroid/qr-code/src/Label/Font/Font.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Label\\Font\\FontInterface' => __DIR__ . '/..' . '/endroid/qr-code/src/Label/Font/FontInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Label\\Font\\OpenSans' => __DIR__ . '/..' . '/endroid/qr-code/src/Label/Font/OpenSans.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Label\\Label' => __DIR__ . '/..' . '/endroid/qr-code/src/Label/Label.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Label\\LabelAlignment' => __DIR__ . '/..' . '/endroid/qr-code/src/Label/LabelAlignment.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Label\\LabelInterface' => __DIR__ . '/..' . '/endroid/qr-code/src/Label/LabelInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Label\\Margin\\Margin' => __DIR__ . '/..' . '/endroid/qr-code/src/Label/Margin/Margin.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Label\\Margin\\MarginInterface' => __DIR__ . '/..' . '/endroid/qr-code/src/Label/Margin/MarginInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Logo\\Logo' => __DIR__ . '/..' . '/endroid/qr-code/src/Logo/Logo.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Logo\\LogoInterface' => __DIR__ . '/..' . '/endroid/qr-code/src/Logo/LogoInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Matrix\\Matrix' => __DIR__ . '/..' . '/endroid/qr-code/src/Matrix/Matrix.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Matrix\\MatrixFactoryInterface' => __DIR__ . '/..' . '/endroid/qr-code/src/Matrix/MatrixFactoryInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Matrix\\MatrixInterface' => __DIR__ . '/..' . '/endroid/qr-code/src/Matrix/MatrixInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\QrCode' => __DIR__ . '/..' . '/endroid/qr-code/src/QrCode.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\QrCodeInterface' => __DIR__ . '/..' . '/endroid/qr-code/src/QrCodeInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\RoundBlockSizeMode' => __DIR__ . '/..' . '/endroid/qr-code/src/RoundBlockSizeMode.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\AbstractGdWriter' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/AbstractGdWriter.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\BinaryWriter' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/BinaryWriter.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\ConsoleWriter' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/ConsoleWriter.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\DebugWriter' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/DebugWriter.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\EpsWriter' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/EpsWriter.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\GifWriter' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/GifWriter.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\PdfWriter' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/PdfWriter.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\PngWriter' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/PngWriter.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\AbstractResult' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/Result/AbstractResult.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\BinaryResult' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/Result/BinaryResult.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\ConsoleResult' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/Result/ConsoleResult.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\DebugResult' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/Result/DebugResult.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\EpsResult' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/Result/EpsResult.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\GdResult' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/Result/GdResult.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\GifResult' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/Result/GifResult.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\PdfResult' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/Result/PdfResult.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\PngResult' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/Result/PngResult.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\ResultInterface' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/Result/ResultInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\SvgResult' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/Result/SvgResult.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\Result\\WebPResult' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/Result/WebPResult.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\SvgWriter' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/SvgWriter.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\ValidatingWriterInterface' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/ValidatingWriterInterface.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\WebPWriter' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/WebPWriter.php', 'OCA\\Libresign\\Vendor\\Endroid\\QrCode\\Writer\\WriterInterface' => __DIR__ . '/..' . '/endroid/qr-code/src/Writer/WriterInterface.php', 'OCA\\Libresign\\Vendor\\Jeidison\\JSignPDF\\JSignFileService' => __DIR__ . '/..' . '/jsignpdf/jsignpdf-php/src/JSignFileService.php', 'OCA\\Libresign\\Vendor\\Jeidison\\JSignPDF\\JSignPDF' => __DIR__ . '/..' . '/jsignpdf/jsignpdf-php/src/JSignPDF.php', 'OCA\\Libresign\\Vendor\\Jeidison\\JSignPDF\\Runtime\\JSignPdfRuntimeService' => __DIR__ . '/..' . '/jsignpdf/jsignpdf-php/src/Runtime/JSignPdfRuntimeService.php', 'OCA\\Libresign\\Vendor\\Jeidison\\JSignPDF\\Runtime\\JavaRuntimeService' => __DIR__ . '/..' . '/jsignpdf/jsignpdf-php/src/Runtime/JavaRuntimeService.php', 'OCA\\Libresign\\Vendor\\Jeidison\\JSignPDF\\Sign\\JSignParam' => __DIR__ . '/..' . '/jsignpdf/jsignpdf-php/src/Sign/JSignParam.php', 'OCA\\Libresign\\Vendor\\Jeidison\\JSignPDF\\Sign\\JSignService' => __DIR__ . '/..' . '/jsignpdf/jsignpdf-php/src/Sign/JSignService.php', 'OCA\\Libresign\\Vendor\\LibreSign\\WhatOSAmI\\OperatingSystem' => __DIR__ . '/..' . '/libresign/whatosami/src/OperatingSystem.php', 'OCA\\Libresign\\Vendor\\Mpdf\\AssetFetcher' => __DIR__ . '/..' . '/mpdf/mpdf/src/AssetFetcher.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\AbstractBarcode' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/AbstractBarcode.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\BarcodeException' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/BarcodeException.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\BarcodeInterface' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/BarcodeInterface.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\Codabar' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/Codabar.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\Code11' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/Code11.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\Code128' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/Code128.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\Code39' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/Code39.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\Code93' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/Code93.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\EanExt' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/EanExt.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\EanUpc' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/EanUpc.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\I25' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/I25.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\Imb' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/Imb.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\Msi' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/Msi.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\Postnet' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/Postnet.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\Rm4Scc' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/Rm4Scc.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Barcode\\S25' => __DIR__ . '/..' . '/mpdf/mpdf/src/Barcode/S25.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Cache' => __DIR__ . '/..' . '/mpdf/mpdf/src/Cache.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Color\\ColorConverter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Color/ColorConverter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Color\\ColorModeConverter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Color/ColorModeConverter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Color\\ColorSpaceRestrictor' => __DIR__ . '/..' . '/mpdf/mpdf/src/Color/ColorSpaceRestrictor.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Color\\NamedColors' => __DIR__ . '/..' . '/mpdf/mpdf/src/Color/NamedColors.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Config\\ConfigVariables' => __DIR__ . '/..' . '/mpdf/mpdf/src/Config/ConfigVariables.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Config\\FontVariables' => __DIR__ . '/..' . '/mpdf/mpdf/src/Config/FontVariables.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Container\\ContainerInterface' => __DIR__ . '/..' . '/mpdf/mpdf/src/Container/ContainerInterface.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Container\\NotFoundException' => __DIR__ . '/..' . '/mpdf/mpdf/src/Container/NotFoundException.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Container\\SimpleContainer' => __DIR__ . '/..' . '/mpdf/mpdf/src/Container/SimpleContainer.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Conversion\\DecToAlpha' => __DIR__ . '/..' . '/mpdf/mpdf/src/Conversion/DecToAlpha.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Conversion\\DecToCjk' => __DIR__ . '/..' . '/mpdf/mpdf/src/Conversion/DecToCjk.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Conversion\\DecToHebrew' => __DIR__ . '/..' . '/mpdf/mpdf/src/Conversion/DecToHebrew.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Conversion\\DecToOther' => __DIR__ . '/..' . '/mpdf/mpdf/src/Conversion/DecToOther.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Conversion\\DecToRoman' => __DIR__ . '/..' . '/mpdf/mpdf/src/Conversion/DecToRoman.php', 'OCA\\Libresign\\Vendor\\Mpdf\\CssManager' => __DIR__ . '/..' . '/mpdf/mpdf/src/CssManager.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Css\\Border' => __DIR__ . '/..' . '/mpdf/mpdf/src/Css/Border.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Css\\DefaultCss' => __DIR__ . '/..' . '/mpdf/mpdf/src/Css/DefaultCss.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Css\\TextVars' => __DIR__ . '/..' . '/mpdf/mpdf/src/Css/TextVars.php', 'OCA\\Libresign\\Vendor\\Mpdf\\DirectWrite' => __DIR__ . '/..' . '/mpdf/mpdf/src/DirectWrite.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Exception\\AssetFetchingException' => __DIR__ . '/..' . '/mpdf/mpdf/src/Exception/AssetFetchingException.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Exception\\FontException' => __DIR__ . '/..' . '/mpdf/mpdf/src/Exception/FontException.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/mpdf/mpdf/src/Exception/InvalidArgumentException.php', 'OCA\\Libresign\\Vendor\\Mpdf\\File\\LocalContentLoader' => __DIR__ . '/..' . '/mpdf/mpdf/src/File/LocalContentLoader.php', 'OCA\\Libresign\\Vendor\\Mpdf\\File\\LocalContentLoaderInterface' => __DIR__ . '/..' . '/mpdf/mpdf/src/File/LocalContentLoaderInterface.php', 'OCA\\Libresign\\Vendor\\Mpdf\\File\\StreamWrapperChecker' => __DIR__ . '/..' . '/mpdf/mpdf/src/File/StreamWrapperChecker.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Fonts\\FontCache' => __DIR__ . '/..' . '/mpdf/mpdf/src/Fonts/FontCache.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Fonts\\FontFileFinder' => __DIR__ . '/..' . '/mpdf/mpdf/src/Fonts/FontFileFinder.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Fonts\\GlyphOperator' => __DIR__ . '/..' . '/mpdf/mpdf/src/Fonts/GlyphOperator.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Fonts\\MetricsGenerator' => __DIR__ . '/..' . '/mpdf/mpdf/src/Fonts/MetricsGenerator.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Form' => __DIR__ . '/..' . '/mpdf/mpdf/src/Form.php', 'OCA\\Libresign\\Vendor\\Mpdf\\FpdiTrait' => __DIR__ . '/..' . '/mpdf/mpdf/src/FpdiTrait.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Gif\\ColorTable' => __DIR__ . '/..' . '/mpdf/mpdf/src/Gif/ColorTable.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Gif\\FileHeader' => __DIR__ . '/..' . '/mpdf/mpdf/src/Gif/FileHeader.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Gif\\Gif' => __DIR__ . '/..' . '/mpdf/mpdf/src/Gif/Gif.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Gif\\Image' => __DIR__ . '/..' . '/mpdf/mpdf/src/Gif/Image.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Gif\\ImageHeader' => __DIR__ . '/..' . '/mpdf/mpdf/src/Gif/ImageHeader.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Gif\\Lzw' => __DIR__ . '/..' . '/mpdf/mpdf/src/Gif/Lzw.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Gradient' => __DIR__ . '/..' . '/mpdf/mpdf/src/Gradient.php', 'OCA\\Libresign\\Vendor\\Mpdf\\HTMLParserMode' => __DIR__ . '/..' . '/mpdf/mpdf/src/HTMLParserMode.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Http\\ClientInterface' => __DIR__ . '/..' . '/mpdf/mpdf/src/Http/ClientInterface.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Http\\CurlHttpClient' => __DIR__ . '/..' . '/mpdf/mpdf/src/Http/CurlHttpClient.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Http\\Exception\\ClientException' => __DIR__ . '/..' . '/mpdf/mpdf/src/Http/Exception/ClientException.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Http\\Exception\\ForbiddenRequestException' => __DIR__ . '/..' . '/mpdf/mpdf/src/Http/Exception/ForbiddenRequestException.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Http\\Exception\\NetworkException' => __DIR__ . '/..' . '/mpdf/mpdf/src/Http/Exception/NetworkException.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Http\\Exception\\RequestException' => __DIR__ . '/..' . '/mpdf/mpdf/src/Http/Exception/RequestException.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Http\\SocketHttpClient' => __DIR__ . '/..' . '/mpdf/mpdf/src/Http/SocketHttpClient.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Hyphenator' => __DIR__ . '/..' . '/mpdf/mpdf/src/Hyphenator.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Image\\Bmp' => __DIR__ . '/..' . '/mpdf/mpdf/src/Image/Bmp.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Image\\ImageProcessor' => __DIR__ . '/..' . '/mpdf/mpdf/src/Image/ImageProcessor.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Image\\ImageTypeGuesser' => __DIR__ . '/..' . '/mpdf/mpdf/src/Image/ImageTypeGuesser.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Image\\Svg' => __DIR__ . '/..' . '/mpdf/mpdf/src/Image/Svg.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Image\\Wmf' => __DIR__ . '/..' . '/mpdf/mpdf/src/Image/Wmf.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Language\\LanguageToFont' => __DIR__ . '/..' . '/mpdf/mpdf/src/Language/LanguageToFont.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Language\\LanguageToFontInterface' => __DIR__ . '/..' . '/mpdf/mpdf/src/Language/LanguageToFontInterface.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Language\\ScriptToLanguage' => __DIR__ . '/..' . '/mpdf/mpdf/src/Language/ScriptToLanguage.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Language\\ScriptToLanguageInterface' => __DIR__ . '/..' . '/mpdf/mpdf/src/Language/ScriptToLanguageInterface.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Log\\Context' => __DIR__ . '/..' . '/mpdf/mpdf/src/Log/Context.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Mpdf' => __DIR__ . '/..' . '/mpdf/mpdf/src/Mpdf.php', 'OCA\\Libresign\\Vendor\\Mpdf\\MpdfException' => __DIR__ . '/..' . '/mpdf/mpdf/src/MpdfException.php', 'OCA\\Libresign\\Vendor\\Mpdf\\MpdfImageException' => __DIR__ . '/..' . '/mpdf/mpdf/src/MpdfImageException.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Otl' => __DIR__ . '/..' . '/mpdf/mpdf/src/Otl.php', 'OCA\\Libresign\\Vendor\\Mpdf\\OtlDump' => __DIR__ . '/..' . '/mpdf/mpdf/src/OtlDump.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Output\\Destination' => __DIR__ . '/..' . '/mpdf/mpdf/src/Output/Destination.php', 'OCA\\Libresign\\Vendor\\Mpdf\\PageBox' => __DIR__ . '/..' . '/mpdf/mpdf/src/PageBox.php', 'OCA\\Libresign\\Vendor\\Mpdf\\PageFormat' => __DIR__ . '/..' . '/mpdf/mpdf/src/PageFormat.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Pdf\\Protection' => __DIR__ . '/..' . '/mpdf/mpdf/src/Pdf/Protection.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Pdf\\Protection\\UniqidGenerator' => __DIR__ . '/..' . '/mpdf/mpdf/src/Pdf/Protection/UniqidGenerator.php', 'OCA\\Libresign\\Vendor\\Mpdf\\PsrHttpMessageShim\\Request' => __DIR__ . '/..' . '/mpdf/psr-http-message-shim/src/Request.php', 'OCA\\Libresign\\Vendor\\Mpdf\\PsrHttpMessageShim\\Response' => __DIR__ . '/..' . '/mpdf/psr-http-message-shim/src/Response.php', 'OCA\\Libresign\\Vendor\\Mpdf\\PsrHttpMessageShim\\Stream' => __DIR__ . '/..' . '/mpdf/psr-http-message-shim/src/Stream.php', 'OCA\\Libresign\\Vendor\\Mpdf\\PsrHttpMessageShim\\Uri' => __DIR__ . '/..' . '/mpdf/psr-http-message-shim/src/Uri.php', 'OCA\\Libresign\\Vendor\\Mpdf\\PsrLogAwareTrait\\MpdfPsrLogAwareTrait' => __DIR__ . '/..' . '/mpdf/psr-log-aware-trait/src/MpdfPsrLogAwareTrait.php', 'OCA\\Libresign\\Vendor\\Mpdf\\PsrLogAwareTrait\\PsrLogAwareTrait' => __DIR__ . '/..' . '/mpdf/psr-log-aware-trait/src/PsrLogAwareTrait.php', 'OCA\\Libresign\\Vendor\\Mpdf\\ServiceFactory' => __DIR__ . '/..' . '/mpdf/mpdf/src/ServiceFactory.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Shaper\\Indic' => __DIR__ . '/..' . '/mpdf/mpdf/src/Shaper/Indic.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Shaper\\Myanmar' => __DIR__ . '/..' . '/mpdf/mpdf/src/Shaper/Myanmar.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Shaper\\Sea' => __DIR__ . '/..' . '/mpdf/mpdf/src/Shaper/Sea.php', 'OCA\\Libresign\\Vendor\\Mpdf\\SizeConverter' => __DIR__ . '/..' . '/mpdf/mpdf/src/SizeConverter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Strict' => __DIR__ . '/..' . '/mpdf/mpdf/src/Strict.php', 'OCA\\Libresign\\Vendor\\Mpdf\\TTFontFile' => __DIR__ . '/..' . '/mpdf/mpdf/src/TTFontFile.php', 'OCA\\Libresign\\Vendor\\Mpdf\\TTFontFileAnalysis' => __DIR__ . '/..' . '/mpdf/mpdf/src/TTFontFileAnalysis.php', 'OCA\\Libresign\\Vendor\\Mpdf\\TableOfContents' => __DIR__ . '/..' . '/mpdf/mpdf/src/TableOfContents.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\A' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/A.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Acronym' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Acronym.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Address' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Address.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Annotation' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Annotation.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Article' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Article.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Aside' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Aside.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\B' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/B.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\BarCode' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/BarCode.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Bdi' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Bdi.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Bdo' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Bdo.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Big' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Big.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\BlockQuote' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/BlockQuote.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\BlockTag' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/BlockTag.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Bookmark' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Bookmark.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Br' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Br.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Caption' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Caption.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Center' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Center.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Cite' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Cite.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Code' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Code.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\ColumnBreak' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/ColumnBreak.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Columns' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Columns.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Dd' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Dd.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Del' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Del.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Details' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Details.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Div' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Div.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Dl' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Dl.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\DotTab' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/DotTab.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Dt' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Dt.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Em' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Em.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\FieldSet' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/FieldSet.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\FigCaption' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/FigCaption.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Figure' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Figure.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Font' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Font.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Footer' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Footer.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Form' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Form.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\FormFeed' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/FormFeed.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\H1' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/H1.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\H2' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/H2.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\H3' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/H3.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\H4' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/H4.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\H5' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/H5.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\H6' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/H6.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\HGroup' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/HGroup.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Header' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Header.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Hr' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Hr.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\I' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/I.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Img' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Img.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\IndexEntry' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/IndexEntry.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\IndexInsert' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/IndexInsert.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\InlineTag' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/InlineTag.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Input' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Input.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Ins' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Ins.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Kbd' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Kbd.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Legend' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Legend.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Li' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Li.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Main' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Main.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Mark' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Mark.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Meter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Meter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Nav' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Nav.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\NewColumn' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/NewColumn.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\NewPage' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/NewPage.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Ol' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Ol.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Option' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Option.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\P' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/P.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\PageBreak' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/PageBreak.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\PageFooter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/PageFooter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\PageHeader' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/PageHeader.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Pre' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Pre.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Progress' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Progress.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Q' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Q.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\S' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/S.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Samp' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Samp.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Section' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Section.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Select' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Select.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\SetHtmlPageFooter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/SetHtmlPageFooter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\SetHtmlPageHeader' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/SetHtmlPageHeader.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\SetPageFooter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/SetPageFooter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\SetPageHeader' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/SetPageHeader.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Small' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Small.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Span' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Span.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Strike' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Strike.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Strong' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Strong.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Sub' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Sub.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\SubstituteTag' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/SubstituteTag.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Summary' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Summary.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Sup' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Sup.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\TBody' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/TBody.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\TFoot' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/TFoot.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\THead' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/THead.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Table' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Table.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Tag' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Tag.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Td' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Td.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\TextArea' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/TextArea.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\TextCircle' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/TextCircle.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Th' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Th.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Time' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Time.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Toc' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Toc.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\TocEntry' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/TocEntry.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\TocPageBreak' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/TocPageBreak.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Tr' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Tr.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Tt' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Tt.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Tta' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Tta.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Tts' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Tts.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Ttz' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Ttz.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\U' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/U.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\Ul' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/Ul.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\VarTag' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/VarTag.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\WatermarkImage' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/WatermarkImage.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Tag\\WatermarkText' => __DIR__ . '/..' . '/mpdf/mpdf/src/Tag/WatermarkText.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Ucdn' => __DIR__ . '/..' . '/mpdf/mpdf/src/Ucdn.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Utils\\Arrays' => __DIR__ . '/..' . '/mpdf/mpdf/src/Utils/Arrays.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Utils\\NumericString' => __DIR__ . '/..' . '/mpdf/mpdf/src/Utils/NumericString.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Utils\\PdfDate' => __DIR__ . '/..' . '/mpdf/mpdf/src/Utils/PdfDate.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Utils\\UtfString' => __DIR__ . '/..' . '/mpdf/mpdf/src/Utils/UtfString.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Watermark' => __DIR__ . '/..' . '/mpdf/mpdf/src/Watermark.php', 'OCA\\Libresign\\Vendor\\Mpdf\\WatermarkImage' => __DIR__ . '/..' . '/mpdf/mpdf/src/WatermarkImage.php', 'OCA\\Libresign\\Vendor\\Mpdf\\WatermarkText' => __DIR__ . '/..' . '/mpdf/mpdf/src/WatermarkText.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\BackgroundWriter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Writer/BackgroundWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\BaseWriter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Writer/BaseWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\BookmarkWriter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Writer/BookmarkWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\ColorWriter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Writer/ColorWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\FontWriter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Writer/FontWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\FormWriter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Writer/FormWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\ImageWriter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Writer/ImageWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\JavaScriptWriter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Writer/JavaScriptWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\MetadataWriter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Writer/MetadataWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\ObjectWriter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Writer/ObjectWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\OptionalContentWriter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Writer/OptionalContentWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\PageWriter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Writer/PageWriter.php', 'OCA\\Libresign\\Vendor\\Mpdf\\Writer\\ResourceWriter' => __DIR__ . '/..' . '/mpdf/mpdf/src/Writer/ResourceWriter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Adapter\\AdapterInterface' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/Adapter/AdapterInterface.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Adapter\\ArrayAdapter' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/Adapter/ArrayAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Adapter\\CallbackAdapter' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/Adapter/CallbackAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Adapter\\ConcatenationAdapter' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/Adapter/ConcatenationAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Adapter\\EmptyAdapter' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/Adapter/EmptyAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Adapter\\FixedAdapter' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/Adapter/FixedAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Adapter\\NullAdapter' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/Adapter/NullAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Adapter\\TransformingAdapter' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/Adapter/TransformingAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Doctrine\\Collections\\CollectionAdapter' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/Collections/CollectionAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Doctrine\\Collections\\SelectableAdapter' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/Collections/SelectableAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Doctrine\\DBAL\\QueryAdapter' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/DBAL/QueryAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Doctrine\\DBAL\\SingleTableQueryAdapter' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/DBAL/SingleTableQueryAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Doctrine\\MongoDBODM\\AggregationAdapter' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/MongoDBODM/AggregationAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Doctrine\\MongoDBODM\\QueryAdapter' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/MongoDBODM/QueryAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Doctrine\\ORM\\QueryAdapter' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/ORM/QueryAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Doctrine\\PHPCRODM\\QueryAdapter' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Adapter/Doctrine/PHPCRODM/QueryAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Elastica\\ElasticaAdapter' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Adapter/Elastica/ElasticaAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\InvalidArgumentException' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/Exception/InvalidArgumentException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\LessThan1CurrentPageException' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/Exception/LessThan1CurrentPageException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\LessThan1MaxPagesException' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/Exception/LessThan1MaxPagesException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\LessThan1MaxPerPageException' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/Exception/LessThan1MaxPerPageException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\LogicException' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/Exception/LogicException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\NotValidCurrentPageException' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/Exception/NotValidCurrentPageException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\NotValidMaxPerPageException' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/Exception/NotValidMaxPerPageException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\NotValidResultCountException' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/Exception/NotValidResultCountException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\OutOfBoundsException' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/Exception/OutOfBoundsException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\OutOfRangeCurrentPageException' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/Exception/OutOfRangeCurrentPageException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\PagerfantaException' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/Exception/PagerfantaException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Exception\\RuntimeException' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/Exception/RuntimeException.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Pagerfanta' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/Pagerfanta.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\PagerfantaInterface' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/PagerfantaInterface.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\RouteGenerator\\RouteGeneratorDecorator' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/RouteGenerator/RouteGeneratorDecorator.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\RouteGenerator\\RouteGeneratorFactoryInterface' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/RouteGenerator/RouteGeneratorFactoryInterface.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\RouteGenerator\\RouteGeneratorInterface' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/RouteGenerator/RouteGeneratorInterface.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Solarium\\SolariumAdapter' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Adapter/Solarium/SolariumAdapter.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Twig\\Extension\\PagerfantaExtension' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Twig/Extension/PagerfantaExtension.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Twig\\Extension\\PagerfantaRuntime' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Twig/Extension/PagerfantaRuntime.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\Twig\\View\\TwigView' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Twig/View/TwigView.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\DefaultView' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/View/DefaultView.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\Foundation6View' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/View/Foundation6View.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\OptionableView' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/View/OptionableView.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\SemanticUiView' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/View/SemanticUiView.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\TemplateView' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/View/TemplateView.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\Template\\DefaultTemplate' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/View/Template/DefaultTemplate.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\Template\\Foundation6Template' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/View/Template/Foundation6Template.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\Template\\SemanticUiTemplate' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/View/Template/SemanticUiTemplate.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\Template\\Template' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/View/Template/Template.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\Template\\TemplateInterface' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/View/Template/TemplateInterface.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\Template\\TwitterBootstrap3Template' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/View/Template/TwitterBootstrap3Template.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\Template\\TwitterBootstrap4Template' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/View/Template/TwitterBootstrap4Template.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\Template\\TwitterBootstrap5Template' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/View/Template/TwitterBootstrap5Template.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\Template\\TwitterBootstrapTemplate' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/View/Template/TwitterBootstrapTemplate.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\TwitterBootstrap3View' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/View/TwitterBootstrap3View.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\TwitterBootstrap4View' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/View/TwitterBootstrap4View.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\TwitterBootstrap5View' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/View/TwitterBootstrap5View.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\TwitterBootstrapView' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/View/TwitterBootstrapView.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\View' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/View/View.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\ViewFactory' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/View/ViewFactory.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\ViewFactoryInterface' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/View/ViewFactoryInterface.php', 'OCA\\Libresign\\Vendor\\Pagerfanta\\View\\ViewInterface' => __DIR__ . '/..' . '/pagerfanta/pagerfanta/lib/Core/View/ViewInterface.php', 'OCA\\Libresign\\Vendor\\Psr\\Http\\Message\\MessageInterface' => __DIR__ . '/..' . '/psr/http-message/src/MessageInterface.php', 'OCA\\Libresign\\Vendor\\Psr\\Http\\Message\\RequestInterface' => __DIR__ . '/..' . '/psr/http-message/src/RequestInterface.php', 'OCA\\Libresign\\Vendor\\Psr\\Http\\Message\\ResponseInterface' => __DIR__ . '/..' . '/psr/http-message/src/ResponseInterface.php', 'OCA\\Libresign\\Vendor\\Psr\\Http\\Message\\ServerRequestInterface' => __DIR__ . '/..' . '/psr/http-message/src/ServerRequestInterface.php', 'OCA\\Libresign\\Vendor\\Psr\\Http\\Message\\StreamInterface' => __DIR__ . '/..' . '/psr/http-message/src/StreamInterface.php', 'OCA\\Libresign\\Vendor\\Psr\\Http\\Message\\UploadedFileInterface' => __DIR__ . '/..' . '/psr/http-message/src/UploadedFileInterface.php', 'OCA\\Libresign\\Vendor\\Psr\\Http\\Message\\UriInterface' => __DIR__ . '/..' . '/psr/http-message/src/UriInterface.php', 'OCA\\Libresign\\Vendor\\Psr\\Log\\AbstractLogger' => __DIR__ . '/..' . '/psr/log/src/AbstractLogger.php', 'OCA\\Libresign\\Vendor\\Psr\\Log\\InvalidArgumentException' => __DIR__ . '/..' . '/psr/log/src/InvalidArgumentException.php', 'OCA\\Libresign\\Vendor\\Psr\\Log\\LogLevel' => __DIR__ . '/..' . '/psr/log/src/LogLevel.php', 'OCA\\Libresign\\Vendor\\Psr\\Log\\LoggerAwareInterface' => __DIR__ . '/..' . '/psr/log/src/LoggerAwareInterface.php', 'OCA\\Libresign\\Vendor\\Psr\\Log\\LoggerAwareTrait' => __DIR__ . '/..' . '/psr/log/src/LoggerAwareTrait.php', 'OCA\\Libresign\\Vendor\\Psr\\Log\\LoggerInterface' => __DIR__ . '/..' . '/psr/log/src/LoggerInterface.php', 'OCA\\Libresign\\Vendor\\Psr\\Log\\LoggerTrait' => __DIR__ . '/..' . '/psr/log/src/LoggerTrait.php', 'OCA\\Libresign\\Vendor\\Psr\\Log\\NullLogger' => __DIR__ . '/..' . '/psr/log/src/NullLogger.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Config' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Config.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Document' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Document.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Element.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element\\ElementArray' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementArray.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element\\ElementBoolean' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementBoolean.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element\\ElementDate' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementDate.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element\\ElementHexa' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementHexa.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element\\ElementMissing' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementMissing.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element\\ElementName' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementName.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element\\ElementNull' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementNull.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element\\ElementNumeric' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementNumeric.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element\\ElementString' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementString.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element\\ElementStruct' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementStruct.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Element\\ElementXRef' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Element/ElementXRef.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Encoding' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Encoding.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Encoding\\AbstractEncoding' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Encoding/AbstractEncoding.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Encoding\\EncodingLocator' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Encoding/EncodingLocator.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Encoding\\ISOLatin1Encoding' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Encoding/ISOLatin1Encoding.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Encoding\\ISOLatin9Encoding' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Encoding/ISOLatin9Encoding.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Encoding\\MacRomanEncoding' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Encoding/MacRomanEncoding.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Encoding\\PDFDocEncoding' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Encoding/PDFDocEncoding.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Encoding\\PostScriptGlyphs' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Encoding/PostScriptGlyphs.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Encoding\\StandardEncoding' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Encoding/StandardEncoding.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Encoding\\WinAnsiEncoding' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Encoding/WinAnsiEncoding.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Exception\\EmptyPdfException' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Exception/EmptyPdfException.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Exception\\EncodingNotFoundException' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Exception/EncodingNotFoundException.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Exception\\InvalidDictionaryObjectException' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Exception/InvalidDictionaryObjectException.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Exception\\MissingCatalogException' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Exception/MissingCatalogException.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Exception\\MissingPdfHeaderException' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Exception/MissingPdfHeaderException.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Exception\\NotImplementedException' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Exception/NotImplementedException.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Font' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Font.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Font\\FontCIDFontType0' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Font/FontCIDFontType0.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Font\\FontCIDFontType2' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Font/FontCIDFontType2.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Font\\FontTrueType' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Font/FontTrueType.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Font\\FontType0' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Font/FontType0.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Font\\FontType1' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Font/FontType1.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Font\\FontType3' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Font/FontType3.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Header' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Header.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\PDFObject' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/PDFObject.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Page' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Page.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Pages' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Pages.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\Parser' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/Parser.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\RawData\\FilterHelper' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/RawData/FilterHelper.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\RawData\\RawDataParser' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/RawData/RawDataParser.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\XObject\\Form' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/XObject/Form.php', 'OCA\\Libresign\\Vendor\\Smalot\\PdfParser\\XObject\\Image' => __DIR__ . '/..' . '/smalot/pdfparser/src/Smalot/PdfParser/XObject/Image.php', 'OCA\\Libresign\\Vendor\\Symfony\\Polyfill\\Ctype\\Ctype' => __DIR__ . '/..' . '/symfony/polyfill-ctype/Ctype.php', 'OCA\\Libresign\\Vendor\\Symfony\\Polyfill\\Mbstring\\Mbstring' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/Mbstring.php', 'OCA\\Libresign\\Vendor\\Twig\\AbstractTwigCallable' => __DIR__ . '/..' . '/twig/twig/src/AbstractTwigCallable.php', 'OCA\\Libresign\\Vendor\\Twig\\Attribute\\AsTwigFilter' => __DIR__ . '/..' . '/twig/twig/src/Attribute/AsTwigFilter.php', 'OCA\\Libresign\\Vendor\\Twig\\Attribute\\AsTwigFunction' => __DIR__ . '/..' . '/twig/twig/src/Attribute/AsTwigFunction.php', 'OCA\\Libresign\\Vendor\\Twig\\Attribute\\AsTwigTest' => __DIR__ . '/..' . '/twig/twig/src/Attribute/AsTwigTest.php', 'OCA\\Libresign\\Vendor\\Twig\\Attribute\\FirstClassTwigCallableReady' => __DIR__ . '/..' . '/twig/twig/src/Attribute/FirstClassTwigCallableReady.php', 'OCA\\Libresign\\Vendor\\Twig\\Attribute\\YieldReady' => __DIR__ . '/..' . '/twig/twig/src/Attribute/YieldReady.php', 'OCA\\Libresign\\Vendor\\Twig\\Cache\\CacheInterface' => __DIR__ . '/..' . '/twig/twig/src/Cache/CacheInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Cache\\ChainCache' => __DIR__ . '/..' . '/twig/twig/src/Cache/ChainCache.php', 'OCA\\Libresign\\Vendor\\Twig\\Cache\\FilesystemCache' => __DIR__ . '/..' . '/twig/twig/src/Cache/FilesystemCache.php', 'OCA\\Libresign\\Vendor\\Twig\\Cache\\NullCache' => __DIR__ . '/..' . '/twig/twig/src/Cache/NullCache.php', 'OCA\\Libresign\\Vendor\\Twig\\Cache\\ReadOnlyFilesystemCache' => __DIR__ . '/..' . '/twig/twig/src/Cache/ReadOnlyFilesystemCache.php', 'OCA\\Libresign\\Vendor\\Twig\\Cache\\RemovableCacheInterface' => __DIR__ . '/..' . '/twig/twig/src/Cache/RemovableCacheInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Compiler' => __DIR__ . '/..' . '/twig/twig/src/Compiler.php', 'OCA\\Libresign\\Vendor\\Twig\\DeprecatedCallableInfo' => __DIR__ . '/..' . '/twig/twig/src/DeprecatedCallableInfo.php', 'OCA\\Libresign\\Vendor\\Twig\\Environment' => __DIR__ . '/..' . '/twig/twig/src/Environment.php', 'OCA\\Libresign\\Vendor\\Twig\\Error\\Error' => __DIR__ . '/..' . '/twig/twig/src/Error/Error.php', 'OCA\\Libresign\\Vendor\\Twig\\Error\\LoaderError' => __DIR__ . '/..' . '/twig/twig/src/Error/LoaderError.php', 'OCA\\Libresign\\Vendor\\Twig\\Error\\RuntimeError' => __DIR__ . '/..' . '/twig/twig/src/Error/RuntimeError.php', 'OCA\\Libresign\\Vendor\\Twig\\Error\\SyntaxError' => __DIR__ . '/..' . '/twig/twig/src/Error/SyntaxError.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\AbstractExpressionParser' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser/AbstractExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\ExpressionParserDescriptionInterface' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser/ExpressionParserDescriptionInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\ExpressionParserInterface' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser/ExpressionParserInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\ExpressionParserType' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser/ExpressionParserType.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\ExpressionParsers' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser/ExpressionParsers.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\InfixAssociativity' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser/InfixAssociativity.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\InfixExpressionParserInterface' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser/InfixExpressionParserInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Infix\\ArgumentsTrait' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser/Infix/ArgumentsTrait.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Infix\\ArrowExpressionParser' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser/Infix/ArrowExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Infix\\BinaryOperatorExpressionParser' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser/Infix/BinaryOperatorExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Infix\\ConditionalTernaryExpressionParser' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser/Infix/ConditionalTernaryExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Infix\\DotExpressionParser' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser/Infix/DotExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Infix\\FilterExpressionParser' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser/Infix/FilterExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Infix\\FunctionExpressionParser' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser/Infix/FunctionExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Infix\\IsExpressionParser' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser/Infix/IsExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Infix\\IsNotExpressionParser' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser/Infix/IsNotExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Infix\\SquareBracketExpressionParser' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser/Infix/SquareBracketExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\PrecedenceChange' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser/PrecedenceChange.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\PrefixExpressionParserInterface' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser/PrefixExpressionParserInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Prefix\\GroupingExpressionParser' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser/Prefix/GroupingExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Prefix\\LiteralExpressionParser' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser/Prefix/LiteralExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExpressionParser\\Prefix\\UnaryOperatorExpressionParser' => __DIR__ . '/..' . '/twig/twig/src/ExpressionParser/Prefix/UnaryOperatorExpressionParser.php', 'OCA\\Libresign\\Vendor\\Twig\\ExtensionSet' => __DIR__ . '/..' . '/twig/twig/src/ExtensionSet.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\AbstractExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/AbstractExtension.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\AttributeExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/AttributeExtension.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\CoreExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/CoreExtension.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\DebugExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/DebugExtension.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\EscaperExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/EscaperExtension.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\ExtensionInterface' => __DIR__ . '/..' . '/twig/twig/src/Extension/ExtensionInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\GlobalsInterface' => __DIR__ . '/..' . '/twig/twig/src/Extension/GlobalsInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\LastModifiedExtensionInterface' => __DIR__ . '/..' . '/twig/twig/src/Extension/LastModifiedExtensionInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\OptimizerExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/OptimizerExtension.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\ProfilerExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/ProfilerExtension.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\RuntimeExtensionInterface' => __DIR__ . '/..' . '/twig/twig/src/Extension/RuntimeExtensionInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\SandboxExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/SandboxExtension.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\StagingExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/StagingExtension.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\StringLoaderExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/StringLoaderExtension.php', 'OCA\\Libresign\\Vendor\\Twig\\Extension\\YieldNotReadyExtension' => __DIR__ . '/..' . '/twig/twig/src/Extension/YieldNotReadyExtension.php', 'OCA\\Libresign\\Vendor\\Twig\\FileExtensionEscapingStrategy' => __DIR__ . '/..' . '/twig/twig/src/FileExtensionEscapingStrategy.php', 'OCA\\Libresign\\Vendor\\Twig\\Lexer' => __DIR__ . '/..' . '/twig/twig/src/Lexer.php', 'OCA\\Libresign\\Vendor\\Twig\\Loader\\ArrayLoader' => __DIR__ . '/..' . '/twig/twig/src/Loader/ArrayLoader.php', 'OCA\\Libresign\\Vendor\\Twig\\Loader\\ChainLoader' => __DIR__ . '/..' . '/twig/twig/src/Loader/ChainLoader.php', 'OCA\\Libresign\\Vendor\\Twig\\Loader\\FilesystemLoader' => __DIR__ . '/..' . '/twig/twig/src/Loader/FilesystemLoader.php', 'OCA\\Libresign\\Vendor\\Twig\\Loader\\LoaderInterface' => __DIR__ . '/..' . '/twig/twig/src/Loader/LoaderInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Markup' => __DIR__ . '/..' . '/twig/twig/src/Markup.php', 'OCA\\Libresign\\Vendor\\Twig\\NodeTraverser' => __DIR__ . '/..' . '/twig/twig/src/NodeTraverser.php', 'OCA\\Libresign\\Vendor\\Twig\\NodeVisitor\\AbstractNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/AbstractNodeVisitor.php', 'OCA\\Libresign\\Vendor\\Twig\\NodeVisitor\\EscaperNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/EscaperNodeVisitor.php', 'OCA\\Libresign\\Vendor\\Twig\\NodeVisitor\\NodeVisitorInterface' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/NodeVisitorInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\NodeVisitor\\OptimizerNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/OptimizerNodeVisitor.php', 'OCA\\Libresign\\Vendor\\Twig\\NodeVisitor\\SafeAnalysisNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/SafeAnalysisNodeVisitor.php', 'OCA\\Libresign\\Vendor\\Twig\\NodeVisitor\\SandboxNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/SandboxNodeVisitor.php', 'OCA\\Libresign\\Vendor\\Twig\\NodeVisitor\\YieldNotReadyNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/NodeVisitor/YieldNotReadyNodeVisitor.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\AutoEscapeNode' => __DIR__ . '/..' . '/twig/twig/src/Node/AutoEscapeNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\BlockNode' => __DIR__ . '/..' . '/twig/twig/src/Node/BlockNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\BlockReferenceNode' => __DIR__ . '/..' . '/twig/twig/src/Node/BlockReferenceNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\BodyNode' => __DIR__ . '/..' . '/twig/twig/src/Node/BodyNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\CaptureNode' => __DIR__ . '/..' . '/twig/twig/src/Node/CaptureNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\CheckSecurityCallNode' => __DIR__ . '/..' . '/twig/twig/src/Node/CheckSecurityCallNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\CheckSecurityNode' => __DIR__ . '/..' . '/twig/twig/src/Node/CheckSecurityNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\CheckToStringNode' => __DIR__ . '/..' . '/twig/twig/src/Node/CheckToStringNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\DeprecatedNode' => __DIR__ . '/..' . '/twig/twig/src/Node/DeprecatedNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\DoNode' => __DIR__ . '/..' . '/twig/twig/src/Node/DoNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\EmbedNode' => __DIR__ . '/..' . '/twig/twig/src/Node/EmbedNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\EmptyNode' => __DIR__ . '/..' . '/twig/twig/src/Node/EmptyNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\AbstractExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/AbstractExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\ArrayExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/ArrayExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\ArrowFunctionExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/ArrowFunctionExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\AssignNameExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/AssignNameExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\AbstractBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/AbstractBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\AddBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/AddBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\AndBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/AndBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\BinaryInterface' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/BinaryInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\BitwiseAndBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/BitwiseAndBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\BitwiseOrBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/BitwiseOrBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\BitwiseXorBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/BitwiseXorBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\ConcatBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/ConcatBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\DivBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/DivBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\ElvisBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/ElvisBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\EndsWithBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/EndsWithBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\EqualBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/EqualBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\FloorDivBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/FloorDivBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\GreaterBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/GreaterBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\GreaterEqualBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/GreaterEqualBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\HasEveryBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/HasEveryBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\HasSomeBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/HasSomeBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\InBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/InBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\LessBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/LessBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\LessEqualBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/LessEqualBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\MatchesBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/MatchesBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\ModBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/ModBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\MulBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/MulBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\NotEqualBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/NotEqualBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\NotInBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/NotInBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\NullCoalesceBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/NullCoalesceBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\OrBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/OrBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\PowerBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/PowerBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\RangeBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/RangeBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\SpaceshipBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/SpaceshipBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\StartsWithBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/StartsWithBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\SubBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/SubBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Binary\\XorBinary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Binary/XorBinary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\BlockReferenceExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/BlockReferenceExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\CallExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/CallExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\ConditionalExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/ConditionalExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\ConstantExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/ConstantExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\FilterExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/FilterExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Filter\\DefaultFilter' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Filter/DefaultFilter.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Filter\\RawFilter' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Filter/RawFilter.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\FunctionExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/FunctionExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\FunctionNode\\EnumCasesFunction' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/FunctionNode/EnumCasesFunction.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\FunctionNode\\EnumFunction' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/FunctionNode/EnumFunction.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\GetAttrExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/GetAttrExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\InlinePrint' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/InlinePrint.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\ListExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/ListExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\MacroReferenceExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/MacroReferenceExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\MethodCallExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/MethodCallExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\NameExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/NameExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\NullCoalesceExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/NullCoalesceExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\OperatorEscapeInterface' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/OperatorEscapeInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\ParentExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/ParentExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\ReturnArrayInterface' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/ReturnArrayInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\ReturnBoolInterface' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/ReturnBoolInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\ReturnNumberInterface' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/ReturnNumberInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\ReturnPrimitiveTypeInterface' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/ReturnPrimitiveTypeInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\ReturnStringInterface' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/ReturnStringInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\SupportDefinedTestDeprecationTrait' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/SupportDefinedTestDeprecationTrait.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\SupportDefinedTestInterface' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/SupportDefinedTestInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\SupportDefinedTestTrait' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/SupportDefinedTestTrait.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\TempNameExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/TempNameExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Ternary\\ConditionalTernary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Ternary/ConditionalTernary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\TestExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/TestExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Test\\ConstantTest' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Test/ConstantTest.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Test\\DefinedTest' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Test/DefinedTest.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Test\\DivisiblebyTest' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Test/DivisiblebyTest.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Test\\EvenTest' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Test/EvenTest.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Test\\NullTest' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Test/NullTest.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Test\\OddTest' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Test/OddTest.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Test\\SameasTest' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Test/SameasTest.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Test\\TrueTest' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Test/TrueTest.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Unary\\AbstractUnary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Unary/AbstractUnary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Unary\\NegUnary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Unary/NegUnary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Unary\\NotUnary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Unary/NotUnary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Unary\\PosUnary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Unary/PosUnary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Unary\\SpreadUnary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Unary/SpreadUnary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Unary\\StringCastUnary' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Unary/StringCastUnary.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Unary\\UnaryInterface' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Unary/UnaryInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Variable\\AssignContextVariable' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Variable/AssignContextVariable.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Variable\\AssignTemplateVariable' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Variable/AssignTemplateVariable.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Variable\\ContextVariable' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Variable/ContextVariable.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Variable\\LocalVariable' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Variable/LocalVariable.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\Variable\\TemplateVariable' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/Variable/TemplateVariable.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Expression\\VariadicExpression' => __DIR__ . '/..' . '/twig/twig/src/Node/Expression/VariadicExpression.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\FlushNode' => __DIR__ . '/..' . '/twig/twig/src/Node/FlushNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\ForElseNode' => __DIR__ . '/..' . '/twig/twig/src/Node/ForElseNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\ForLoopNode' => __DIR__ . '/..' . '/twig/twig/src/Node/ForLoopNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\ForNode' => __DIR__ . '/..' . '/twig/twig/src/Node/ForNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\IfNode' => __DIR__ . '/..' . '/twig/twig/src/Node/IfNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\ImportNode' => __DIR__ . '/..' . '/twig/twig/src/Node/ImportNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\IncludeNode' => __DIR__ . '/..' . '/twig/twig/src/Node/IncludeNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\MacroNode' => __DIR__ . '/..' . '/twig/twig/src/Node/MacroNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\ModuleNode' => __DIR__ . '/..' . '/twig/twig/src/Node/ModuleNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\NameDeprecation' => __DIR__ . '/..' . '/twig/twig/src/Node/NameDeprecation.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Node' => __DIR__ . '/..' . '/twig/twig/src/Node/Node.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\NodeCaptureInterface' => __DIR__ . '/..' . '/twig/twig/src/Node/NodeCaptureInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\NodeOutputInterface' => __DIR__ . '/..' . '/twig/twig/src/Node/NodeOutputInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\Nodes' => __DIR__ . '/..' . '/twig/twig/src/Node/Nodes.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\PrintNode' => __DIR__ . '/..' . '/twig/twig/src/Node/PrintNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\SandboxNode' => __DIR__ . '/..' . '/twig/twig/src/Node/SandboxNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\SetNode' => __DIR__ . '/..' . '/twig/twig/src/Node/SetNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\TextNode' => __DIR__ . '/..' . '/twig/twig/src/Node/TextNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\TypesNode' => __DIR__ . '/..' . '/twig/twig/src/Node/TypesNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Node\\WithNode' => __DIR__ . '/..' . '/twig/twig/src/Node/WithNode.php', 'OCA\\Libresign\\Vendor\\Twig\\OperatorPrecedenceChange' => __DIR__ . '/..' . '/twig/twig/src/OperatorPrecedenceChange.php', 'OCA\\Libresign\\Vendor\\Twig\\Parser' => __DIR__ . '/..' . '/twig/twig/src/Parser.php', 'OCA\\Libresign\\Vendor\\Twig\\Profiler\\Dumper\\BaseDumper' => __DIR__ . '/..' . '/twig/twig/src/Profiler/Dumper/BaseDumper.php', 'OCA\\Libresign\\Vendor\\Twig\\Profiler\\Dumper\\BlackfireDumper' => __DIR__ . '/..' . '/twig/twig/src/Profiler/Dumper/BlackfireDumper.php', 'OCA\\Libresign\\Vendor\\Twig\\Profiler\\Dumper\\HtmlDumper' => __DIR__ . '/..' . '/twig/twig/src/Profiler/Dumper/HtmlDumper.php', 'OCA\\Libresign\\Vendor\\Twig\\Profiler\\Dumper\\TextDumper' => __DIR__ . '/..' . '/twig/twig/src/Profiler/Dumper/TextDumper.php', 'OCA\\Libresign\\Vendor\\Twig\\Profiler\\NodeVisitor\\ProfilerNodeVisitor' => __DIR__ . '/..' . '/twig/twig/src/Profiler/NodeVisitor/ProfilerNodeVisitor.php', 'OCA\\Libresign\\Vendor\\Twig\\Profiler\\Node\\EnterProfileNode' => __DIR__ . '/..' . '/twig/twig/src/Profiler/Node/EnterProfileNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Profiler\\Node\\LeaveProfileNode' => __DIR__ . '/..' . '/twig/twig/src/Profiler/Node/LeaveProfileNode.php', 'OCA\\Libresign\\Vendor\\Twig\\Profiler\\Profile' => __DIR__ . '/..' . '/twig/twig/src/Profiler/Profile.php', 'OCA\\Libresign\\Vendor\\Twig\\RuntimeLoader\\ContainerRuntimeLoader' => __DIR__ . '/..' . '/twig/twig/src/RuntimeLoader/ContainerRuntimeLoader.php', 'OCA\\Libresign\\Vendor\\Twig\\RuntimeLoader\\FactoryRuntimeLoader' => __DIR__ . '/..' . '/twig/twig/src/RuntimeLoader/FactoryRuntimeLoader.php', 'OCA\\Libresign\\Vendor\\Twig\\RuntimeLoader\\RuntimeLoaderInterface' => __DIR__ . '/..' . '/twig/twig/src/RuntimeLoader/RuntimeLoaderInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Runtime\\EscaperRuntime' => __DIR__ . '/..' . '/twig/twig/src/Runtime/EscaperRuntime.php', 'OCA\\Libresign\\Vendor\\Twig\\Sandbox\\SecurityError' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityError.php', 'OCA\\Libresign\\Vendor\\Twig\\Sandbox\\SecurityNotAllowedFilterError' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityNotAllowedFilterError.php', 'OCA\\Libresign\\Vendor\\Twig\\Sandbox\\SecurityNotAllowedFunctionError' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityNotAllowedFunctionError.php', 'OCA\\Libresign\\Vendor\\Twig\\Sandbox\\SecurityNotAllowedMethodError' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityNotAllowedMethodError.php', 'OCA\\Libresign\\Vendor\\Twig\\Sandbox\\SecurityNotAllowedPropertyError' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityNotAllowedPropertyError.php', 'OCA\\Libresign\\Vendor\\Twig\\Sandbox\\SecurityNotAllowedTagError' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityNotAllowedTagError.php', 'OCA\\Libresign\\Vendor\\Twig\\Sandbox\\SecurityPolicy' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityPolicy.php', 'OCA\\Libresign\\Vendor\\Twig\\Sandbox\\SecurityPolicyInterface' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SecurityPolicyInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Sandbox\\SourcePolicyInterface' => __DIR__ . '/..' . '/twig/twig/src/Sandbox/SourcePolicyInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\Source' => __DIR__ . '/..' . '/twig/twig/src/Source.php', 'OCA\\Libresign\\Vendor\\Twig\\Template' => __DIR__ . '/..' . '/twig/twig/src/Template.php', 'OCA\\Libresign\\Vendor\\Twig\\TemplateWrapper' => __DIR__ . '/..' . '/twig/twig/src/TemplateWrapper.php', 'OCA\\Libresign\\Vendor\\Twig\\Test\\IntegrationTestCase' => __DIR__ . '/..' . '/twig/twig/src/Test/IntegrationTestCase.php', 'OCA\\Libresign\\Vendor\\Twig\\Test\\NodeTestCase' => __DIR__ . '/..' . '/twig/twig/src/Test/NodeTestCase.php', 'OCA\\Libresign\\Vendor\\Twig\\Token' => __DIR__ . '/..' . '/twig/twig/src/Token.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\AbstractTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/AbstractTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\ApplyTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/ApplyTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\AutoEscapeTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/AutoEscapeTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\BlockTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/BlockTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\DeprecatedTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/DeprecatedTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\DoTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/DoTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\EmbedTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/EmbedTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\ExtendsTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/ExtendsTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\FlushTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/FlushTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\ForTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/ForTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\FromTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/FromTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\GuardTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/GuardTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\IfTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/IfTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\ImportTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/ImportTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\IncludeTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/IncludeTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\MacroTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/MacroTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\SandboxTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/SandboxTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\SetTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/SetTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\TokenParserInterface' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/TokenParserInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\TypesTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/TypesTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\UseTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/UseTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenParser\\WithTokenParser' => __DIR__ . '/..' . '/twig/twig/src/TokenParser/WithTokenParser.php', 'OCA\\Libresign\\Vendor\\Twig\\TokenStream' => __DIR__ . '/..' . '/twig/twig/src/TokenStream.php', 'OCA\\Libresign\\Vendor\\Twig\\TwigCallableInterface' => __DIR__ . '/..' . '/twig/twig/src/TwigCallableInterface.php', 'OCA\\Libresign\\Vendor\\Twig\\TwigFilter' => __DIR__ . '/..' . '/twig/twig/src/TwigFilter.php', 'OCA\\Libresign\\Vendor\\Twig\\TwigFunction' => __DIR__ . '/..' . '/twig/twig/src/TwigFunction.php', 'OCA\\Libresign\\Vendor\\Twig\\TwigTest' => __DIR__ . '/..' . '/twig/twig/src/TwigTest.php', 'OCA\\Libresign\\Vendor\\Twig\\Util\\CallableArgumentsExtractor' => __DIR__ . '/..' . '/twig/twig/src/Util/CallableArgumentsExtractor.php', 'OCA\\Libresign\\Vendor\\Twig\\Util\\DeprecationCollector' => __DIR__ . '/..' . '/twig/twig/src/Util/DeprecationCollector.php', 'OCA\\Libresign\\Vendor\\Twig\\Util\\ReflectionCallable' => __DIR__ . '/..' . '/twig/twig/src/Util/ReflectionCallable.php', 'OCA\\Libresign\\Vendor\\Twig\\Util\\TemplateDirIterator' => __DIR__ . '/..' . '/twig/twig/src/Util/TemplateDirIterator.php', 'OCA\\Libresign\\Vendor\\Wobeto\\EmailBlur\\Blur' => __DIR__ . '/..' . '/wobeto/email-blur/Wobeto/EmailBlur/Blur.php', 'OCA\\Libresign\\Vendor\\mikehaertl\\pdftk\\Command' => __DIR__ . '/..' . '/mikehaertl/php-pdftk/src/Command.php', 'OCA\\Libresign\\Vendor\\mikehaertl\\pdftk\\DataFields' => __DIR__ . '/..' . '/mikehaertl/php-pdftk/src/DataFields.php', 'OCA\\Libresign\\Vendor\\mikehaertl\\pdftk\\FdfFile' => __DIR__ . '/..' . '/mikehaertl/php-pdftk/src/FdfFile.php', 'OCA\\Libresign\\Vendor\\mikehaertl\\pdftk\\InfoFields' => __DIR__ . '/..' . '/mikehaertl/php-pdftk/src/InfoFields.php', 'OCA\\Libresign\\Vendor\\mikehaertl\\pdftk\\InfoFile' => __DIR__ . '/..' . '/mikehaertl/php-pdftk/src/InfoFile.php', 'OCA\\Libresign\\Vendor\\mikehaertl\\pdftk\\Pdf' => __DIR__ . '/..' . '/mikehaertl/php-pdftk/src/Pdf.php', 'OCA\\Libresign\\Vendor\\mikehaertl\\pdftk\\XfdfFile' => __DIR__ . '/..' . '/mikehaertl/php-pdftk/src/XfdfFile.php', 'OCA\\Libresign\\Vendor\\mikehaertl\\shellcommand\\Command' => __DIR__ . '/..' . '/mikehaertl/php-shellcommand/src/Command.php', 'OCA\\Libresign\\Vendor\\mikehaertl\\tmp\\File' => __DIR__ . '/..' . '/mikehaertl/php-tmpfile/src/File.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\FpdfTpl' => __DIR__ . '/..' . '/setasign/fpdi/src/FpdfTpl.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\FpdfTplTrait' => __DIR__ . '/..' . '/setasign/fpdi/src/FpdfTplTrait.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\FpdfTrait' => __DIR__ . '/..' . '/setasign/fpdi/src/FpdfTrait.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\Fpdi' => __DIR__ . '/..' . '/setasign/fpdi/src/Fpdi.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\FpdiException' => __DIR__ . '/..' . '/setasign/fpdi/src/FpdiException.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\FpdiTrait' => __DIR__ . '/..' . '/setasign/fpdi/src/FpdiTrait.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\GraphicsState' => __DIR__ . '/..' . '/setasign/fpdi/src/GraphicsState.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\Math\\Matrix' => __DIR__ . '/..' . '/setasign/fpdi/src/Math/Matrix.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\Math\\Vector' => __DIR__ . '/..' . '/setasign/fpdi/src/Math/Vector.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\CrossReference\\AbstractReader' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/CrossReference/AbstractReader.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\CrossReference\\CrossReference' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/CrossReference/CrossReference.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\CrossReference\\CrossReferenceException' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/CrossReference/CrossReferenceException.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\CrossReference\\FixedReader' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/CrossReference/FixedReader.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\CrossReference\\LineReader' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/CrossReference/LineReader.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\CrossReference\\ReaderInterface' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/CrossReference/ReaderInterface.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Filter\\Ascii85' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Filter/Ascii85.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Filter\\Ascii85Exception' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Filter/Ascii85Exception.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Filter\\AsciiHex' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Filter/AsciiHex.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Filter\\FilterException' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Filter/FilterException.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Filter\\FilterInterface' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Filter/FilterInterface.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Filter\\Flate' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Filter/Flate.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Filter\\FlateException' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Filter/FlateException.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Filter\\Lzw' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Filter/Lzw.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Filter\\LzwException' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Filter/LzwException.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\PdfParser' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/PdfParser.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\PdfParserException' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/PdfParserException.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\StreamReader' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/StreamReader.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Tokenizer' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Tokenizer.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfArray' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Type/PdfArray.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfBoolean' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Type/PdfBoolean.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfDictionary' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Type/PdfDictionary.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfHexString' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Type/PdfHexString.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfIndirectObject' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Type/PdfIndirectObject.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfIndirectObjectReference' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Type/PdfIndirectObjectReference.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfName' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Type/PdfName.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfNull' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Type/PdfNull.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfNumeric' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Type/PdfNumeric.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfStream' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Type/PdfStream.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfString' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Type/PdfString.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfToken' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Type/PdfToken.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfType' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Type/PdfType.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfParser\\Type\\PdfTypeException' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfParser/Type/PdfTypeException.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfReader\\DataStructure\\Rectangle' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfReader/DataStructure/Rectangle.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfReader\\Page' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfReader/Page.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfReader\\PageBoundaries' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfReader/PageBoundaries.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfReader\\PdfReader' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfReader/PdfReader.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\PdfReader\\PdfReaderException' => __DIR__ . '/..' . '/setasign/fpdi/src/PdfReader/PdfReaderException.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\TcpdfFpdi' => __DIR__ . '/..' . '/setasign/fpdi/src/TcpdfFpdi.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\Tcpdf\\Fpdi' => __DIR__ . '/..' . '/setasign/fpdi/src/Tcpdf/Fpdi.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\Tfpdf\\FpdfTpl' => __DIR__ . '/..' . '/setasign/fpdi/src/Tfpdf/FpdfTpl.php', 'OCA\\Libresign\\Vendor\\setasign\\Fpdi\\Tfpdf\\Fpdi' => __DIR__ . '/..' . '/setasign/fpdi/src/Tfpdf/Fpdi.php'); public static function getInitializer(ClassLoader $loader) { return \Closure::bind(function () use($loader) { diff --git a/composer/composer/installed.json b/composer/composer/installed.json index 077c60e..d60f8bb 100644 --- a/composer/composer/installed.json +++ b/composer/composer/installed.json @@ -866,78 +866,6 @@ ], "install-path": "..\/pagerfanta\/pagerfanta" }, - { - "name": "paragonie\/constant_time_encoding", - "version": "v3.1.3", - "version_normalized": "3.1.3.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/paragonie\/constant_time_encoding.git", - "reference": "d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/paragonie\/constant_time_encoding\/zipball\/d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77", - "reference": "d5b01a39b3415c2cd581d3bd3a3575c1ebbd8e77", - "shasum": "" - }, - "require": { - "php": "^8" - }, - "require-dev": { - "infection\/infection": "^0", - "nikic\/php-fuzzer": "^0", - "phpunit\/phpunit": "^9|^10|^11", - "vimeo\/psalm": "^4|^5|^6" - }, - "time": "2025-09-24T15:06:41+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "OCA\\Libresign\\Vendor\\ParagonIE\\ConstantTime\\": "src\/" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Paragon Initiative Enterprises", - "email": "security@paragonie.com", - "homepage": "https:\/\/paragonie.com", - "role": "Maintainer" - }, - { - "name": "Steve 'Sc00bz' Thomas", - "email": "steve@tobtu.com", - "homepage": "https:\/\/www.tobtu.com", - "role": "Original Developer" - } - ], - "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)", - "keywords": [ - "base16", - "base32", - "base32_decode", - "base32_encode", - "base64", - "base64_decode", - "base64_encode", - "bin2hex", - "encoding", - "hex", - "hex2bin", - "rfc4648" - ], - "support": { - "email": "info@paragonie.com", - "issues": "https:\/\/github.com\/paragonie\/constant_time_encoding\/issues", - "source": "https:\/\/github.com\/paragonie\/constant_time_encoding" - }, - "install-path": "..\/paragonie\/constant_time_encoding" - }, { "name": "paragonie\/random_compat", "version": "v9.99.100", @@ -991,119 +919,6 @@ }, "install-path": "..\/paragonie\/random_compat" }, - { - "name": "phpseclib\/phpseclib", - "version": "3.0.47", - "version_normalized": "3.0.47.0", - "source": { - "type": "git", - "url": "https:\/\/github.com\/phpseclib\/phpseclib.git", - "reference": "9d6ca36a6c2dd434765b1071b2644a1c683b385d" - }, - "dist": { - "type": "zip", - "url": "https:\/\/api.github.com\/repos\/phpseclib\/phpseclib\/zipball\/9d6ca36a6c2dd434765b1071b2644a1c683b385d", - "reference": "9d6ca36a6c2dd434765b1071b2644a1c683b385d", - "shasum": "" - }, - "require": { - "paragonie\/constant_time_encoding": "^1|^2|^3", - "paragonie\/random_compat": "^1.4|^2.0|^9.99.99", - "php": ">=5.6.1" - }, - "require-dev": { - "phpunit\/phpunit": "*" - }, - "suggest": { - "ext-dom": "Install the DOM extension to load XML formatted public keys.", - "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", - "ext-libsodium": "SSH2\/SFTP can make use of some algorithms provided by the libsodium-php extension.", - "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", - "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations." - }, - "time": "2025-10-06T01:07:24+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "files": [ - "phpseclib\/bootstrap.php" - ], - "psr-4": { - "OCA\\Libresign\\Vendor\\phpseclib3\\": "phpseclib\/" - } - }, - "notification-url": "https:\/\/packagist.org\/downloads\/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jim Wigginton", - "email": "terrafrost@php.net", - "role": "Lead Developer" - }, - { - "name": "Patrick Monnerat", - "email": "pm@datasphere.ch", - "role": "Developer" - }, - { - "name": "Andreas Fischer", - "email": "bantu@phpbb.com", - "role": "Developer" - }, - { - "name": "Hans-J\u00fcrgen Petrich", - "email": "petrich@tronic-media.com", - "role": "Developer" - }, - { - "name": "Graham Campbell", - "email": "graham@alt-three.com", - "role": "Developer" - } - ], - "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", - "homepage": "http:\/\/phpseclib.sourceforge.net", - "keywords": [ - "BigInteger", - "aes", - "asn.1", - "asn1", - "blowfish", - "crypto", - "cryptography", - "encryption", - "rsa", - "security", - "sftp", - "signature", - "signing", - "ssh", - "twofish", - "x.509", - "x509" - ], - "support": { - "issues": "https:\/\/github.com\/phpseclib\/phpseclib\/issues", - "source": "https:\/\/github.com\/phpseclib\/phpseclib\/tree\/3.0.47" - }, - "funding": [ - { - "url": "https:\/\/github.com\/terrafrost", - "type": "github" - }, - { - "url": "https:\/\/www.patreon.com\/phpseclib", - "type": "patreon" - }, - { - "url": "https:\/\/tidelift.com\/funding\/github\/packagist\/phpseclib\/phpseclib", - "type": "tidelift" - } - ], - "install-path": "..\/phpseclib\/phpseclib" - }, { "name": "psr\/http-message", "version": "2.0", @@ -2705,6 +2520,6 @@ "install-path": "..\/wobeto\/email-blur" } ], - "dev": false, + "dev": true, "dev-package-names": [] } \ No newline at end of file diff --git a/composer/paragonie/constant_time_encoding/LICENSE.txt b/composer/paragonie/constant_time_encoding/LICENSE.txt deleted file mode 100644 index 91acaca..0000000 --- a/composer/paragonie/constant_time_encoding/LICENSE.txt +++ /dev/null @@ -1,48 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2016 - 2022 Paragon Initiative Enterprises - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - ------------------------------------------------------------------------------- -This library was based on the work of Steve "Sc00bz" Thomas. ------------------------------------------------------------------------------- - -The MIT License (MIT) - -Copyright (c) 2014 Steve Thomas - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - diff --git a/composer/paragonie/constant_time_encoding/composer.json b/composer/paragonie/constant_time_encoding/composer.json deleted file mode 100644 index d439f71..0000000 --- a/composer/paragonie/constant_time_encoding/composer.json +++ /dev/null @@ -1,67 +0,0 @@ -{ - "name": "paragonie\/constant_time_encoding", - "description": "Constant-time Implementations of RFC 4648 Encoding (Base-64, Base-32, Base-16)", - "keywords": [ - "base64", - "encoding", - "rfc4648", - "base32", - "base16", - "hex", - "bin2hex", - "hex2bin", - "base64_encode", - "base64_decode", - "base32_encode", - "base32_decode" - ], - "license": "MIT", - "type": "library", - "authors": [ - { - "name": "Paragon Initiative Enterprises", - "email": "security@paragonie.com", - "homepage": "https:\/\/paragonie.com", - "role": "Maintainer" - }, - { - "name": "Steve 'Sc00bz' Thomas", - "email": "steve@tobtu.com", - "homepage": "https:\/\/www.tobtu.com", - "role": "Original Developer" - } - ], - "support": { - "issues": "https:\/\/github.com\/paragonie\/constant_time_encoding\/issues", - "email": "info@paragonie.com", - "source": "https:\/\/github.com\/paragonie\/constant_time_encoding" - }, - "require": { - "php": "^8" - }, - "require-dev": { - "infection\/infection": "^0", - "nikic\/php-fuzzer": "^0", - "phpunit\/phpunit": "^9|^10|^11", - "vimeo\/psalm": "^4|^5|^6" - }, - "autoload": { - "psr-4": { - "OCA\\Libresign\\Vendor\\ParagonIE\\ConstantTime\\": "src\/" - } - }, - "autoload-dev": { - "psr-4": { - "OCA\\Libresign\\Vendor\\ParagonIE\\ConstantTime\\Tests\\": "tests\/" - } - }, - "scripts": { - "mutation-test": "infection" - }, - "config": { - "process-timeout": 0, - "allow-plugins": { - "infection\/extension-installer": true - } - } -} \ No newline at end of file diff --git a/composer/paragonie/constant_time_encoding/src/Base32.php b/composer/paragonie/constant_time_encoding/src/Base32.php deleted file mode 100644 index 5ca6060..0000000 --- a/composer/paragonie/constant_time_encoding/src/Base32.php +++ /dev/null @@ -1,421 +0,0 @@ - 96 && $src < 123) $ret += $src - 97 + 1; // -64 - $ret += (0x60 - $src & $src - 0x7b) >> 8 & $src - 96; - // if ($src > 0x31 && $src < 0x38) $ret += $src - 24 + 1; // -23 - $ret += (0x31 - $src & $src - 0x38) >> 8 & $src - 23; - return $ret; - } - /** - * Uses bitwise operators instead of table-lookups to turn 5-bit integers - * into 8-bit integers. - * - * Uppercase variant. - * - * @param int $src - * @return int - * @api - */ - protected static function decode5BitsUpper(int $src) : int - { - $ret = -1; - // if ($src > 64 && $src < 91) $ret += $src - 65 + 1; // -64 - $ret += (0x40 - $src & $src - 0x5b) >> 8 & $src - 64; - // if ($src > 0x31 && $src < 0x38) $ret += $src - 24 + 1; // -23 - $ret += (0x31 - $src & $src - 0x38) >> 8 & $src - 23; - return $ret; - } - /** - * Uses bitwise operators instead of table-lookups to turn 8-bit integers - * into 5-bit integers. - * - * @param int $src - * @return string - * @api - */ - protected static function encode5Bits(int $src) : string - { - $diff = 0x61; - // if ($src > 25) $ret -= 72; - $diff -= 25 - $src >> 8 & 73; - return pack('C', $src + $diff); - } - /** - * Uses bitwise operators instead of table-lookups to turn 8-bit integers - * into 5-bit integers. - * - * Uppercase variant. - * - * @param int $src - * @return string - * @api - */ - protected static function encode5BitsUpper(int $src) : string - { - $diff = 0x41; - // if ($src > 25) $ret -= 40; - $diff -= 25 - $src >> 8 & 41; - return pack('C', $src + $diff); - } - /** - * @param string $encodedString - * @param bool $upper - * @return string - * @api - */ - public static function decodeNoPadding(#[SensitiveParameter] string $encodedString, bool $upper = \false) : string - { - $srcLen = strlen($encodedString); - if ($srcLen === 0) { - return ''; - } - if (($srcLen & 7) === 0) { - for ($j = 0; $j < 7 && $j < $srcLen; ++$j) { - if ($encodedString[$srcLen - $j - 1] === '=') { - throw new InvalidArgumentException("decodeNoPadding() doesn't tolerate padding"); - } - } - } - return static::doDecode($encodedString, $upper, \true); - } - /** - * Base32 decoding - * - * @param string $src - * @param bool $upper - * @param bool $strictPadding - * @return string - * - * @throws TypeError - */ - protected static function doDecode(#[SensitiveParameter] string $src, bool $upper = \false, bool $strictPadding = \false) : string - { - // We do this to reduce code duplication: - $method = $upper ? 'decode5BitsUpper' : 'decode5Bits'; - // Remove padding - $srcLen = strlen($src); - if ($srcLen === 0) { - return ''; - } - if ($strictPadding) { - if (($srcLen & 7) === 0) { - for ($j = 0; $j < 7; ++$j) { - if ($src[$srcLen - 1] === '=') { - $srcLen--; - } else { - break; - } - } - } - if (($srcLen & 7) === 1) { - throw new RangeException('Incorrect padding'); - } - } else { - $src = rtrim($src, '='); - $srcLen = strlen($src); - } - $err = 0; - $dest = ''; - // Main loop (no padding): - for ($i = 0; $i + 8 <= $srcLen; $i += 8) { - /** @var array $chunk */ - $chunk = unpack('C*', substr($src, $i, 8)); - /** @var int $c0 */ - $c0 = static::$method($chunk[1]); - /** @var int $c1 */ - $c1 = static::$method($chunk[2]); - /** @var int $c2 */ - $c2 = static::$method($chunk[3]); - /** @var int $c3 */ - $c3 = static::$method($chunk[4]); - /** @var int $c4 */ - $c4 = static::$method($chunk[5]); - /** @var int $c5 */ - $c5 = static::$method($chunk[6]); - /** @var int $c6 */ - $c6 = static::$method($chunk[7]); - /** @var int $c7 */ - $c7 = static::$method($chunk[8]); - $dest .= pack('CCCCC', ($c0 << 3 | $c1 >> 2) & 0xff, ($c1 << 6 | $c2 << 1 | $c3 >> 4) & 0xff, ($c3 << 4 | $c4 >> 1) & 0xff, ($c4 << 7 | $c5 << 2 | $c6 >> 3) & 0xff, ($c6 << 5 | $c7) & 0xff); - $err |= ($c0 | $c1 | $c2 | $c3 | $c4 | $c5 | $c6 | $c7) >> 8; - } - // The last chunk, which may have padding: - if ($i < $srcLen) { - /** @var array $chunk */ - $chunk = unpack('C*', substr($src, $i, $srcLen - $i)); - /** @var int $c0 */ - $c0 = static::$method($chunk[1]); - if ($i + 6 < $srcLen) { - /** @var int $c1 */ - $c1 = static::$method($chunk[2]); - /** @var int $c2 */ - $c2 = static::$method($chunk[3]); - /** @var int $c3 */ - $c3 = static::$method($chunk[4]); - /** @var int $c4 */ - $c4 = static::$method($chunk[5]); - /** @var int $c5 */ - $c5 = static::$method($chunk[6]); - /** @var int $c6 */ - $c6 = static::$method($chunk[7]); - $dest .= pack('CCCC', ($c0 << 3 | $c1 >> 2) & 0xff, ($c1 << 6 | $c2 << 1 | $c3 >> 4) & 0xff, ($c3 << 4 | $c4 >> 1) & 0xff, ($c4 << 7 | $c5 << 2 | $c6 >> 3) & 0xff); - $err |= ($c0 | $c1 | $c2 | $c3 | $c4 | $c5 | $c6) >> 8; - if ($strictPadding) { - $err |= $c6 << 5 & 0xff; - } - } elseif ($i + 5 < $srcLen) { - /** @var int $c1 */ - $c1 = static::$method($chunk[2]); - /** @var int $c2 */ - $c2 = static::$method($chunk[3]); - /** @var int $c3 */ - $c3 = static::$method($chunk[4]); - /** @var int $c4 */ - $c4 = static::$method($chunk[5]); - /** @var int $c5 */ - $c5 = static::$method($chunk[6]); - $dest .= pack('CCCC', ($c0 << 3 | $c1 >> 2) & 0xff, ($c1 << 6 | $c2 << 1 | $c3 >> 4) & 0xff, ($c3 << 4 | $c4 >> 1) & 0xff, ($c4 << 7 | $c5 << 2) & 0xff); - $err |= ($c0 | $c1 | $c2 | $c3 | $c4 | $c5) >> 8; - } elseif ($i + 4 < $srcLen) { - /** @var int $c1 */ - $c1 = static::$method($chunk[2]); - /** @var int $c2 */ - $c2 = static::$method($chunk[3]); - /** @var int $c3 */ - $c3 = static::$method($chunk[4]); - /** @var int $c4 */ - $c4 = static::$method($chunk[5]); - $dest .= pack('CCC', ($c0 << 3 | $c1 >> 2) & 0xff, ($c1 << 6 | $c2 << 1 | $c3 >> 4) & 0xff, ($c3 << 4 | $c4 >> 1) & 0xff); - $err |= ($c0 | $c1 | $c2 | $c3 | $c4) >> 8; - if ($strictPadding) { - $err |= $c4 << 7 & 0xff; - } - } elseif ($i + 3 < $srcLen) { - /** @var int $c1 */ - $c1 = static::$method($chunk[2]); - /** @var int $c2 */ - $c2 = static::$method($chunk[3]); - /** @var int $c3 */ - $c3 = static::$method($chunk[4]); - $dest .= pack('CC', ($c0 << 3 | $c1 >> 2) & 0xff, ($c1 << 6 | $c2 << 1 | $c3 >> 4) & 0xff); - $err |= ($c0 | $c1 | $c2 | $c3) >> 8; - if ($strictPadding) { - $err |= $c3 << 4 & 0xff; - } - } elseif ($i + 2 < $srcLen) { - /** @var int $c1 */ - $c1 = static::$method($chunk[2]); - /** @var int $c2 */ - $c2 = static::$method($chunk[3]); - $dest .= pack('CC', ($c0 << 3 | $c1 >> 2) & 0xff, ($c1 << 6 | $c2 << 1) & 0xff); - $err |= ($c0 | $c1 | $c2) >> 8; - if ($strictPadding) { - $err |= $c2 << 6 & 0xff; - } - } elseif ($i + 1 < $srcLen) { - /** @var int $c1 */ - $c1 = static::$method($chunk[2]); - $dest .= pack('C', ($c0 << 3 | $c1 >> 2) & 0xff); - $err |= ($c0 | $c1) >> 8; - if ($strictPadding) { - $err |= $c1 << 6 & 0xff; - } - } else { - $dest .= pack('C', $c0 << 3 & 0xff); - $err |= $c0 >> 8; - } - } - $check = $err === 0; - if (!$check) { - throw new RangeException('Base32::doDecode() only expects characters in the correct base32 alphabet'); - } - return $dest; - } - /** - * Base32 Encoding - * - * @param string $src - * @param bool $upper - * @param bool $pad - * @return string - * @throws TypeError - */ - protected static function doEncode(#[SensitiveParameter] string $src, bool $upper = \false, bool $pad = \true) : string - { - // We do this to reduce code duplication: - $method = $upper ? 'encode5BitsUpper' : 'encode5Bits'; - $dest = ''; - $srcLen = strlen($src); - // Main loop (no padding): - for ($i = 0; $i + 5 <= $srcLen; $i += 5) { - /** @var array $chunk */ - $chunk = unpack('C*', substr($src, $i, 5)); - $b0 = $chunk[1]; - $b1 = $chunk[2]; - $b2 = $chunk[3]; - $b3 = $chunk[4]; - $b4 = $chunk[5]; - $dest .= static::$method($b0 >> 3 & 31) . static::$method(($b0 << 2 | $b1 >> 6) & 31) . static::$method($b1 >> 1 & 31) . static::$method(($b1 << 4 | $b2 >> 4) & 31) . static::$method(($b2 << 1 | $b3 >> 7) & 31) . static::$method($b3 >> 2 & 31) . static::$method(($b3 << 3 | $b4 >> 5) & 31) . static::$method($b4 & 31); - } - // The last chunk, which may have padding: - if ($i < $srcLen) { - /** @var array $chunk */ - $chunk = unpack('C*', substr($src, $i, $srcLen - $i)); - $b0 = $chunk[1]; - if ($i + 3 < $srcLen) { - $b1 = $chunk[2]; - $b2 = $chunk[3]; - $b3 = $chunk[4]; - $dest .= static::$method($b0 >> 3 & 31) . static::$method(($b0 << 2 | $b1 >> 6) & 31) . static::$method($b1 >> 1 & 31) . static::$method(($b1 << 4 | $b2 >> 4) & 31) . static::$method(($b2 << 1 | $b3 >> 7) & 31) . static::$method($b3 >> 2 & 31) . static::$method($b3 << 3 & 31); - if ($pad) { - $dest .= '='; - } - } elseif ($i + 2 < $srcLen) { - $b1 = $chunk[2]; - $b2 = $chunk[3]; - $dest .= static::$method($b0 >> 3 & 31) . static::$method(($b0 << 2 | $b1 >> 6) & 31) . static::$method($b1 >> 1 & 31) . static::$method(($b1 << 4 | $b2 >> 4) & 31) . static::$method($b2 << 1 & 31); - if ($pad) { - $dest .= '==='; - } - } elseif ($i + 1 < $srcLen) { - $b1 = $chunk[2]; - $dest .= static::$method($b0 >> 3 & 31) . static::$method(($b0 << 2 | $b1 >> 6) & 31) . static::$method($b1 >> 1 & 31) . static::$method($b1 << 4 & 31); - if ($pad) { - $dest .= '===='; - } - } else { - $dest .= static::$method($b0 >> 3 & 31) . static::$method($b0 << 2 & 31); - if ($pad) { - $dest .= '======'; - } - } - } - return $dest; - } -} diff --git a/composer/paragonie/constant_time_encoding/src/Base32Hex.php b/composer/paragonie/constant_time_encoding/src/Base32Hex.php deleted file mode 100644 index d037463..0000000 --- a/composer/paragonie/constant_time_encoding/src/Base32Hex.php +++ /dev/null @@ -1,105 +0,0 @@ - 0x30 && $src < 0x3a) ret += $src - 0x2e + 1; // -47 - $ret += (0x2f - $src & $src - 0x3a) >> 8 & $src - 47; - // if ($src > 0x60 && $src < 0x77) ret += $src - 0x61 + 10 + 1; // -86 - $ret += (0x60 - $src & $src - 0x77) >> 8 & $src - 86; - return $ret; - } - /** - * Uses bitwise operators instead of table-lookups to turn 5-bit integers - * into 8-bit integers. - * - * @param int $src - * @return int - */ - #[Override] - protected static function decode5BitsUpper(int $src) : int - { - $ret = -1; - // if ($src > 0x30 && $src < 0x3a) ret += $src - 0x2e + 1; // -47 - $ret += (0x2f - $src & $src - 0x3a) >> 8 & $src - 47; - // if ($src > 0x40 && $src < 0x57) ret += $src - 0x41 + 10 + 1; // -54 - $ret += (0x40 - $src & $src - 0x57) >> 8 & $src - 54; - return $ret; - } - /** - * Uses bitwise operators instead of table-lookups to turn 8-bit integers - * into 5-bit integers. - * - * @param int $src - * @return string - */ - #[Override] - protected static function encode5Bits(int $src) : string - { - $src += 0x30; - // if ($src > 0x39) $src += 0x61 - 0x3a; // 39 - $src += 0x39 - $src >> 8 & 39; - return pack('C', $src); - } - /** - * Uses bitwise operators instead of table-lookups to turn 8-bit integers - * into 5-bit integers. - * - * Uppercase variant. - * - * @param int $src - * @return string - */ - #[Override] - protected static function encode5BitsUpper(int $src) : string - { - $src += 0x30; - // if ($src > 0x39) $src += 0x41 - 0x3a; // 7 - $src += 0x39 - $src >> 8 & 7; - return pack('C', $src); - } -} diff --git a/composer/paragonie/constant_time_encoding/src/Base64.php b/composer/paragonie/constant_time_encoding/src/Base64.php deleted file mode 100644 index 5532954..0000000 --- a/composer/paragonie/constant_time_encoding/src/Base64.php +++ /dev/null @@ -1,315 +0,0 @@ - SODIUM_BASE64_VARIANT_ORIGINAL, - Base64UrlSafe::class => SODIUM_BASE64_VARIANT_URLSAFE, - default => 0, - }; - if ($variant > 0) { - try { - return sodium_bin2base64($binString, $variant); - } catch (SodiumException $ex) { - throw new RangeException($ex->getMessage(), $ex->getCode(), $ex); - } - } - } - return static::doEncode($binString, \true); - } - /** - * Encode into Base64, no = padding - * - * Base64 character set "[A-Z][a-z][0-9]+/" - * - * @param string $src - * @return string - * - * @throws TypeError - * @api - */ - public static function encodeUnpadded(#[SensitiveParameter] string $src) : string - { - if (extension_loaded('sodium')) { - $variant = match (static::class) { - Base64::class => SODIUM_BASE64_VARIANT_ORIGINAL_NO_PADDING, - Base64UrlSafe::class => SODIUM_BASE64_VARIANT_URLSAFE_NO_PADDING, - default => 0, - }; - if ($variant > 0) { - try { - return sodium_bin2base64($src, $variant); - } catch (SodiumException $ex) { - throw new RangeException($ex->getMessage(), $ex->getCode(), $ex); - } - } - } - return static::doEncode($src, \false); - } - /** - * @param string $src - * @param bool $pad Include = padding? - * @return string - * - * @throws TypeError - */ - protected static function doEncode(#[SensitiveParameter] string $src, bool $pad = \true) : string - { - $dest = ''; - $srcLen = strlen($src); - // Main loop (no padding): - for ($i = 0; $i + 3 <= $srcLen; $i += 3) { - /** @var array $chunk */ - $chunk = unpack('C*', substr($src, $i, 3)); - $b0 = $chunk[1]; - $b1 = $chunk[2]; - $b2 = $chunk[3]; - $dest .= static::encode6Bits($b0 >> 2) . static::encode6Bits(($b0 << 4 | $b1 >> 4) & 63) . static::encode6Bits(($b1 << 2 | $b2 >> 6) & 63) . static::encode6Bits($b2 & 63); - } - // The last chunk, which may have padding: - if ($i < $srcLen) { - /** @var array $chunk */ - $chunk = unpack('C*', substr($src, $i, $srcLen - $i)); - $b0 = $chunk[1]; - if ($i + 1 < $srcLen) { - $b1 = $chunk[2]; - $dest .= static::encode6Bits($b0 >> 2) . static::encode6Bits(($b0 << 4 | $b1 >> 4) & 63) . static::encode6Bits($b1 << 2 & 63); - if ($pad) { - $dest .= '='; - } - } else { - $dest .= static::encode6Bits($b0 >> 2) . static::encode6Bits($b0 << 4 & 63); - if ($pad) { - $dest .= '=='; - } - } - } - return $dest; - } - /** - * decode from base64 into binary - * - * Base64 character set "./[A-Z][a-z][0-9]" - * - * @param string $encodedString - * @param bool $strictPadding - * @return string - * - * @throws RangeException - * @throws TypeError - */ - #[Override] - public static function decode(#[SensitiveParameter] string $encodedString, bool $strictPadding = \false) : string - { - // Remove padding - $srcLen = strlen($encodedString); - if ($srcLen === 0) { - return ''; - } - if ($strictPadding) { - if (($srcLen & 3) === 0) { - if ($encodedString[$srcLen - 1] === '=') { - $srcLen--; - if ($encodedString[$srcLen - 1] === '=') { - $srcLen--; - } - } - } - if (($srcLen & 3) === 1) { - throw new RangeException('Incorrect padding'); - } - if ($encodedString[$srcLen - 1] === '=') { - throw new RangeException('Incorrect padding'); - } - if (extension_loaded('sodium')) { - $variant = match (static::class) { - Base64::class => SODIUM_BASE64_VARIANT_ORIGINAL_NO_PADDING, - Base64UrlSafe::class => SODIUM_BASE64_VARIANT_URLSAFE_NO_PADDING, - default => 0, - }; - if ($variant > 0) { - try { - return sodium_base642bin(substr($encodedString, 0, $srcLen), $variant); - } catch (SodiumException $ex) { - throw new RangeException($ex->getMessage(), $ex->getCode(), $ex); - } - } - } - } else { - // Just remove all padding. - $encodedString = rtrim($encodedString, '='); - $srcLen = strlen($encodedString); - } - $err = 0; - $dest = ''; - // Main loop (no padding): - for ($i = 0; $i + 4 <= $srcLen; $i += 4) { - /** @var array $chunk */ - $chunk = unpack('C*', substr($encodedString, $i, 4)); - $c0 = static::decode6Bits($chunk[1]); - $c1 = static::decode6Bits($chunk[2]); - $c2 = static::decode6Bits($chunk[3]); - $c3 = static::decode6Bits($chunk[4]); - $dest .= pack('CCC', ($c0 << 2 | $c1 >> 4) & 0xff, ($c1 << 4 | $c2 >> 2) & 0xff, ($c2 << 6 | $c3) & 0xff); - $err |= ($c0 | $c1 | $c2 | $c3) >> 8; - } - // The last chunk, which may have padding: - if ($i < $srcLen) { - /** @var array $chunk */ - $chunk = unpack('C*', substr($encodedString, $i, $srcLen - $i)); - $c0 = static::decode6Bits($chunk[1]); - if ($i + 2 < $srcLen) { - $c1 = static::decode6Bits($chunk[2]); - $c2 = static::decode6Bits($chunk[3]); - $dest .= pack('CC', ($c0 << 2 | $c1 >> 4) & 0xff, ($c1 << 4 | $c2 >> 2) & 0xff); - $err |= ($c0 | $c1 | $c2) >> 8; - if ($strictPadding) { - $err |= $c2 << 6 & 0xff; - } - } elseif ($i + 1 < $srcLen) { - $c1 = static::decode6Bits($chunk[2]); - $dest .= pack('C', ($c0 << 2 | $c1 >> 4) & 0xff); - $err |= ($c0 | $c1) >> 8; - if ($strictPadding) { - $err |= $c1 << 4 & 0xff; - } - } elseif ($strictPadding) { - $err |= 1; - } - } - $check = $err === 0; - if (!$check) { - throw new RangeException('Base64::decode() only expects characters in the correct base64 alphabet'); - } - return $dest; - } - /** - * @param string $encodedString - * @return string - * @api - */ - public static function decodeNoPadding(#[SensitiveParameter] string $encodedString) : string - { - $srcLen = strlen($encodedString); - if ($srcLen === 0) { - return ''; - } - if (($srcLen & 3) === 0) { - // If $strLen is not zero, and it is divisible by 4, then it's at least 4. - if ($encodedString[$srcLen - 1] === '=' || $encodedString[$srcLen - 2] === '=') { - throw new InvalidArgumentException("decodeNoPadding() doesn't tolerate padding"); - } - } - return static::decode($encodedString, \true); - } - /** - * Uses bitwise operators instead of table-lookups to turn 6-bit integers - * into 8-bit integers. - * - * Base64 character set: - * [A-Z] [a-z] [0-9] + / - * 0x41-0x5a, 0x61-0x7a, 0x30-0x39, 0x2b, 0x2f - * - * @param int $src - * @return int - */ - protected static function decode6Bits(int $src) : int - { - $ret = -1; - // if ($src > 0x40 && $src < 0x5b) $ret += $src - 0x41 + 1; // -64 - $ret += (0x40 - $src & $src - 0x5b) >> 8 & $src - 64; - // if ($src > 0x60 && $src < 0x7b) $ret += $src - 0x61 + 26 + 1; // -70 - $ret += (0x60 - $src & $src - 0x7b) >> 8 & $src - 70; - // if ($src > 0x2f && $src < 0x3a) $ret += $src - 0x30 + 52 + 1; // 5 - $ret += (0x2f - $src & $src - 0x3a) >> 8 & $src + 5; - // if ($src == 0x2b) $ret += 62 + 1; - $ret += (0x2a - $src & $src - 0x2c) >> 8 & 63; - // if ($src == 0x2f) ret += 63 + 1; - $ret += (0x2e - $src & $src - 0x30) >> 8 & 64; - return $ret; - } - /** - * Uses bitwise operators instead of table-lookups to turn 8-bit integers - * into 6-bit integers. - * - * @param int $src - * @return string - */ - protected static function encode6Bits(int $src) : string - { - $diff = 0x41; - // if ($src > 25) $diff += 0x61 - 0x41 - 26; // 6 - $diff += 25 - $src >> 8 & 6; - // if ($src > 51) $diff += 0x30 - 0x61 - 26; // -75 - $diff -= 51 - $src >> 8 & 75; - // if ($src > 61) $diff += 0x2b - 0x30 - 10; // -15 - $diff -= 61 - $src >> 8 & 15; - // if ($src > 62) $diff += 0x2f - 0x2b - 1; // 3 - $diff += 62 - $src >> 8 & 3; - return pack('C', $src + $diff); - } -} diff --git a/composer/paragonie/constant_time_encoding/src/Base64DotSlash.php b/composer/paragonie/constant_time_encoding/src/Base64DotSlash.php deleted file mode 100644 index c5000fa..0000000 --- a/composer/paragonie/constant_time_encoding/src/Base64DotSlash.php +++ /dev/null @@ -1,82 +0,0 @@ - 0x2d && $src < 0x30) ret += $src - 0x2e + 1; // -45 - $ret += (0x2d - $src & $src - 0x30) >> 8 & $src - 45; - // if ($src > 0x40 && $src < 0x5b) ret += $src - 0x41 + 2 + 1; // -62 - $ret += (0x40 - $src & $src - 0x5b) >> 8 & $src - 62; - // if ($src > 0x60 && $src < 0x7b) ret += $src - 0x61 + 28 + 1; // -68 - $ret += (0x60 - $src & $src - 0x7b) >> 8 & $src - 68; - // if ($src > 0x2f && $src < 0x3a) ret += $src - 0x30 + 54 + 1; // 7 - $ret += (0x2f - $src & $src - 0x3a) >> 8 & $src + 7; - return $ret; - } - /** - * Uses bitwise operators instead of table-lookups to turn 8-bit integers - * into 6-bit integers. - * - * @param int $src - * @return string - */ - #[Override] - protected static function encode6Bits(int $src) : string - { - $src += 0x2e; - // if ($src > 0x2f) $src += 0x41 - 0x30; // 17 - $src += 0x2f - $src >> 8 & 17; - // if ($src > 0x5a) $src += 0x61 - 0x5b; // 6 - $src += 0x5a - $src >> 8 & 6; - // if ($src > 0x7a) $src += 0x30 - 0x7b; // -75 - $src -= 0x7a - $src >> 8 & 75; - return \pack('C', $src); - } -} diff --git a/composer/paragonie/constant_time_encoding/src/Base64DotSlashOrdered.php b/composer/paragonie/constant_time_encoding/src/Base64DotSlashOrdered.php deleted file mode 100644 index 772f515..0000000 --- a/composer/paragonie/constant_time_encoding/src/Base64DotSlashOrdered.php +++ /dev/null @@ -1,78 +0,0 @@ - 0x2d && $src < 0x3a) ret += $src - 0x2e + 1; // -45 - $ret += (0x2d - $src & $src - 0x3a) >> 8 & $src - 45; - // if ($src > 0x40 && $src < 0x5b) ret += $src - 0x41 + 12 + 1; // -52 - $ret += (0x40 - $src & $src - 0x5b) >> 8 & $src - 52; - // if ($src > 0x60 && $src < 0x7b) ret += $src - 0x61 + 38 + 1; // -58 - $ret += (0x60 - $src & $src - 0x7b) >> 8 & $src - 58; - return $ret; - } - /** - * Uses bitwise operators instead of table-lookups to turn 8-bit integers - * into 6-bit integers. - * - * @param int $src - * @return string - */ - #[Override] - protected static function encode6Bits(int $src) : string - { - $src += 0x2e; - // if ($src > 0x39) $src += 0x41 - 0x3a; // 7 - $src += 0x39 - $src >> 8 & 7; - // if ($src > 0x5a) $src += 0x61 - 0x5b; // 6 - $src += 0x5a - $src >> 8 & 6; - return \pack('C', $src); - } -} diff --git a/composer/paragonie/constant_time_encoding/src/Base64UrlSafe.php b/composer/paragonie/constant_time_encoding/src/Base64UrlSafe.php deleted file mode 100644 index 9a354a7..0000000 --- a/composer/paragonie/constant_time_encoding/src/Base64UrlSafe.php +++ /dev/null @@ -1,86 +0,0 @@ - 0x40 && $src < 0x5b) $ret += $src - 0x41 + 1; // -64 - $ret += (0x40 - $src & $src - 0x5b) >> 8 & $src - 64; - // if ($src > 0x60 && $src < 0x7b) $ret += $src - 0x61 + 26 + 1; // -70 - $ret += (0x60 - $src & $src - 0x7b) >> 8 & $src - 70; - // if ($src > 0x2f && $src < 0x3a) $ret += $src - 0x30 + 52 + 1; // 5 - $ret += (0x2f - $src & $src - 0x3a) >> 8 & $src + 5; - // if ($src == 0x2c) $ret += 62 + 1; - $ret += (0x2c - $src & $src - 0x2e) >> 8 & 63; - // if ($src == 0x5f) ret += 63 + 1; - $ret += (0x5e - $src & $src - 0x60) >> 8 & 64; - return $ret; - } - /** - * Uses bitwise operators instead of table-lookups to turn 8-bit integers - * into 6-bit integers. - * - * @param int $src - * @return string - */ - #[Override] - protected static function encode6Bits(int $src) : string - { - $diff = 0x41; - // if ($src > 25) $diff += 0x61 - 0x41 - 26; // 6 - $diff += 25 - $src >> 8 & 6; - // if ($src > 51) $diff += 0x30 - 0x61 - 26; // -75 - $diff -= 51 - $src >> 8 & 75; - // if ($src > 61) $diff += 0x2d - 0x30 - 10; // -13 - $diff -= 61 - $src >> 8 & 13; - // if ($src > 62) $diff += 0x5f - 0x2b - 1; // 3 - $diff += 62 - $src >> 8 & 49; - return \pack('C', $src + $diff); - } -} diff --git a/composer/paragonie/constant_time_encoding/src/Binary.php b/composer/paragonie/constant_time_encoding/src/Binary.php deleted file mode 100644 index a337368..0000000 --- a/composer/paragonie/constant_time_encoding/src/Binary.php +++ /dev/null @@ -1,80 +0,0 @@ -getMessage(), $ex->getCode(), $ex); - } - } - $hex = ''; - $len = strlen($binString); - for ($i = 0; $i < $len; ++$i) { - /** @var array $chunk */ - $chunk = unpack('C', $binString[$i]); - $c = $chunk[1] & 0xf; - $b = $chunk[1] >> 4; - $hex .= pack('CC', 87 + $b + ($b - 10 >> 8 & ~38), 87 + $c + ($c - 10 >> 8 & ~38)); - } - return $hex; - } - /** - * Convert a binary string into a hexadecimal string without cache-timing - * leaks, returning uppercase letters (as per RFC 4648) - * - * @param string $binString (raw binary) - * @return string - * @throws TypeError - */ - public static function encodeUpper(#[SensitiveParameter] string $binString) : string - { - $hex = ''; - $len = strlen($binString); - for ($i = 0; $i < $len; ++$i) { - /** @var array $chunk */ - $chunk = unpack('C', $binString[$i]); - $c = $chunk[1] & 0xf; - $b = $chunk[1] >> 4; - $hex .= pack('CC', 55 + $b + ($b - 10 >> 8 & ~6), 55 + $c + ($c - 10 >> 8 & ~6)); - } - return $hex; - } - /** - * Convert a hexadecimal string into a binary string without cache-timing - * leaks - * - * @param string $encodedString - * @param bool $strictPadding - * @return string (raw binary) - * @throws RangeException - */ - #[Override] - public static function decode(#[SensitiveParameter] string $encodedString, bool $strictPadding = \false) : string - { - if (extension_loaded('sodium') && $strictPadding) { - try { - return sodium_hex2bin($encodedString); - } catch (SodiumException $ex) { - throw new RangeException($ex->getMessage(), $ex->getCode(), $ex); - } - } - $hex_pos = 0; - $bin = ''; - $c_acc = 0; - $hex_len = strlen($encodedString); - $state = 0; - if (($hex_len & 1) !== 0) { - if ($strictPadding) { - throw new RangeException('Expected an even number of hexadecimal characters'); - } else { - $encodedString = '0' . $encodedString; - ++$hex_len; - } - } - /** @var array $chunk */ - $chunk = unpack('C*', $encodedString); - while ($hex_pos < $hex_len) { - ++$hex_pos; - $c = $chunk[$hex_pos]; - $c_num = $c ^ 48; - $c_num0 = $c_num - 10 >> 8; - $c_alpha = ($c & ~32) - 55; - $c_alpha0 = ($c_alpha - 10 ^ $c_alpha - 16) >> 8; - if (($c_num0 | $c_alpha0) === 0) { - throw new RangeException('Expected hexadecimal character'); - } - $c_val = $c_num0 & $c_num | $c_alpha & $c_alpha0; - if ($state === 0) { - $c_acc = $c_val * 16; - } else { - $bin .= pack('C', $c_acc | $c_val); - } - $state ^= 1; - } - return $bin; - } -} diff --git a/composer/paragonie/constant_time_encoding/src/RFC4648.php b/composer/paragonie/constant_time_encoding/src/RFC4648.php deleted file mode 100644 index 2cc9506..0000000 --- a/composer/paragonie/constant_time_encoding/src/RFC4648.php +++ /dev/null @@ -1,179 +0,0 @@ - "Zm9v" - * - * @param string $str - * @return string - * - * @throws TypeError - */ - public static function base64Encode(#[SensitiveParameter] string $str) : string - { - return Base64::encode($str); - } - /** - * RFC 4648 Base64 decoding - * - * "Zm9v" -> "foo" - * - * @param string $str - * @return string - * - * @throws TypeError - */ - public static function base64Decode(#[SensitiveParameter] string $str) : string - { - return Base64::decode($str, \true); - } - /** - * RFC 4648 Base64 (URL Safe) encoding - * - * "foo" -> "Zm9v" - * - * @param string $str - * @return string - * - * @throws TypeError - */ - public static function base64UrlSafeEncode(#[SensitiveParameter] string $str) : string - { - return Base64UrlSafe::encode($str); - } - /** - * RFC 4648 Base64 (URL Safe) decoding - * - * "Zm9v" -> "foo" - * - * @param string $str - * @return string - * - * @throws TypeError - */ - public static function base64UrlSafeDecode(#[SensitiveParameter] string $str) : string - { - return Base64UrlSafe::decode($str, \true); - } - /** - * RFC 4648 Base32 encoding - * - * "foo" -> "MZXW6===" - * - * @param string $str - * @return string - * - * @throws TypeError - */ - public static function base32Encode(#[SensitiveParameter] string $str) : string - { - return Base32::encodeUpper($str); - } - /** - * RFC 4648 Base32 encoding - * - * "MZXW6===" -> "foo" - * - * @param string $str - * @return string - * - * @throws TypeError - */ - public static function base32Decode(#[SensitiveParameter] string $str) : string - { - return Base32::decodeUpper($str, \true); - } - /** - * RFC 4648 Base32-Hex encoding - * - * "foo" -> "CPNMU===" - * - * @param string $str - * @return string - * - * @throws TypeError - */ - public static function base32HexEncode(#[SensitiveParameter] string $str) : string - { - return Base32::encodeUpper($str); - } - /** - * RFC 4648 Base32-Hex decoding - * - * "CPNMU===" -> "foo" - * - * @param string $str - * @return string - * - * @throws TypeError - */ - public static function base32HexDecode(#[SensitiveParameter] string $str) : string - { - return Base32::decodeUpper($str, \true); - } - /** - * RFC 4648 Base16 decoding - * - * "foo" -> "666F6F" - * - * @param string $str - * @return string - * - * @throws TypeError - */ - public static function base16Encode(#[SensitiveParameter] string $str) : string - { - return Hex::encodeUpper($str); - } - /** - * RFC 4648 Base16 decoding - * - * "666F6F" -> "foo" - * - * @param string $str - * @return string - */ - public static function base16Decode(#[SensitiveParameter] string $str) : string - { - return Hex::decode($str, \true); - } -} diff --git a/composer/phpseclib/phpseclib/AUTHORS b/composer/phpseclib/phpseclib/AUTHORS deleted file mode 100644 index 9f10d26..0000000 --- a/composer/phpseclib/phpseclib/AUTHORS +++ /dev/null @@ -1,7 +0,0 @@ -phpseclib Lead Developer: TerraFrost (Jim Wigginton) - -phpseclib Developers: monnerat (Patrick Monnerat) - bantu (Andreas Fischer) - petrich (Hans-Jürgen Petrich) - GrahamCampbell (Graham Campbell) - hc-jworman \ No newline at end of file diff --git a/composer/phpseclib/phpseclib/LICENSE b/composer/phpseclib/phpseclib/LICENSE deleted file mode 100644 index e7214eb..0000000 --- a/composer/phpseclib/phpseclib/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2011-2019 TerraFrost and other contributors - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/composer/phpseclib/phpseclib/composer.json b/composer/phpseclib/phpseclib/composer.json deleted file mode 100644 index 3d80f92..0000000 --- a/composer/phpseclib/phpseclib/composer.json +++ /dev/null @@ -1,84 +0,0 @@ -{ - "name": "phpseclib\/phpseclib", - "type": "library", - "description": "PHP Secure Communications Library - Pure-PHP implementations of RSA, AES, SSH2, SFTP, X.509 etc.", - "keywords": [ - "security", - "crypto", - "cryptography", - "encryption", - "signature", - "signing", - "rsa", - "aes", - "blowfish", - "twofish", - "ssh", - "sftp", - "x509", - "x.509", - "asn1", - "asn.1", - "BigInteger" - ], - "homepage": "http:\/\/phpseclib.sourceforge.net", - "license": "MIT", - "authors": [ - { - "name": "Jim Wigginton", - "email": "terrafrost@php.net", - "role": "Lead Developer" - }, - { - "name": "Patrick Monnerat", - "email": "pm@datasphere.ch", - "role": "Developer" - }, - { - "name": "Andreas Fischer", - "email": "bantu@phpbb.com", - "role": "Developer" - }, - { - "name": "Hans-J\u00fcrgen Petrich", - "email": "petrich@tronic-media.com", - "role": "Developer" - }, - { - "name": "Graham Campbell", - "email": "graham@alt-three.com", - "role": "Developer" - } - ], - "require": { - "php": ">=5.6.1", - "paragonie\/constant_time_encoding": "^1|^2|^3", - "paragonie\/random_compat": "^1.4|^2.0|^9.99.99" - }, - "require-dev": { - "phpunit\/phpunit": "*" - }, - "suggest": { - "ext-libsodium": "SSH2\/SFTP can make use of some algorithms provided by the libsodium-php extension.", - "ext-openssl": "Install the OpenSSL extension in order to speed up a wide variety of cryptographic operations.", - "ext-mcrypt": "Install the Mcrypt extension in order to speed up a few other cryptographic operations.", - "ext-gmp": "Install the GMP (GNU Multiple Precision) extension in order to speed up arbitrary precision integer arithmetic operations.", - "ext-dom": "Install the DOM extension to load XML formatted public keys." - }, - "autoload": { - "files": [ - "phpseclib\/bootstrap.php" - ], - "psr-4": { - "OCA\\Libresign\\Vendor\\phpseclib3\\": "phpseclib\/" - } - }, - "autoload-dev": { - "psr-4": { - "OCA\\Libresign\\Vendor\\phpseclib3\\Tests\\": "tests\/" - } - }, - "config": { - "sort-packages": true - } -} \ No newline at end of file diff --git a/composer/phpseclib/phpseclib/phpseclib/Common/Functions/Strings.php b/composer/phpseclib/phpseclib/phpseclib/Common/Functions/Strings.php deleted file mode 100644 index 402e0ad..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Common/Functions/Strings.php +++ /dev/null @@ -1,507 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Common\Functions; - -use OCA\Libresign\Vendor\ParagonIE\ConstantTime\Base64; -use OCA\Libresign\Vendor\ParagonIE\ConstantTime\Base64UrlSafe; -use OCA\Libresign\Vendor\ParagonIE\ConstantTime\Hex; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -use OCA\Libresign\Vendor\phpseclib3\Math\Common\FiniteField; - -/** - * Common String Functions - * - * @author Jim Wigginton - */ -abstract class Strings -{ - /** - * String Shift - * - * Inspired by array_shift - * - * @param string $string - * @param int $index - * @return string - */ - public static function shift(&$string, $index = 1) - { - $substr = substr($string, 0, $index); - $string = substr($string, $index); - return $substr; - } - - /** - * String Pop - * - * Inspired by array_pop - * - * @param string $string - * @param int $index - * @return string - */ - public static function pop(&$string, $index = 1) - { - $substr = substr($string, -$index); - $string = substr($string, 0, -$index); - return $substr; - } - - /** - * Parse SSH2-style string - * - * Returns either an array or a boolean if $data is malformed. - * - * Valid characters for $format are as follows: - * - * C = byte - * b = boolean (true/false) - * N = uint32 - * Q = uint64 - * s = string - * i = mpint - * L = name-list - * - * uint64 is not supported. - * - * @param string $format - * @param string $data - * @return mixed - */ - public static function unpackSSH2($format, &$data) - { - $format = self::formatPack($format); - $result = []; - for ($i = 0; $i < strlen($format); $i++) { - switch ($format[$i]) { - case 'C': - case 'b': - if (!strlen($data)) { - throw new \LengthException('At least one byte needs to be present for successful C / b decodes'); - } - break; - case 'N': - case 'i': - case 's': - case 'L': - if (strlen($data) < 4) { - throw new \LengthException('At least four byte needs to be present for successful N / i / s / L decodes'); - } - break; - case 'Q': - if (strlen($data) < 8) { - throw new \LengthException('At least eight byte needs to be present for successful N / i / s / L decodes'); - } - break; - - default: - throw new \InvalidArgumentException('$format contains an invalid character'); - } - switch ($format[$i]) { - case 'C': - $result[] = ord(self::shift($data)); - continue 2; - case 'b': - $result[] = ord(self::shift($data)) != 0; - continue 2; - case 'N': - list(, $temp) = unpack('N', self::shift($data, 4)); - $result[] = $temp; - continue 2; - case 'Q': - // pack() added support for Q in PHP 5.6.3 and PHP 5.6 is phpseclib 3's minimum version - // so in theory we could support this BUT, "64-bit format codes are not available for - // 32-bit versions" and phpseclib works on 32-bit installs. on 32-bit installs - // 64-bit floats can be used to get larger numbers then 32-bit signed ints would allow - // for. sure, you're not gonna get the full precision of 64-bit numbers but just because - // you need > 32-bit precision doesn't mean you need the full 64-bit precision - $unpacked = unpack('Nupper/Nlower', self::shift($data, 8)); - $upper = $unpacked['upper']; - $lower = $unpacked['lower']; - $temp = $upper ? 4294967296 * $upper : 0; - $temp += $lower < 0 ? ($lower & 0x7FFFFFFFF) + 0x80000000 : $lower; - // $temp = hexdec(bin2hex(self::shift($data, 8))); - $result[] = $temp; - continue 2; - } - list(, $length) = unpack('N', self::shift($data, 4)); - if (strlen($data) < $length) { - throw new \LengthException("$length bytes needed; " . strlen($data) . ' bytes available'); - } - $temp = self::shift($data, $length); - switch ($format[$i]) { - case 'i': - $result[] = new BigInteger($temp, -256); - break; - case 's': - $result[] = $temp; - break; - case 'L': - $result[] = explode(',', $temp); - } - } - - return $result; - } - - /** - * Create SSH2-style string - * - * @param string $format - * @param string|int|float|array|bool ...$elements - * @return string - */ - public static function packSSH2($format, ...$elements) - { - $format = self::formatPack($format); - if (strlen($format) != count($elements)) { - throw new \InvalidArgumentException('There must be as many arguments as there are characters in the $format string'); - } - $result = ''; - for ($i = 0; $i < strlen($format); $i++) { - $element = $elements[$i]; - switch ($format[$i]) { - case 'C': - if (!is_int($element)) { - throw new \InvalidArgumentException('Bytes must be represented as an integer between 0 and 255, inclusive.'); - } - $result .= pack('C', $element); - break; - case 'b': - if (!is_bool($element)) { - throw new \InvalidArgumentException('A boolean parameter was expected.'); - } - $result .= $element ? "\1" : "\0"; - break; - case 'Q': - if (!is_int($element) && !is_float($element)) { - throw new \InvalidArgumentException('An integer was expected.'); - } - // 4294967296 == 1 << 32 - $result .= pack('NN', $element / 4294967296, $element); - break; - case 'N': - if (is_float($element)) { - $element = (int) $element; - } - if (!is_int($element)) { - throw new \InvalidArgumentException('An integer was expected.'); - } - $result .= pack('N', $element); - break; - case 's': - if (!self::is_stringable($element)) { - throw new \InvalidArgumentException('A string was expected.'); - } - $result .= pack('Na*', strlen($element), $element); - break; - case 'i': - if (!$element instanceof BigInteger && !$element instanceof FiniteField\Integer) { - throw new \InvalidArgumentException('A phpseclib3\Math\BigInteger or phpseclib3\Math\Common\FiniteField\Integer object was expected.'); - } - $element = $element->toBytes(true); - $result .= pack('Na*', strlen($element), $element); - break; - case 'L': - if (!is_array($element)) { - throw new \InvalidArgumentException('An array was expected.'); - } - $element = implode(',', $element); - $result .= pack('Na*', strlen($element), $element); - break; - default: - throw new \InvalidArgumentException('$format contains an invalid character'); - } - } - return $result; - } - - /** - * Expand a pack string - * - * Converts C5 to CCCCC, for example. - * - * @param string $format - * @return string - */ - private static function formatPack($format) - { - $parts = preg_split('#(\d+)#', $format, -1, PREG_SPLIT_DELIM_CAPTURE); - $format = ''; - for ($i = 1; $i < count($parts); $i += 2) { - $format .= substr($parts[$i - 1], 0, -1) . str_repeat(substr($parts[$i - 1], -1), $parts[$i]); - } - $format .= $parts[$i - 1]; - - return $format; - } - - /** - * Convert binary data into bits - * - * bin2hex / hex2bin refer to base-256 encoded data as binary, whilst - * decbin / bindec refer to base-2 encoded data as binary. For the purposes - * of this function, bin refers to base-256 encoded data whilst bits refers - * to base-2 encoded data - * - * @param string $x - * @return string - */ - public static function bits2bin($x) - { - /* - // the pure-PHP approach is faster than the GMP approach - if (function_exists('gmp_export')) { - return strlen($x) ? gmp_export(gmp_init($x, 2)) : gmp_init(0); - } - */ - - if (preg_match('#[^01]#', $x)) { - throw new \RuntimeException('The only valid characters are 0 and 1'); - } - - if (!defined('PHP_INT_MIN')) { - define('PHP_INT_MIN', ~PHP_INT_MAX); - } - - $length = strlen($x); - if (!$length) { - return ''; - } - $block_size = PHP_INT_SIZE << 3; - $pad = $block_size - ($length % $block_size); - if ($pad != $block_size) { - $x = str_repeat('0', $pad) . $x; - } - - $parts = str_split($x, $block_size); - $str = ''; - foreach ($parts as $part) { - $xor = $part[0] == '1' ? PHP_INT_MIN : 0; - $part[0] = '0'; - $str .= pack( - PHP_INT_SIZE == 4 ? 'N' : 'J', - $xor ^ eval('return 0b' . $part . ';') - ); - } - return ltrim($str, "\0"); - } - - /** - * Convert bits to binary data - * - * @param string $x - * @return string - */ - public static function bin2bits($x, $trim = true) - { - /* - // the pure-PHP approach is slower than the GMP approach BUT - // i want to the pure-PHP version to be easily unit tested as well - if (function_exists('gmp_import')) { - return gmp_strval(gmp_import($x), 2); - } - */ - - $len = strlen($x); - $mod = $len % PHP_INT_SIZE; - if ($mod) { - $x = str_pad($x, $len + PHP_INT_SIZE - $mod, "\0", STR_PAD_LEFT); - } - - $bits = ''; - if (PHP_INT_SIZE == 4) { - $digits = unpack('N*', $x); - foreach ($digits as $digit) { - $bits .= sprintf('%032b', $digit); - } - } else { - $digits = unpack('J*', $x); - foreach ($digits as $digit) { - $bits .= sprintf('%064b', $digit); - } - } - - return $trim ? ltrim($bits, '0') : $bits; - } - - /** - * Switch Endianness Bit Order - * - * @param string $x - * @return string - */ - public static function switchEndianness($x) - { - $r = ''; - for ($i = strlen($x) - 1; $i >= 0; $i--) { - $b = ord($x[$i]); - if (PHP_INT_SIZE === 8) { - // 3 operations - // from http://graphics.stanford.edu/~seander/bithacks.html#ReverseByteWith64BitsDiv - $r .= chr((($b * 0x0202020202) & 0x010884422010) % 1023); - } else { - // 7 operations - // from http://graphics.stanford.edu/~seander/bithacks.html#ReverseByteWith32Bits - $p1 = ($b * 0x0802) & 0x22110; - $p2 = ($b * 0x8020) & 0x88440; - $r .= chr( - (($p1 | $p2) * 0x10101) >> 16 - ); - } - } - return $r; - } - - /** - * Increment the current string - * - * @param string $var - * @return string - */ - public static function increment_str(&$var) - { - if (function_exists('sodium_increment')) { - $var = strrev($var); - sodium_increment($var); - $var = strrev($var); - return $var; - } - - for ($i = 4; $i <= strlen($var); $i += 4) { - $temp = substr($var, -$i, 4); - switch ($temp) { - case "\xFF\xFF\xFF\xFF": - $var = substr_replace($var, "\x00\x00\x00\x00", -$i, 4); - break; - case "\x7F\xFF\xFF\xFF": - $var = substr_replace($var, "\x80\x00\x00\x00", -$i, 4); - return $var; - default: - $temp = unpack('Nnum', $temp); - $var = substr_replace($var, pack('N', $temp['num'] + 1), -$i, 4); - return $var; - } - } - - $remainder = strlen($var) % 4; - - if ($remainder == 0) { - return $var; - } - - $temp = unpack('Nnum', str_pad(substr($var, 0, $remainder), 4, "\0", STR_PAD_LEFT)); - $temp = substr(pack('N', $temp['num'] + 1), -$remainder); - $var = substr_replace($var, $temp, 0, $remainder); - - return $var; - } - - /** - * Find whether the type of a variable is string (or could be converted to one) - * - * @param mixed $var - * @return bool - * @psalm-assert-if-true string|\Stringable $var - */ - public static function is_stringable($var) - { - return is_string($var) || (is_object($var) && method_exists($var, '__toString')); - } - - /** - * Constant Time Base64-decoding - * - * ParagoneIE\ConstantTime doesn't use libsodium if it's available so we'll do so - * ourselves. see https://github.com/paragonie/constant_time_encoding/issues/39 - * - * @param string $data - * @return string - */ - public static function base64_decode($data) - { - return function_exists('sodium_base642bin') ? - sodium_base642bin($data, SODIUM_BASE64_VARIANT_ORIGINAL_NO_PADDING, '=') : - Base64::decode($data); - } - - /** - * Constant Time Base64-decoding (URL safe) - * - * @param string $data - * @return string - */ - public static function base64url_decode($data) - { - // return self::base64_decode(str_replace(['-', '_'], ['+', '/'], $data)); - - return function_exists('sodium_base642bin') ? - sodium_base642bin($data, SODIUM_BASE64_VARIANT_URLSAFE_NO_PADDING, '=') : - Base64UrlSafe::decode($data); - } - - /** - * Constant Time Base64-encoding - * - * @param string $data - * @return string - */ - public static function base64_encode($data) - { - return function_exists('sodium_bin2base64') ? - sodium_bin2base64($data, SODIUM_BASE64_VARIANT_ORIGINAL) : - Base64::encode($data); - } - - /** - * Constant Time Base64-encoding (URL safe) - * - * @param string $data - * @return string - */ - public static function base64url_encode($data) - { - // return str_replace(['+', '/'], ['-', '_'], self::base64_encode($data)); - - return function_exists('sodium_bin2base64') ? - sodium_bin2base64($data, SODIUM_BASE64_VARIANT_URLSAFE_NO_PADDING) : - Base64UrlSafe::encode($data); - } - - /** - * Constant Time Hex Decoder - * - * @param string $data - * @return string - */ - public static function hex2bin($data) - { - return function_exists('sodium_hex2bin') ? - sodium_hex2bin($data) : - Hex::decode($data); - } - - /** - * Constant Time Hex Encoder - * - * @param string $data - * @return string - */ - public static function bin2hex($data) - { - return function_exists('sodium_bin2hex') ? - sodium_bin2hex($data) : - Hex::encode($data); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/AES.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/AES.php deleted file mode 100644 index 1dd6a61..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/AES.php +++ /dev/null @@ -1,116 +0,0 @@ - - * setKey('abcdefghijklmnop'); - * - * $size = 10 * 1024; - * $plaintext = ''; - * for ($i = 0; $i < $size; $i++) { - * $plaintext.= 'a'; - * } - * - * echo $aes->decrypt($aes->encrypt($plaintext)); - * ?> - * - * - * @author Jim Wigginton - * @copyright 2008 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt; - -/** - * Pure-PHP implementation of AES. - * - * @author Jim Wigginton - */ -class AES extends Rijndael -{ - /** - * Dummy function - * - * Since \phpseclib3\Crypt\AES extends \phpseclib3\Crypt\Rijndael, this function is, technically, available, but it doesn't do anything. - * - * @see \phpseclib3\Crypt\Rijndael::setBlockLength() - * @param int $length - * @throws \BadMethodCallException anytime it's called - */ - public function setBlockLength($length) - { - throw new \BadMethodCallException('The block length cannot be set for AES.'); - } - - /** - * Sets the key length - * - * Valid key lengths are 128, 192, and 256. Set the link to bool(false) to disable a fixed key length - * - * @see \phpseclib3\Crypt\Rijndael:setKeyLength() - * @param int $length - * @throws \LengthException if the key length isn't supported - */ - public function setKeyLength($length) - { - switch ($length) { - case 128: - case 192: - case 256: - break; - default: - throw new \LengthException('Key of size ' . $length . ' not supported by this algorithm. Only keys of sizes 128, 192 or 256 supported'); - } - parent::setKeyLength($length); - } - - /** - * Sets the key. - * - * Rijndael supports five different key lengths, AES only supports three. - * - * @see \phpseclib3\Crypt\Rijndael:setKey() - * @see setKeyLength() - * @param string $key - * @throws \LengthException if the key length isn't supported - */ - public function setKey($key) - { - switch (strlen($key)) { - case 16: - case 24: - case 32: - break; - default: - throw new \LengthException('Key of size ' . strlen($key) . ' not supported by this algorithm. Only keys of sizes 16, 24 or 32 supported'); - } - - parent::setKey($key); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/Blowfish.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/Blowfish.php deleted file mode 100644 index ad2d669..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/Blowfish.php +++ /dev/null @@ -1,835 +0,0 @@ - unpack('N*', $x), $blocks); it jumps up by an additional - * ~90MB, yielding a 106x increase in memory usage. Consequently, it bcrypt calls a different - * _encryptBlock() then the regular Blowfish does. That said, the Blowfish _encryptBlock() is - * basically just a thin wrapper around the bcrypt _encryptBlock(), so there's that. - * - * This explains 3 of the 4 _encryptBlock() implementations. the last _encryptBlock() - * implementation can best be understood by doing Ctrl + F and searching for where - * self::$use_reg_intval is defined. - * - * # phpseclib's three different _setupKey() implementations - * - * Every bcrypt round is the equivalent of encrypting 512KB of data. Since OpenSSH uses 16 - * rounds by default that's ~8MB of data that's essentially being encrypted whenever - * you use bcrypt. That's a lot of data, however, bcrypt operates within tighter constraints - * than regular Blowfish, so we can use that to our advantage. In particular, whereas Blowfish - * supports variable length keys, in bcrypt, the initial "key" is the sha512 hash of the - * password. sha512 hashes are 512 bits or 64 bytes long and thus the bcrypt keys are of a - * fixed length whereas Blowfish keys are not of a fixed length. - * - * bcrypt actually has two different key expansion steps. The first one (expandstate) is - * constantly XOR'ing every _encryptBlock() parameter against the salt prior _encryptBlock()'s - * being called. The second one (expand0state) is more similar to Blowfish's _setupKey() - * but it can still use the fixed length key optimization discussed above and can do away with - * the pack() / unpack() calls. - * - * I suppose _setupKey() could be made to be a thin wrapper around expandstate() but idk it's - * just a lot of work for very marginal benefits as _setupKey() is only called once for - * regular Blowfish vs the 128 times it's called --per round-- with bcrypt. - * - * # blowfish + bcrypt in the same class - * - * Altho there's a lot of Blowfish code that bcrypt doesn't re-use, bcrypt does re-use the - * initial S-boxes, the initial P-array and the int-only _encryptBlock() implementation. - * - * # Credit - * - * phpseclib's bcrypt implementation is based losely off of OpenSSH's implementation: - * - * https://github.com/openssh/openssh-portable/blob/master/openbsd-compat/bcrypt_pbkdf.c - * - * Here's a short example of how to use this library: - * - * setKey('12345678901234567890123456789012'); - * - * $plaintext = str_repeat('a', 1024); - * - * echo $blowfish->decrypt($blowfish->encrypt($plaintext)); - * ?> - * - * - * @author Jim Wigginton - * @author Hans-Juergen Petrich - * @copyright 2007 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\BlockCipher; - -/** - * Pure-PHP implementation of Blowfish. - * - * @author Jim Wigginton - * @author Hans-Juergen Petrich - */ -class Blowfish extends BlockCipher -{ - /** - * Block Length of the cipher - * - * @see Common\SymmetricKey::block_size - * @var int - */ - protected $block_size = 8; - - /** - * The mcrypt specific name of the cipher - * - * @see Common\SymmetricKey::cipher_name_mcrypt - * @var string - */ - protected $cipher_name_mcrypt = 'blowfish'; - - /** - * Optimizing value while CFB-encrypting - * - * @see Common\SymmetricKey::cfb_init_len - * @var int - */ - protected $cfb_init_len = 500; - - /** - * The fixed subkeys boxes - * - * S-Box - * - * @var array - */ - private static $sbox = [ - 0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7, 0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99, - 0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16, 0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e, - 0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee, 0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013, - 0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef, 0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e, - 0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60, 0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440, - 0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce, 0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a, - 0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e, 0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677, - 0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193, 0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032, - 0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88, 0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239, - 0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e, 0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0, - 0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3, 0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98, - 0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88, 0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe, - 0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6, 0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d, - 0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b, 0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7, - 0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba, 0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463, - 0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f, 0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09, - 0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3, 0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb, - 0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279, 0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8, - 0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab, 0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82, - 0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db, 0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573, - 0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0, 0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b, - 0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790, 0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8, - 0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4, 0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0, - 0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7, 0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c, - 0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad, 0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1, - 0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299, 0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9, - 0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477, 0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf, - 0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49, 0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af, - 0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa, 0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5, - 0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41, 0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915, - 0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400, 0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915, - 0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664, 0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a, - - 0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623, 0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266, - 0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1, 0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e, - 0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6, 0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1, - 0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e, 0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1, - 0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737, 0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8, - 0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff, 0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd, - 0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701, 0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7, - 0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41, 0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331, - 0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf, 0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af, - 0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e, 0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87, - 0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c, 0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2, - 0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16, 0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd, - 0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b, 0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509, - 0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e, 0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3, - 0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f, 0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a, - 0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4, 0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960, - 0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66, 0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28, - 0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802, 0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84, - 0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510, 0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf, - 0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14, 0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e, - 0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50, 0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7, - 0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8, 0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281, - 0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99, 0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696, - 0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128, 0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73, - 0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0, 0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0, - 0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105, 0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250, - 0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3, 0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285, - 0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00, 0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061, - 0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb, 0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e, - 0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735, 0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc, - 0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9, 0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340, - 0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20, 0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7, - - 0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934, 0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068, - 0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af, 0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840, - 0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45, 0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504, - 0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a, 0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb, - 0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee, 0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6, - 0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42, 0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b, - 0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2, 0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb, - 0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527, 0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b, - 0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33, 0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c, - 0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3, 0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc, - 0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17, 0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564, - 0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b, 0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115, - 0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922, 0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728, - 0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0, 0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e, - 0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37, 0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d, - 0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804, 0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b, - 0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3, 0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb, - 0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d, 0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c, - 0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350, 0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9, - 0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a, 0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe, - 0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d, 0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc, - 0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f, 0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61, - 0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2, 0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9, - 0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2, 0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c, - 0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e, 0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633, - 0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10, 0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169, - 0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52, 0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027, - 0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5, 0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62, - 0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634, 0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76, - 0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24, 0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc, - 0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4, 0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c, - 0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837, 0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0, - - 0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b, 0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe, - 0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b, 0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4, - 0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8, 0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6, - 0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304, 0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22, - 0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4, 0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6, - 0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9, 0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59, - 0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593, 0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51, - 0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28, 0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c, - 0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b, 0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28, - 0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c, 0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd, - 0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a, 0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319, - 0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb, 0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f, - 0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991, 0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32, - 0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680, 0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166, - 0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae, 0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb, - 0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5, 0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47, - 0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370, 0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d, - 0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84, 0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048, - 0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8, 0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd, - 0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9, 0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7, - 0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38, 0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f, - 0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c, 0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525, - 0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1, 0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442, - 0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964, 0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e, - 0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8, 0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d, - 0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f, 0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299, - 0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02, 0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc, - 0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614, 0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a, - 0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6, 0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b, - 0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0, 0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060, - 0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e, 0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9, - 0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f, 0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6 - ]; - - /** - * P-Array consists of 18 32-bit subkeys - * - * @var array - */ - private static $parray = [ - 0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344, 0xa4093822, 0x299f31d0, - 0x082efa98, 0xec4e6c89, 0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c, - 0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917, 0x9216d5d9, 0x8979fb1b - ]; - - /** - * The BCTX-working Array - * - * Holds the expanded key [p] and the key-depended s-boxes [sb] - * - * @var array - */ - private $bctx; - - /** - * Holds the last used key - * - * @var array - */ - private $kl; - - /** - * The Key Length (in bytes) - * {@internal The max value is 256 / 8 = 32, the min value is 128 / 8 = 16. Exists in conjunction with $Nk - * because the encryption / decryption / key schedule creation requires this number and not $key_length. We could - * derive this from $key_length or vice versa, but that'd mean we'd have to do multiple shift operations, so in lieu - * of that, we'll just precompute it once.} - * - * @see Common\SymmetricKey::setKeyLength() - * @var int - */ - protected $key_length = 16; - - /** - * Default Constructor. - * - * @param string $mode - * @throws \InvalidArgumentException if an invalid / unsupported mode is provided - */ - public function __construct($mode) - { - parent::__construct($mode); - - if ($this->mode == self::MODE_STREAM) { - throw new \InvalidArgumentException('Block ciphers cannot be ran in stream mode'); - } - } - - /** - * Sets the key length. - * - * Key lengths can be between 32 and 448 bits. - * - * @param int $length - */ - public function setKeyLength($length) - { - if ($length < 32 || $length > 448) { - throw new \LengthException('Key size of ' . $length . ' bits is not supported by this algorithm. Only keys of sizes between 32 and 448 bits are supported'); - } - - $this->key_length = $length >> 3; - - parent::setKeyLength($length); - } - - /** - * Test for engine validity - * - * This is mainly just a wrapper to set things up for \phpseclib3\Crypt\Common\SymmetricKey::isValidEngine() - * - * @see Common\SymmetricKey::isValidEngine() - * @param int $engine - * @return bool - */ - protected function isValidEngineHelper($engine) - { - if ($engine == self::ENGINE_OPENSSL) { - if ($this->key_length < 16) { - return false; - } - // quoting https://www.openssl.org/news/openssl-3.0-notes.html, OpenSSL 3.0.1 - // "Moved all variations of the EVP ciphers CAST5, BF, IDEA, SEED, RC2, RC4, RC5, and DES to the legacy provider" - // in theory openssl_get_cipher_methods() should catch this but, on GitHub Actions, at least, it does not - if (defined('OPENSSL_VERSION_TEXT') && version_compare(preg_replace('#OpenSSL (\d+\.\d+\.\d+) .*#', '$1', OPENSSL_VERSION_TEXT), '3.0.1', '>=')) { - return false; - } - $this->cipher_name_openssl_ecb = 'bf-ecb'; - $this->cipher_name_openssl = 'bf-' . $this->openssl_translate_mode(); - } - - return parent::isValidEngineHelper($engine); - } - - /** - * Setup the key (expansion) - * - * @see Common\SymmetricKey::_setupKey() - */ - protected function setupKey() - { - if (isset($this->kl['key']) && $this->key === $this->kl['key']) { - // already expanded - return; - } - $this->kl = ['key' => $this->key]; - - /* key-expanding p[] and S-Box building sb[] */ - $this->bctx = [ - 'p' => [], - 'sb' => self::$sbox - ]; - - // unpack binary string in unsigned chars - $key = array_values(unpack('C*', $this->key)); - $keyl = count($key); - // with bcrypt $keyl will always be 16 (because the key is the sha512 of the key you provide) - for ($j = 0, $i = 0; $i < 18; ++$i) { - // xor P1 with the first 32-bits of the key, xor P2 with the second 32-bits ... - for ($data = 0, $k = 0; $k < 4; ++$k) { - $data = ($data << 8) | $key[$j]; - if (++$j >= $keyl) { - $j = 0; - } - } - $this->bctx['p'][] = self::$parray[$i] ^ intval($data); - } - - // encrypt the zero-string, replace P1 and P2 with the encrypted data, - // encrypt P3 and P4 with the new P1 and P2, do it with all P-array and subkeys - $data = "\0\0\0\0\0\0\0\0"; - for ($i = 0; $i < 18; $i += 2) { - list($l, $r) = array_values(unpack('N*', $data = $this->encryptBlock($data))); - $this->bctx['p'][$i ] = $l; - $this->bctx['p'][$i + 1] = $r; - } - for ($i = 0; $i < 0x400; $i += 0x100) { - for ($j = 0; $j < 256; $j += 2) { - list($l, $r) = array_values(unpack('N*', $data = $this->encryptBlock($data))); - $this->bctx['sb'][$i | $j] = $l; - $this->bctx['sb'][$i | ($j + 1)] = $r; - } - } - } - - /** - * Initialize Static Variables - */ - protected static function initialize_static_variables() - { - if (is_float(self::$sbox[0x200])) { - self::$sbox = array_map('intval', self::$sbox); - self::$parray = array_map('intval', self::$parray); - } - - parent::initialize_static_variables(); - } - - /** - * bcrypt - * - * @param string $sha2pass - * @param string $sha2salt - * @access private - * @return string - */ - private static function bcrypt_hash($sha2pass, $sha2salt) - { - $p = self::$parray; - $sbox = self::$sbox; - - $cdata = array_values(unpack('N*', 'OxychromaticBlowfishSwatDynamite')); - $sha2pass = array_values(unpack('N*', $sha2pass)); - $sha2salt = array_values(unpack('N*', $sha2salt)); - - self::expandstate($sha2salt, $sha2pass, $sbox, $p); - for ($i = 0; $i < 64; $i++) { - self::expand0state($sha2salt, $sbox, $p); - self::expand0state($sha2pass, $sbox, $p); - } - - for ($i = 0; $i < 64; $i++) { - for ($j = 0; $j < 8; $j += 2) { // count($cdata) == 8 - list($cdata[$j], $cdata[$j + 1]) = self::encryptBlockHelperFast($cdata[$j], $cdata[$j + 1], $sbox, $p); - } - } - - return pack('V*', ...$cdata); - } - - /** - * Performs OpenSSH-style bcrypt - * - * @param string $pass - * @param string $salt - * @param int $keylen - * @param int $rounds - * @access public - * @return string - */ - public static function bcrypt_pbkdf($pass, $salt, $keylen, $rounds) - { - self::initialize_static_variables(); - - if (PHP_INT_SIZE == 4) { - throw new \RuntimeException('bcrypt is far too slow to be practical on 32-bit versions of PHP'); - } - - $sha2pass = hash('sha512', $pass, true); - $results = []; - $count = 1; - while (32 * count($results) < $keylen) { - $countsalt = $salt . pack('N', $count++); - $sha2salt = hash('sha512', $countsalt, true); - $out = $tmpout = self::bcrypt_hash($sha2pass, $sha2salt); - for ($i = 1; $i < $rounds; $i++) { - $sha2salt = hash('sha512', $tmpout, true); - $tmpout = self::bcrypt_hash($sha2pass, $sha2salt); - $out ^= $tmpout; - } - $results[] = $out; - } - $output = ''; - for ($i = 0; $i < 32; $i++) { - foreach ($results as $result) { - $output .= $result[$i]; - } - } - return substr($output, 0, $keylen); - } - - /** - * Key expansion without salt - * - * @access private - * @param int[] $key - * @param int[] $sbox - * @param int[] $p - * @see self::_bcrypt_hash() - */ - private static function expand0state(array $key, array &$sbox, array &$p) - { - // expand0state is basically the same thing as this: - //return self::expandstate(array_fill(0, 16, 0), $key); - // but this separate function eliminates a bunch of XORs and array lookups - - $p = [ - $p[0] ^ $key[0], - $p[1] ^ $key[1], - $p[2] ^ $key[2], - $p[3] ^ $key[3], - $p[4] ^ $key[4], - $p[5] ^ $key[5], - $p[6] ^ $key[6], - $p[7] ^ $key[7], - $p[8] ^ $key[8], - $p[9] ^ $key[9], - $p[10] ^ $key[10], - $p[11] ^ $key[11], - $p[12] ^ $key[12], - $p[13] ^ $key[13], - $p[14] ^ $key[14], - $p[15] ^ $key[15], - $p[16] ^ $key[0], - $p[17] ^ $key[1] - ]; - - // @codingStandardsIgnoreStart - list( $p[0], $p[1]) = self::encryptBlockHelperFast( 0, 0, $sbox, $p); - list( $p[2], $p[3]) = self::encryptBlockHelperFast($p[ 0], $p[ 1], $sbox, $p); - list( $p[4], $p[5]) = self::encryptBlockHelperFast($p[ 2], $p[ 3], $sbox, $p); - list( $p[6], $p[7]) = self::encryptBlockHelperFast($p[ 4], $p[ 5], $sbox, $p); - list( $p[8], $p[9]) = self::encryptBlockHelperFast($p[ 6], $p[ 7], $sbox, $p); - list($p[10], $p[11]) = self::encryptBlockHelperFast($p[ 8], $p[ 9], $sbox, $p); - list($p[12], $p[13]) = self::encryptBlockHelperFast($p[10], $p[11], $sbox, $p); - list($p[14], $p[15]) = self::encryptBlockHelperFast($p[12], $p[13], $sbox, $p); - list($p[16], $p[17]) = self::encryptBlockHelperFast($p[14], $p[15], $sbox, $p); - // @codingStandardsIgnoreEnd - - list($sbox[0], $sbox[1]) = self::encryptBlockHelperFast($p[16], $p[17], $sbox, $p); - for ($i = 2; $i < 1024; $i += 2) { - list($sbox[$i], $sbox[$i + 1]) = self::encryptBlockHelperFast($sbox[$i - 2], $sbox[$i - 1], $sbox, $p); - } - } - - /** - * Key expansion with salt - * - * @access private - * @param int[] $data - * @param int[] $key - * @param int[] $sbox - * @param int[] $p - * @see self::_bcrypt_hash() - */ - private static function expandstate(array $data, array $key, array &$sbox, array &$p) - { - $p = [ - $p[0] ^ $key[0], - $p[1] ^ $key[1], - $p[2] ^ $key[2], - $p[3] ^ $key[3], - $p[4] ^ $key[4], - $p[5] ^ $key[5], - $p[6] ^ $key[6], - $p[7] ^ $key[7], - $p[8] ^ $key[8], - $p[9] ^ $key[9], - $p[10] ^ $key[10], - $p[11] ^ $key[11], - $p[12] ^ $key[12], - $p[13] ^ $key[13], - $p[14] ^ $key[14], - $p[15] ^ $key[15], - $p[16] ^ $key[0], - $p[17] ^ $key[1] - ]; - - // @codingStandardsIgnoreStart - list( $p[0], $p[1]) = self::encryptBlockHelperFast($data[ 0] , $data[ 1] , $sbox, $p); - list( $p[2], $p[3]) = self::encryptBlockHelperFast($data[ 2] ^ $p[ 0], $data[ 3] ^ $p[ 1], $sbox, $p); - list( $p[4], $p[5]) = self::encryptBlockHelperFast($data[ 4] ^ $p[ 2], $data[ 5] ^ $p[ 3], $sbox, $p); - list( $p[6], $p[7]) = self::encryptBlockHelperFast($data[ 6] ^ $p[ 4], $data[ 7] ^ $p[ 5], $sbox, $p); - list( $p[8], $p[9]) = self::encryptBlockHelperFast($data[ 8] ^ $p[ 6], $data[ 9] ^ $p[ 7], $sbox, $p); - list($p[10], $p[11]) = self::encryptBlockHelperFast($data[10] ^ $p[ 8], $data[11] ^ $p[ 9], $sbox, $p); - list($p[12], $p[13]) = self::encryptBlockHelperFast($data[12] ^ $p[10], $data[13] ^ $p[11], $sbox, $p); - list($p[14], $p[15]) = self::encryptBlockHelperFast($data[14] ^ $p[12], $data[15] ^ $p[13], $sbox, $p); - list($p[16], $p[17]) = self::encryptBlockHelperFast($data[ 0] ^ $p[14], $data[ 1] ^ $p[15], $sbox, $p); - // @codingStandardsIgnoreEnd - - list($sbox[0], $sbox[1]) = self::encryptBlockHelperFast($data[2] ^ $p[16], $data[3] ^ $p[17], $sbox, $p); - for ($i = 2, $j = 4; $i < 1024; $i += 2, $j = ($j + 2) % 16) { // instead of 16 maybe count($data) would be better? - list($sbox[$i], $sbox[$i + 1]) = self::encryptBlockHelperFast($data[$j] ^ $sbox[$i - 2], $data[$j + 1] ^ $sbox[$i - 1], $sbox, $p); - } - } - - /** - * Encrypts a block - * - * @param string $in - * @return string - */ - protected function encryptBlock($in) - { - $p = $this->bctx['p']; - // extract($this->bctx['sb'], EXTR_PREFIX_ALL, 'sb'); // slower - $sb = $this->bctx['sb']; - - $in = unpack('N*', $in); - $l = $in[1]; - $r = $in[2]; - - list($r, $l) = PHP_INT_SIZE == 4 ? - self::encryptBlockHelperSlow($l, $r, $sb, $p) : - self::encryptBlockHelperFast($l, $r, $sb, $p); - - return pack("N*", $r, $l); - } - - /** - * Fast helper function for block encryption - * - * @access private - * @param int $x0 - * @param int $x1 - * @param int[] $sbox - * @param int[] $p - * @return int[] - */ - private static function encryptBlockHelperFast($x0, $x1, array $sbox, array $p) - { - $x0 ^= $p[0]; - $x1 ^= ((($sbox[($x0 & 0xFF000000) >> 24] + $sbox[0x100 | (($x0 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x0 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x0 & 0xFF)]) ^ $p[1]; - $x0 ^= ((($sbox[($x1 & 0xFF000000) >> 24] + $sbox[0x100 | (($x1 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x1 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x1 & 0xFF)]) ^ $p[2]; - $x1 ^= ((($sbox[($x0 & 0xFF000000) >> 24] + $sbox[0x100 | (($x0 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x0 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x0 & 0xFF)]) ^ $p[3]; - $x0 ^= ((($sbox[($x1 & 0xFF000000) >> 24] + $sbox[0x100 | (($x1 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x1 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x1 & 0xFF)]) ^ $p[4]; - $x1 ^= ((($sbox[($x0 & 0xFF000000) >> 24] + $sbox[0x100 | (($x0 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x0 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x0 & 0xFF)]) ^ $p[5]; - $x0 ^= ((($sbox[($x1 & 0xFF000000) >> 24] + $sbox[0x100 | (($x1 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x1 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x1 & 0xFF)]) ^ $p[6]; - $x1 ^= ((($sbox[($x0 & 0xFF000000) >> 24] + $sbox[0x100 | (($x0 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x0 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x0 & 0xFF)]) ^ $p[7]; - $x0 ^= ((($sbox[($x1 & 0xFF000000) >> 24] + $sbox[0x100 | (($x1 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x1 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x1 & 0xFF)]) ^ $p[8]; - $x1 ^= ((($sbox[($x0 & 0xFF000000) >> 24] + $sbox[0x100 | (($x0 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x0 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x0 & 0xFF)]) ^ $p[9]; - $x0 ^= ((($sbox[($x1 & 0xFF000000) >> 24] + $sbox[0x100 | (($x1 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x1 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x1 & 0xFF)]) ^ $p[10]; - $x1 ^= ((($sbox[($x0 & 0xFF000000) >> 24] + $sbox[0x100 | (($x0 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x0 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x0 & 0xFF)]) ^ $p[11]; - $x0 ^= ((($sbox[($x1 & 0xFF000000) >> 24] + $sbox[0x100 | (($x1 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x1 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x1 & 0xFF)]) ^ $p[12]; - $x1 ^= ((($sbox[($x0 & 0xFF000000) >> 24] + $sbox[0x100 | (($x0 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x0 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x0 & 0xFF)]) ^ $p[13]; - $x0 ^= ((($sbox[($x1 & 0xFF000000) >> 24] + $sbox[0x100 | (($x1 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x1 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x1 & 0xFF)]) ^ $p[14]; - $x1 ^= ((($sbox[($x0 & 0xFF000000) >> 24] + $sbox[0x100 | (($x0 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x0 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x0 & 0xFF)]) ^ $p[15]; - $x0 ^= ((($sbox[($x1 & 0xFF000000) >> 24] + $sbox[0x100 | (($x1 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x1 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x1 & 0xFF)]) ^ $p[16]; - - return [$x1 & 0xFFFFFFFF ^ $p[17], $x0 & 0xFFFFFFFF]; - } - - /** - * Slow helper function for block encryption - * - * @access private - * @param int $x0 - * @param int $x1 - * @param int[] $sbox - * @param int[] $p - * @return int[] - */ - private static function encryptBlockHelperSlow($x0, $x1, array $sbox, array $p) - { - // -16777216 == intval(0xFF000000) on 32-bit PHP installs - $x0 ^= $p[0]; - $x1 ^= self::safe_intval((self::safe_intval($sbox[(($x0 & -16777216) >> 24) & 0xFF] + $sbox[0x100 | (($x0 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x0 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x0 & 0xFF)]) ^ $p[1]; - $x0 ^= self::safe_intval((self::safe_intval($sbox[(($x1 & -16777216) >> 24) & 0xFF] + $sbox[0x100 | (($x1 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x1 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x1 & 0xFF)]) ^ $p[2]; - $x1 ^= self::safe_intval((self::safe_intval($sbox[(($x0 & -16777216) >> 24) & 0xFF] + $sbox[0x100 | (($x0 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x0 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x0 & 0xFF)]) ^ $p[3]; - $x0 ^= self::safe_intval((self::safe_intval($sbox[(($x1 & -16777216) >> 24) & 0xFF] + $sbox[0x100 | (($x1 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x1 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x1 & 0xFF)]) ^ $p[4]; - $x1 ^= self::safe_intval((self::safe_intval($sbox[(($x0 & -16777216) >> 24) & 0xFF] + $sbox[0x100 | (($x0 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x0 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x0 & 0xFF)]) ^ $p[5]; - $x0 ^= self::safe_intval((self::safe_intval($sbox[(($x1 & -16777216) >> 24) & 0xFF] + $sbox[0x100 | (($x1 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x1 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x1 & 0xFF)]) ^ $p[6]; - $x1 ^= self::safe_intval((self::safe_intval($sbox[(($x0 & -16777216) >> 24) & 0xFF] + $sbox[0x100 | (($x0 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x0 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x0 & 0xFF)]) ^ $p[7]; - $x0 ^= self::safe_intval((self::safe_intval($sbox[(($x1 & -16777216) >> 24) & 0xFF] + $sbox[0x100 | (($x1 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x1 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x1 & 0xFF)]) ^ $p[8]; - $x1 ^= self::safe_intval((self::safe_intval($sbox[(($x0 & -16777216) >> 24) & 0xFF] + $sbox[0x100 | (($x0 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x0 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x0 & 0xFF)]) ^ $p[9]; - $x0 ^= self::safe_intval((self::safe_intval($sbox[(($x1 & -16777216) >> 24) & 0xFF] + $sbox[0x100 | (($x1 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x1 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x1 & 0xFF)]) ^ $p[10]; - $x1 ^= self::safe_intval((self::safe_intval($sbox[(($x0 & -16777216) >> 24) & 0xFF] + $sbox[0x100 | (($x0 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x0 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x0 & 0xFF)]) ^ $p[11]; - $x0 ^= self::safe_intval((self::safe_intval($sbox[(($x1 & -16777216) >> 24) & 0xFF] + $sbox[0x100 | (($x1 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x1 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x1 & 0xFF)]) ^ $p[12]; - $x1 ^= self::safe_intval((self::safe_intval($sbox[(($x0 & -16777216) >> 24) & 0xFF] + $sbox[0x100 | (($x0 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x0 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x0 & 0xFF)]) ^ $p[13]; - $x0 ^= self::safe_intval((self::safe_intval($sbox[(($x1 & -16777216) >> 24) & 0xFF] + $sbox[0x100 | (($x1 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x1 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x1 & 0xFF)]) ^ $p[14]; - $x1 ^= self::safe_intval((self::safe_intval($sbox[(($x0 & -16777216) >> 24) & 0xFF] + $sbox[0x100 | (($x0 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x0 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x0 & 0xFF)]) ^ $p[15]; - $x0 ^= self::safe_intval((self::safe_intval($sbox[(($x1 & -16777216) >> 24) & 0xFF] + $sbox[0x100 | (($x1 & 0xFF0000) >> 16)]) ^ $sbox[0x200 | (($x1 & 0xFF00) >> 8)]) + $sbox[0x300 | ($x1 & 0xFF)]) ^ $p[16]; - - return [$x1 ^ $p[17], $x0]; - } - - /** - * Decrypts a block - * - * @param string $in - * @return string - */ - protected function decryptBlock($in) - { - $p = $this->bctx['p']; - $sb = $this->bctx['sb']; - - $in = unpack('N*', $in); - $l = $in[1]; - $r = $in[2]; - - for ($i = 17; $i > 2; $i -= 2) { - $l ^= $p[$i]; - $r ^= self::safe_intval((self::safe_intval($sb[$l >> 24 & 0xff] + $sb[0x100 + ($l >> 16 & 0xff)]) ^ - $sb[0x200 + ($l >> 8 & 0xff)]) + - $sb[0x300 + ($l & 0xff)]); - - $r ^= $p[$i - 1]; - $l ^= self::safe_intval((self::safe_intval($sb[$r >> 24 & 0xff] + $sb[0x100 + ($r >> 16 & 0xff)]) ^ - $sb[0x200 + ($r >> 8 & 0xff)]) + - $sb[0x300 + ($r & 0xff)]); - } - return pack('N*', $r ^ $p[0], $l ^ $p[1]); - } - - /** - * Setup the performance-optimized function for de/encrypt() - * - * @see Common\SymmetricKey::_setupInlineCrypt() - */ - protected function setupInlineCrypt() - { - $p = $this->bctx['p']; - $init_crypt = ' - static $sb; - if (!$sb) { - $sb = $this->bctx["sb"]; - } - '; - - $safeint = self::safe_intval_inline(); - - // Generating encrypt code: - $encrypt_block = ' - $in = unpack("N*", $in); - $l = $in[1]; - $r = $in[2]; - '; - for ($i = 0; $i < 16; $i += 2) { - $encrypt_block .= ' - $l^= ' . $p[$i] . '; - $r^= ' . sprintf($safeint, '(' . sprintf($safeint, '$sb[$l >> 24 & 0xff] + $sb[0x100 + ($l >> 16 & 0xff)]') . ' ^ - $sb[0x200 + ($l >> 8 & 0xff)]) + - $sb[0x300 + ($l & 0xff)]') . '; - - $r^= ' . $p[$i + 1] . '; - $l^= ' . sprintf($safeint, '(' . sprintf($safeint, '$sb[$r >> 24 & 0xff] + $sb[0x100 + ($r >> 16 & 0xff)]') . ' ^ - $sb[0x200 + ($r >> 8 & 0xff)]) + - $sb[0x300 + ($r & 0xff)]') . '; - '; - } - $encrypt_block .= ' - $in = pack("N*", - $r ^ ' . $p[17] . ', - $l ^ ' . $p[16] . ' - ); - '; - // Generating decrypt code: - $decrypt_block = ' - $in = unpack("N*", $in); - $l = $in[1]; - $r = $in[2]; - '; - - for ($i = 17; $i > 2; $i -= 2) { - $decrypt_block .= ' - $l^= ' . $p[$i] . '; - $r^= ' . sprintf($safeint, '(' . sprintf($safeint, '$sb[$l >> 24 & 0xff] + $sb[0x100 + ($l >> 16 & 0xff)]') . ' ^ - $sb[0x200 + ($l >> 8 & 0xff)]) + - $sb[0x300 + ($l & 0xff)]') . '; - - $r^= ' . $p[$i - 1] . '; - $l^= ' . sprintf($safeint, '(' . sprintf($safeint, '$sb[$r >> 24 & 0xff] + $sb[0x100 + ($r >> 16 & 0xff)]') . ' ^ - $sb[0x200 + ($r >> 8 & 0xff)]) + - $sb[0x300 + ($r & 0xff)]') . '; - '; - } - - $decrypt_block .= ' - $in = pack("N*", - $r ^ ' . $p[0] . ', - $l ^ ' . $p[1] . ' - ); - '; - - $this->inline_crypt = $this->createInlineCryptFunction( - [ - 'init_crypt' => $init_crypt, - 'init_encrypt' => '', - 'init_decrypt' => '', - 'encrypt_block' => $encrypt_block, - 'decrypt_block' => $decrypt_block - ] - ); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/ChaCha20.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/ChaCha20.php deleted file mode 100644 index 9531656..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/ChaCha20.php +++ /dev/null @@ -1,799 +0,0 @@ - - * @copyright 2019 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt; - -use OCA\Libresign\Vendor\phpseclib3\Exception\BadDecryptionException; -use OCA\Libresign\Vendor\phpseclib3\Exception\InsufficientSetupException; - -/** - * Pure-PHP implementation of ChaCha20. - * - * @author Jim Wigginton - */ -class ChaCha20 extends Salsa20 -{ - /** - * The OpenSSL specific name of the cipher - * - * @var string - */ - protected $cipher_name_openssl = 'chacha20'; - - /** - * Test for engine validity - * - * This is mainly just a wrapper to set things up for \phpseclib3\Crypt\Common\SymmetricKey::isValidEngine() - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::__construct() - * @param int $engine - * @return bool - */ - protected function isValidEngineHelper($engine) - { - switch ($engine) { - case self::ENGINE_LIBSODIUM: - // PHP 7.2.0 (30 Nov 2017) added support for libsodium - - // we could probably make it so that if $this->counter == 0 then the first block would be done with either OpenSSL - // or PHP and then subsequent blocks would then be done with libsodium but idk - it's not a high priority atm - - // we could also make it so that if $this->counter == 0 and $this->continuousBuffer then do the first string - // with libsodium and subsequent strings with openssl or pure-PHP but again not a high priority - return function_exists('sodium_crypto_aead_chacha20poly1305_ietf_encrypt') && - $this->key_length == 32 && - (($this->usePoly1305 && !isset($this->poly1305Key) && $this->counter == 0) || $this->counter == 1) && - !$this->continuousBuffer; - case self::ENGINE_OPENSSL: - // OpenSSL 1.1.0 (released 25 Aug 2016) added support for chacha20. - // PHP didn't support OpenSSL 1.1.0 until 7.0.19 (11 May 2017) - - // if you attempt to provide openssl with a 128 bit key (as opposed to a 256 bit key) openssl will null - // pad the key to 256 bits and still use the expansion constant for 256-bit keys. the fact that - // openssl treats the IV as both the counter and nonce, however, let's us use openssl in continuous mode - // whereas libsodium does not - if ($this->key_length != 32) { - return false; - } - } - - return parent::isValidEngineHelper($engine); - } - - /** - * Encrypts a message. - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::decrypt() - * @see self::crypt() - * @param string $plaintext - * @return string $ciphertext - */ - public function encrypt($plaintext) - { - $this->setup(); - - if ($this->engine == self::ENGINE_LIBSODIUM) { - return $this->encrypt_with_libsodium($plaintext); - } - - return parent::encrypt($plaintext); - } - - /** - * Decrypts a message. - * - * $this->decrypt($this->encrypt($plaintext)) == $this->encrypt($this->encrypt($plaintext)). - * At least if the continuous buffer is disabled. - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::encrypt() - * @see self::crypt() - * @param string $ciphertext - * @return string $plaintext - */ - public function decrypt($ciphertext) - { - $this->setup(); - - if ($this->engine == self::ENGINE_LIBSODIUM) { - return $this->decrypt_with_libsodium($ciphertext); - } - - return parent::decrypt($ciphertext); - } - - /** - * Encrypts a message with libsodium - * - * @see self::encrypt() - * @param string $plaintext - * @return string $text - */ - private function encrypt_with_libsodium($plaintext) - { - $params = [$plaintext, $this->aad, $this->nonce, $this->key]; - $ciphertext = strlen($this->nonce) == 8 ? - sodium_crypto_aead_chacha20poly1305_encrypt(...$params) : - sodium_crypto_aead_chacha20poly1305_ietf_encrypt(...$params); - if (!$this->usePoly1305) { - return substr($ciphertext, 0, strlen($plaintext)); - } - - $newciphertext = substr($ciphertext, 0, strlen($plaintext)); - - $this->newtag = $this->usingGeneratedPoly1305Key && strlen($this->nonce) == 12 ? - substr($ciphertext, strlen($plaintext)) : - $this->poly1305($newciphertext); - - return $newciphertext; - } - - /** - * Decrypts a message with libsodium - * - * @see self::decrypt() - * @param string $ciphertext - * @return string $text - */ - private function decrypt_with_libsodium($ciphertext) - { - $params = [$ciphertext, $this->aad, $this->nonce, $this->key]; - - if (isset($this->poly1305Key)) { - if ($this->oldtag === false) { - throw new InsufficientSetupException('Authentication Tag has not been set'); - } - if ($this->usingGeneratedPoly1305Key && strlen($this->nonce) == 12) { - $plaintext = sodium_crypto_aead_chacha20poly1305_ietf_decrypt(...$params); - $this->oldtag = false; - if ($plaintext === false) { - throw new BadDecryptionException('Derived authentication tag and supplied authentication tag do not match'); - } - return $plaintext; - } - $newtag = $this->poly1305($ciphertext); - if ($this->oldtag != substr($newtag, 0, strlen($this->oldtag))) { - $this->oldtag = false; - throw new BadDecryptionException('Derived authentication tag and supplied authentication tag do not match'); - } - $this->oldtag = false; - } - - $plaintext = strlen($this->nonce) == 8 ? - sodium_crypto_aead_chacha20poly1305_encrypt(...$params) : - sodium_crypto_aead_chacha20poly1305_ietf_encrypt(...$params); - - return substr($plaintext, 0, strlen($ciphertext)); - } - - /** - * Sets the nonce. - * - * @param string $nonce - */ - public function setNonce($nonce) - { - if (!is_string($nonce)) { - throw new \UnexpectedValueException('The nonce should be a string'); - } - - /* - from https://tools.ietf.org/html/rfc7539#page-7 - - "Note also that the original ChaCha had a 64-bit nonce and 64-bit - block count. We have modified this here to be more consistent with - recommendations in Section 3.2 of [RFC5116]." - */ - switch (strlen($nonce)) { - case 8: // 64 bits - case 12: // 96 bits - break; - default: - throw new \LengthException('Nonce of size ' . strlen($nonce) . ' not supported by this algorithm. Only 64-bit nonces or 96-bit nonces are supported'); - } - - $this->nonce = $nonce; - $this->changed = true; - $this->setEngine(); - } - - /** - * Setup the self::ENGINE_INTERNAL $engine - * - * (re)init, if necessary, the internal cipher $engine - * - * _setup() will be called each time if $changed === true - * typically this happens when using one or more of following public methods: - * - * - setKey() - * - * - setNonce() - * - * - First run of encrypt() / decrypt() with no init-settings - * - * @see self::setKey() - * @see self::setNonce() - * @see self::disableContinuousBuffer() - */ - protected function setup() - { - if (!$this->changed) { - return; - } - - $this->enbuffer = $this->debuffer = ['ciphertext' => '', 'counter' => $this->counter]; - - $this->changed = $this->nonIVChanged = false; - - if ($this->nonce === false) { - throw new InsufficientSetupException('No nonce has been defined'); - } - - if ($this->key === false) { - throw new InsufficientSetupException('No key has been defined'); - } - - if ($this->usePoly1305 && !isset($this->poly1305Key)) { - $this->usingGeneratedPoly1305Key = true; - if ($this->engine == self::ENGINE_LIBSODIUM) { - return; - } - $this->createPoly1305Key(); - } - - $key = $this->key; - if (strlen($key) == 16) { - $constant = 'expand 16-byte k'; - $key .= $key; - } else { - $constant = 'expand 32-byte k'; - } - - $this->p1 = $constant . $key; - $this->p2 = $this->nonce; - if (strlen($this->nonce) == 8) { - $this->p2 = "\0\0\0\0" . $this->p2; - } - } - - /** - * The quarterround function - * - * @param int $a - * @param int $b - * @param int $c - * @param int $d - */ - protected static function quarterRound(&$a, &$b, &$c, &$d) - { - // in https://datatracker.ietf.org/doc/html/rfc7539#section-2.1 the addition, - // xor'ing and rotation are all on the same line so i'm keeping it on the same - // line here as well - // @codingStandardsIgnoreStart - $a+= $b; $d = self::leftRotate(intval($d) ^ intval($a), 16); - $c+= $d; $b = self::leftRotate(intval($b) ^ intval($c), 12); - $a+= $b; $d = self::leftRotate(intval($d) ^ intval($a), 8); - $c+= $d; $b = self::leftRotate(intval($b) ^ intval($c), 7); - // @codingStandardsIgnoreEnd - } - - /** - * The doubleround function - * - * @param int $x0 (by reference) - * @param int $x1 (by reference) - * @param int $x2 (by reference) - * @param int $x3 (by reference) - * @param int $x4 (by reference) - * @param int $x5 (by reference) - * @param int $x6 (by reference) - * @param int $x7 (by reference) - * @param int $x8 (by reference) - * @param int $x9 (by reference) - * @param int $x10 (by reference) - * @param int $x11 (by reference) - * @param int $x12 (by reference) - * @param int $x13 (by reference) - * @param int $x14 (by reference) - * @param int $x15 (by reference) - */ - protected static function doubleRound(&$x0, &$x1, &$x2, &$x3, &$x4, &$x5, &$x6, &$x7, &$x8, &$x9, &$x10, &$x11, &$x12, &$x13, &$x14, &$x15) - { - // columnRound - static::quarterRound($x0, $x4, $x8, $x12); - static::quarterRound($x1, $x5, $x9, $x13); - static::quarterRound($x2, $x6, $x10, $x14); - static::quarterRound($x3, $x7, $x11, $x15); - // rowRound - static::quarterRound($x0, $x5, $x10, $x15); - static::quarterRound($x1, $x6, $x11, $x12); - static::quarterRound($x2, $x7, $x8, $x13); - static::quarterRound($x3, $x4, $x9, $x14); - } - - /** - * The Salsa20 hash function function - * - * On my laptop this loop unrolled / function dereferenced version of parent::salsa20 encrypts 1mb of text in - * 0.65s vs the 0.85s that it takes with the parent method. - * - * If we were free to assume that the host OS would always be 64-bits then the if condition in leftRotate could - * be eliminated and we could knock this done to 0.60s. - * - * For comparison purposes, RC4 takes 0.16s and AES in CTR mode with the Eval engine takes 0.48s. - * AES in CTR mode with the PHP engine takes 1.19s. Salsa20 / ChaCha20 do not benefit as much from the Eval - * approach due to the fact that there are a lot less variables to de-reference, fewer loops to unroll, etc - * - * @param string $x - */ - protected static function salsa20($x) - { - list(, $x0, $x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8, $x9, $x10, $x11, $x12, $x13, $x14, $x15) = unpack('V*', $x); - $z0 = $x0; - $z1 = $x1; - $z2 = $x2; - $z3 = $x3; - $z4 = $x4; - $z5 = $x5; - $z6 = $x6; - $z7 = $x7; - $z8 = $x8; - $z9 = $x9; - $z10 = $x10; - $z11 = $x11; - $z12 = $x12; - $z13 = $x13; - $z14 = $x14; - $z15 = $x15; - - // @codingStandardsIgnoreStart - // columnRound - $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 16); - $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 12); - $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 8); - $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 7); - - $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 16); - $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 12); - $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 8); - $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 7); - - $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 16); - $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 12); - $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 8); - $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 7); - - $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 16); - $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 12); - $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 8); - $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 7); - - // rowRound - $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 16); - $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 12); - $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 8); - $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 7); - - $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 16); - $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 12); - $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 8); - $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 7); - - $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 16); - $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 12); - $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 8); - $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 7); - - $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 16); - $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 12); - $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 8); - $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 7); - - // columnRound - $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 16); - $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 12); - $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 8); - $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 7); - - $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 16); - $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 12); - $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 8); - $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 7); - - $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 16); - $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 12); - $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 8); - $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 7); - - $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 16); - $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 12); - $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 8); - $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 7); - - // rowRound - $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 16); - $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 12); - $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 8); - $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 7); - - $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 16); - $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 12); - $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 8); - $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 7); - - $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 16); - $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 12); - $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 8); - $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 7); - - $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 16); - $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 12); - $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 8); - $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 7); - - // columnRound - $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 16); - $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 12); - $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 8); - $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 7); - - $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 16); - $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 12); - $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 8); - $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 7); - - $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 16); - $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 12); - $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 8); - $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 7); - - $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 16); - $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 12); - $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 8); - $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 7); - - // rowRound - $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 16); - $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 12); - $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 8); - $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 7); - - $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 16); - $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 12); - $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 8); - $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 7); - - $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 16); - $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 12); - $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 8); - $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 7); - - $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 16); - $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 12); - $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 8); - $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 7); - - // columnRound - $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 16); - $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 12); - $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 8); - $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 7); - - $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 16); - $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 12); - $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 8); - $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 7); - - $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 16); - $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 12); - $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 8); - $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 7); - - $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 16); - $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 12); - $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 8); - $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 7); - - // rowRound - $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 16); - $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 12); - $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 8); - $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 7); - - $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 16); - $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 12); - $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 8); - $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 7); - - $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 16); - $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 12); - $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 8); - $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 7); - - $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 16); - $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 12); - $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 8); - $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 7); - - // columnRound - $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 16); - $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 12); - $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 8); - $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 7); - - $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 16); - $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 12); - $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 8); - $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 7); - - $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 16); - $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 12); - $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 8); - $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 7); - - $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 16); - $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 12); - $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 8); - $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 7); - - // rowRound - $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 16); - $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 12); - $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 8); - $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 7); - - $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 16); - $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 12); - $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 8); - $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 7); - - $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 16); - $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 12); - $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 8); - $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 7); - - $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 16); - $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 12); - $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 8); - $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 7); - - // columnRound - $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 16); - $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 12); - $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 8); - $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 7); - - $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 16); - $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 12); - $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 8); - $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 7); - - $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 16); - $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 12); - $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 8); - $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 7); - - $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 16); - $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 12); - $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 8); - $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 7); - - // rowRound - $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 16); - $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 12); - $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 8); - $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 7); - - $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 16); - $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 12); - $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 8); - $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 7); - - $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 16); - $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 12); - $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 8); - $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 7); - - $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 16); - $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 12); - $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 8); - $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 7); - - // columnRound - $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 16); - $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 12); - $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 8); - $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 7); - - $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 16); - $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 12); - $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 8); - $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 7); - - $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 16); - $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 12); - $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 8); - $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 7); - - $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 16); - $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 12); - $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 8); - $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 7); - - // rowRound - $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 16); - $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 12); - $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 8); - $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 7); - - $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 16); - $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 12); - $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 8); - $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 7); - - $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 16); - $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 12); - $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 8); - $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 7); - - $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 16); - $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 12); - $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 8); - $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 7); - - // columnRound - $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 16); - $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 12); - $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 8); - $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 7); - - $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 16); - $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 12); - $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 8); - $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 7); - - $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 16); - $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 12); - $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 8); - $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 7); - - $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 16); - $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 12); - $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 8); - $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 7); - - // rowRound - $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 16); - $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 12); - $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 8); - $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 7); - - $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 16); - $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 12); - $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 8); - $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 7); - - $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 16); - $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 12); - $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 8); - $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 7); - - $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 16); - $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 12); - $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 8); - $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 7); - - // columnRound - $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 16); - $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 12); - $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 8); - $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 7); - - $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 16); - $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 12); - $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 8); - $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 7); - - $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 16); - $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 12); - $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 8); - $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 7); - - $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 16); - $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 12); - $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 8); - $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 7); - - // rowRound - $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 16); - $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 12); - $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 8); - $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 7); - - $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 16); - $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 12); - $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 8); - $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 7); - - $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 16); - $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 12); - $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 8); - $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 7); - - $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 16); - $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 12); - $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 8); - $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 7); - - // columnRound - $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 16); - $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 12); - $x0+= $x4; $x12 = self::leftRotate(intval($x12) ^ intval($x0), 8); - $x8+= $x12; $x4 = self::leftRotate(intval($x4) ^ intval($x8), 7); - - $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 16); - $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 12); - $x1+= $x5; $x13 = self::leftRotate(intval($x13) ^ intval($x1), 8); - $x9+= $x13; $x5 = self::leftRotate(intval($x5) ^ intval($x9), 7); - - $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 16); - $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 12); - $x2+= $x6; $x14 = self::leftRotate(intval($x14) ^ intval($x2), 8); - $x10+= $x14; $x6 = self::leftRotate(intval($x6) ^ intval($x10), 7); - - $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 16); - $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 12); - $x3+= $x7; $x15 = self::leftRotate(intval($x15) ^ intval($x3), 8); - $x11+= $x15; $x7 = self::leftRotate(intval($x7) ^ intval($x11), 7); - - // rowRound - $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 16); - $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 12); - $x0+= $x5; $x15 = self::leftRotate(intval($x15) ^ intval($x0), 8); - $x10+= $x15; $x5 = self::leftRotate(intval($x5) ^ intval($x10), 7); - - $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 16); - $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 12); - $x1+= $x6; $x12 = self::leftRotate(intval($x12) ^ intval($x1), 8); - $x11+= $x12; $x6 = self::leftRotate(intval($x6) ^ intval($x11), 7); - - $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 16); - $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 12); - $x2+= $x7; $x13 = self::leftRotate(intval($x13) ^ intval($x2), 8); - $x8+= $x13; $x7 = self::leftRotate(intval($x7) ^ intval($x8), 7); - - $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 16); - $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 12); - $x3+= $x4; $x14 = self::leftRotate(intval($x14) ^ intval($x3), 8); - $x9+= $x14; $x4 = self::leftRotate(intval($x4) ^ intval($x9), 7); - // @codingStandardsIgnoreEnd - - $x0 += $z0; - $x1 += $z1; - $x2 += $z2; - $x3 += $z3; - $x4 += $z4; - $x5 += $z5; - $x6 += $z6; - $x7 += $z7; - $x8 += $z8; - $x9 += $z9; - $x10 += $z10; - $x11 += $z11; - $x12 += $z12; - $x13 += $z13; - $x14 += $z14; - $x15 += $z15; - - return pack('V*', $x0, $x1, $x2, $x3, $x4, $x5, $x6, $x7, $x8, $x9, $x10, $x11, $x12, $x13, $x14, $x15); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/AsymmetricKey.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/AsymmetricKey.php deleted file mode 100644 index 359b4f6..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/AsymmetricKey.php +++ /dev/null @@ -1,581 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\Common; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\DSA; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Hash; -use OCA\Libresign\Vendor\phpseclib3\Crypt\RSA; -use OCA\Libresign\Vendor\phpseclib3\Exception\NoKeyLoadedException; -use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedFormatException; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * Base Class for all asymmetric cipher classes - * - * @author Jim Wigginton - */ -abstract class AsymmetricKey -{ - /** - * Precomputed Zero - * - * @var BigInteger - */ - protected static $zero; - - /** - * Precomputed One - * - * @var BigInteger - */ - protected static $one; - - /** - * Format of the loaded key - * - * @var string - */ - protected $format; - - /** - * Hash function - * - * @var Hash - */ - protected $hash; - - /** - * HMAC function - * - * @var Hash - */ - private $hmac; - - /** - * Supported plugins (lower case) - * - * @see self::initialize_static_variables() - * @var array - */ - private static $plugins = []; - - /** - * Invisible plugins - * - * @see self::initialize_static_variables() - * @var array - */ - private static $invisiblePlugins = []; - - /** - * Available Engines - * - * @var boolean[] - */ - protected static $engines = []; - - /** - * Key Comment - * - * @var null|string - */ - private $comment; - - /** - * @param string $type - * @return array|string - */ - abstract public function toString($type, array $options = []); - - /** - * The constructor - */ - protected function __construct() - { - self::initialize_static_variables(); - - $this->hash = new Hash('sha256'); - $this->hmac = new Hash('sha256'); - } - - /** - * Initialize static variables - */ - protected static function initialize_static_variables() - { - if (!isset(self::$zero)) { - self::$zero = new BigInteger(0); - self::$one = new BigInteger(1); - } - - self::loadPlugins('Keys'); - if (static::ALGORITHM != 'RSA' && static::ALGORITHM != 'DH') { - self::loadPlugins('Signature'); - } - } - - /** - * Load the key - * - * @param string $key - * @param string $password optional - * @return PublicKey|PrivateKey - */ - public static function load($key, $password = false) - { - self::initialize_static_variables(); - - $class = new \ReflectionClass(static::class); - if ($class->isFinal()) { - throw new \RuntimeException('load() should not be called from final classes (' . static::class . ')'); - } - - $components = false; - foreach (self::$plugins[static::ALGORITHM]['Keys'] as $format) { - if (isset(self::$invisiblePlugins[static::ALGORITHM]) && in_array($format, self::$invisiblePlugins[static::ALGORITHM])) { - continue; - } - try { - $components = $format::load($key, $password); - } catch (\Exception $e) { - $components = false; - } - if ($components !== false) { - break; - } - } - - if ($components === false) { - throw new NoKeyLoadedException('Unable to read key'); - } - - $components['format'] = $format; - $components['secret'] = isset($components['secret']) ? $components['secret'] : ''; - $comment = isset($components['comment']) ? $components['comment'] : null; - $new = static::onLoad($components); - $new->format = $format; - $new->comment = $comment; - return $new instanceof PrivateKey ? - $new->withPassword($password) : - $new; - } - - /** - * Loads a private key - * - * @return PrivateKey - * @param string|array $key - * @param string $password optional - */ - public static function loadPrivateKey($key, $password = '') - { - $key = self::load($key, $password); - if (!$key instanceof PrivateKey) { - throw new NoKeyLoadedException('The key that was loaded was not a private key'); - } - return $key; - } - - /** - * Loads a public key - * - * @return PublicKey - * @param string|array $key - */ - public static function loadPublicKey($key) - { - $key = self::load($key); - if (!$key instanceof PublicKey) { - throw new NoKeyLoadedException('The key that was loaded was not a public key'); - } - return $key; - } - - /** - * Loads parameters - * - * @return AsymmetricKey - * @param string|array $key - */ - public static function loadParameters($key) - { - $key = self::load($key); - if (!$key instanceof PrivateKey && !$key instanceof PublicKey) { - throw new NoKeyLoadedException('The key that was loaded was not a parameter'); - } - return $key; - } - - /** - * Load the key, assuming a specific format - * - * @param string $type - * @param string $key - * @param string $password optional - * @return static - */ - public static function loadFormat($type, $key, $password = false) - { - self::initialize_static_variables(); - - $components = false; - $format = strtolower($type); - if (isset(self::$plugins[static::ALGORITHM]['Keys'][$format])) { - $format = self::$plugins[static::ALGORITHM]['Keys'][$format]; - $components = $format::load($key, $password); - } - - if ($components === false) { - throw new NoKeyLoadedException('Unable to read key'); - } - - $components['format'] = $format; - $components['secret'] = isset($components['secret']) ? $components['secret'] : ''; - - $new = static::onLoad($components); - $new->format = $format; - return $new instanceof PrivateKey ? - $new->withPassword($password) : - $new; - } - - /** - * Loads a private key - * - * @return PrivateKey - * @param string $type - * @param string $key - * @param string $password optional - */ - public static function loadPrivateKeyFormat($type, $key, $password = false) - { - $key = self::loadFormat($type, $key, $password); - if (!$key instanceof PrivateKey) { - throw new NoKeyLoadedException('The key that was loaded was not a private key'); - } - return $key; - } - - /** - * Loads a public key - * - * @return PublicKey - * @param string $type - * @param string $key - */ - public static function loadPublicKeyFormat($type, $key) - { - $key = self::loadFormat($type, $key); - if (!$key instanceof PublicKey) { - throw new NoKeyLoadedException('The key that was loaded was not a public key'); - } - return $key; - } - - /** - * Loads parameters - * - * @return AsymmetricKey - * @param string $type - * @param string|array $key - */ - public static function loadParametersFormat($type, $key) - { - $key = self::loadFormat($type, $key); - if (!$key instanceof PrivateKey && !$key instanceof PublicKey) { - throw new NoKeyLoadedException('The key that was loaded was not a parameter'); - } - return $key; - } - - /** - * Validate Plugin - * - * @param string $format - * @param string $type - * @param string $method optional - * @return mixed - */ - protected static function validatePlugin($format, $type, $method = null) - { - $type = strtolower($type); - if (!isset(self::$plugins[static::ALGORITHM][$format][$type])) { - throw new UnsupportedFormatException("$type is not a supported format"); - } - $type = self::$plugins[static::ALGORITHM][$format][$type]; - if (isset($method) && !method_exists($type, $method)) { - throw new UnsupportedFormatException("$type does not implement $method"); - } - - return $type; - } - - /** - * Load Plugins - * - * @param string $format - */ - private static function loadPlugins($format) - { - if (!isset(self::$plugins[static::ALGORITHM][$format])) { - self::$plugins[static::ALGORITHM][$format] = []; - foreach (new \DirectoryIterator(__DIR__ . '/../' . static::ALGORITHM . '/Formats/' . $format . '/') as $file) { - if ($file->getExtension() != 'php') { - continue; - } - $name = $file->getBasename('.php'); - if ($name[0] == '.') { - continue; - } - $type = '\OCA\Libresign\Vendor\phpseclib3\Crypt\\' . static::ALGORITHM . '\\Formats\\' . $format . '\\' . $name; - $reflect = new \ReflectionClass($type); - if ($reflect->isTrait()) { - continue; - } - self::$plugins[static::ALGORITHM][$format][strtolower($name)] = $type; - if ($reflect->hasConstant('IS_INVISIBLE')) { - self::$invisiblePlugins[static::ALGORITHM][] = $type; - } - } - } - } - - /** - * Returns a list of supported formats. - * - * @return array - */ - public static function getSupportedKeyFormats() - { - self::initialize_static_variables(); - - return self::$plugins[static::ALGORITHM]['Keys']; - } - - /** - * Add a fileformat plugin - * - * The plugin needs to either already be loaded or be auto-loadable. - * Loading a plugin whose shortname overwrite an existing shortname will overwrite the old plugin. - * - * @see self::load() - * @param string $fullname - * @return bool - */ - public static function addFileFormat($fullname) - { - self::initialize_static_variables(); - - if (class_exists($fullname)) { - $meta = new \ReflectionClass($fullname); - $shortname = $meta->getShortName(); - self::$plugins[static::ALGORITHM]['Keys'][strtolower($shortname)] = $fullname; - if ($meta->hasConstant('IS_INVISIBLE')) { - self::$invisiblePlugins[static::ALGORITHM][] = strtolower($shortname); - } - } - } - - /** - * Returns the format of the loaded key. - * - * If the key that was loaded wasn't in a valid or if the key was auto-generated - * with RSA::createKey() then this will throw an exception. - * - * @see self::load() - * @return mixed - */ - public function getLoadedFormat() - { - if (empty($this->format)) { - throw new NoKeyLoadedException('This key was created with createKey - it was not loaded with load. Therefore there is no "loaded format"'); - } - - $meta = new \ReflectionClass($this->format); - return $meta->getShortName(); - } - - /** - * Returns the key's comment - * - * Not all key formats support comments. If you want to set a comment use toString() - * - * @return null|string - */ - public function getComment() - { - return $this->comment; - } - - /** - * Tests engine validity - * - */ - public static function useBestEngine() - { - static::$engines = [ - 'PHP' => true, - 'OpenSSL' => extension_loaded('openssl'), - // this test can be satisfied by either of the following: - // http://php.net/manual/en/book.sodium.php - // https://github.com/paragonie/sodium_compat - 'libsodium' => function_exists('sodium_crypto_sign_keypair') - ]; - - return static::$engines; - } - - /** - * Flag to use internal engine only (useful for unit testing) - * - */ - public static function useInternalEngine() - { - static::$engines = [ - 'PHP' => true, - 'OpenSSL' => false, - 'libsodium' => false - ]; - } - - /** - * __toString() magic method - * - * @return string - */ - public function __toString() - { - return $this->toString('PKCS8'); - } - - /** - * Determines which hashing function should be used - * - * @param string $hash - */ - public function withHash($hash) - { - $new = clone $this; - - $new->hash = new Hash($hash); - $new->hmac = new Hash($hash); - - return $new; - } - - /** - * Returns the hash algorithm currently being used - * - */ - public function getHash() - { - return clone $this->hash; - } - - /** - * Compute the pseudorandom k for signature generation, - * using the process specified for deterministic DSA. - * - * @param string $h1 - * @return string - */ - protected function computek($h1) - { - $v = str_repeat("\1", strlen($h1)); - - $k = str_repeat("\0", strlen($h1)); - - $x = $this->int2octets($this->x); - $h1 = $this->bits2octets($h1); - - $this->hmac->setKey($k); - $k = $this->hmac->hash($v . "\0" . $x . $h1); - $this->hmac->setKey($k); - $v = $this->hmac->hash($v); - $k = $this->hmac->hash($v . "\1" . $x . $h1); - $this->hmac->setKey($k); - $v = $this->hmac->hash($v); - - $qlen = $this->q->getLengthInBytes(); - - while (true) { - $t = ''; - while (strlen($t) < $qlen) { - $v = $this->hmac->hash($v); - $t = $t . $v; - } - $k = $this->bits2int($t); - - if (!$k->equals(self::$zero) && $k->compare($this->q) < 0) { - break; - } - $k = $this->hmac->hash($v . "\0"); - $this->hmac->setKey($k); - $v = $this->hmac->hash($v); - } - - return $k; - } - - /** - * Integer to Octet String - * - * @param BigInteger $v - * @return string - */ - private function int2octets($v) - { - $out = $v->toBytes(); - $rolen = $this->q->getLengthInBytes(); - if (strlen($out) < $rolen) { - return str_pad($out, $rolen, "\0", STR_PAD_LEFT); - } elseif (strlen($out) > $rolen) { - return substr($out, -$rolen); - } else { - return $out; - } - } - - /** - * Bit String to Integer - * - * @param string $in - * @return BigInteger - */ - protected function bits2int($in) - { - $v = new BigInteger($in, 256); - $vlen = strlen($in) << 3; - $qlen = $this->q->getLength(); - if ($vlen > $qlen) { - return $v->bitwise_rightShift($vlen - $qlen); - } - return $v; - } - - /** - * Bit String to Octet String - * - * @param string $in - * @return string - */ - private function bits2octets($in) - { - $z1 = $this->bits2int($in); - $z2 = $z1->subtract($this->q); - return $z2->compare(self::$zero) < 0 ? - $this->int2octets($z1) : - $this->int2octets($z2); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/BlockCipher.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/BlockCipher.php deleted file mode 100644 index 100cac7..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/BlockCipher.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @author Hans-Juergen Petrich - * @copyright 2007 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\Common; - -/** - * Base Class for all block cipher classes - * - * @author Jim Wigginton - */ -abstract class BlockCipher extends SymmetricKey -{ -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/JWK.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/JWK.php deleted file mode 100644 index 0273fe9..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/JWK.php +++ /dev/null @@ -1,77 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Keys; - -use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; - -/** - * JSON Web Key Formatted Key Handler - * - * @author Jim Wigginton - */ -abstract class JWK -{ - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password - * @return array - */ - public static function load($key, $password = '') - { - if (!Strings::is_stringable($key)) { - throw new \UnexpectedValueException('Key should be a string - not a ' . gettype($key)); - } - - $key = preg_replace('#\s#', '', $key); // remove whitespace - - if (PHP_VERSION_ID >= 73000) { - $key = json_decode($key, null, 512, JSON_THROW_ON_ERROR); - } else { - $key = json_decode($key); - if (!$key) { - throw new \RuntimeException('Unable to decode JSON'); - } - } - - if (isset($key->kty)) { - return $key; - } - - if (!is_object($key)) { - throw new \RuntimeException('invalid JWK: not an object'); - } - - if (!isset($key->keys)) { - throw new \RuntimeException('invalid JWK: object has no property "keys"'); - } - - if (count($key->keys) != 1) { - throw new \RuntimeException('Although the JWK key format supports multiple keys phpseclib does not'); - } - - return $key->keys[0]; - } - - /** - * Wrap a key appropriately - * - * @return string - */ - protected static function wrapKey(array $key, array $options) - { - return json_encode(['keys' => [$key + $options]]); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/OpenSSH.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/OpenSSH.php deleted file mode 100644 index ddf20a9..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/OpenSSH.php +++ /dev/null @@ -1,224 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Keys; - -use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; -use OCA\Libresign\Vendor\phpseclib3\Crypt\AES; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Random; -use OCA\Libresign\Vendor\phpseclib3\Exception\BadDecryptionException; - -/** - * OpenSSH Formatted RSA Key Handler - * - * @author Jim Wigginton - */ -abstract class OpenSSH -{ - /** - * Default comment - * - * @var string - */ - protected static $comment = 'phpseclib-generated-key'; - - /** - * Binary key flag - * - * @var bool - */ - protected static $binary = false; - - /** - * Sets the default comment - * - * @param string $comment - */ - public static function setComment($comment) - { - self::$comment = str_replace(["\r", "\n"], '', $comment); - } - - /** - * Break a public or private key down into its constituent components - * - * $type can be either ssh-dss or ssh-rsa - * - * @param string $key - * @param string $password - * @return array - */ - public static function load($key, $password = '') - { - if (!Strings::is_stringable($key)) { - throw new \UnexpectedValueException('Key should be a string - not a ' . gettype($key)); - } - - // key format is described here: - // https://cvsweb.openbsd.org/cgi-bin/cvsweb/src/usr.bin/ssh/PROTOCOL.key?annotate=HEAD - - if (strpos($key, 'BEGIN OPENSSH PRIVATE KEY') !== false) { - $key = preg_replace('#(?:^-.*?-[\r\n]*$)|\s#ms', '', $key); - $key = Strings::base64_decode($key); - $magic = Strings::shift($key, 15); - if ($magic != "openssh-key-v1\0") { - throw new \RuntimeException('Expected openssh-key-v1'); - } - list($ciphername, $kdfname, $kdfoptions, $numKeys) = Strings::unpackSSH2('sssN', $key); - if ($numKeys != 1) { - // if we wanted to support multiple keys we could update PublicKeyLoader to preview what the # of keys - // would be; it'd then call Common\Keys\OpenSSH.php::load() and get the paddedKey. it'd then pass - // that to the appropriate key loading parser $numKey times or something - throw new \RuntimeException('Although the OpenSSH private key format supports multiple keys phpseclib does not'); - } - switch ($ciphername) { - case 'none': - break; - case 'aes256-ctr': - if ($kdfname != 'bcrypt') { - throw new \RuntimeException('Only the bcrypt kdf is supported (' . $kdfname . ' encountered)'); - } - list($salt, $rounds) = Strings::unpackSSH2('sN', $kdfoptions); - $crypto = new AES('ctr'); - //$crypto->setKeyLength(256); - //$crypto->disablePadding(); - $crypto->setPassword($password, 'bcrypt', $salt, $rounds, 32); - break; - default: - throw new \RuntimeException('The only supported ciphers are: none, aes256-ctr (' . $ciphername . ' is being used)'); - } - - list($publicKey, $paddedKey) = Strings::unpackSSH2('ss', $key); - list($type) = Strings::unpackSSH2('s', $publicKey); - if (isset($crypto)) { - $paddedKey = $crypto->decrypt($paddedKey); - } - list($checkint1, $checkint2) = Strings::unpackSSH2('NN', $paddedKey); - // any leftover bytes in $paddedKey are for padding? but they should be sequential bytes. eg. 1, 2, 3, etc. - if ($checkint1 != $checkint2) { - if (isset($crypto)) { - throw new BadDecryptionException('Unable to decrypt key - please verify the password you are using'); - } - throw new \RuntimeException("The two checkints do not match ($checkint1 vs. $checkint2)"); - } - self::checkType($type); - - return compact('type', 'publicKey', 'paddedKey'); - } - - $parts = explode(' ', $key, 3); - - if (!isset($parts[1])) { - $key = base64_decode($parts[0]); - $comment = false; - } else { - $asciiType = $parts[0]; - self::checkType($parts[0]); - $key = base64_decode($parts[1]); - $comment = isset($parts[2]) ? $parts[2] : false; - } - if ($key === false) { - throw new \UnexpectedValueException('Key should be a string - not a ' . gettype($key)); - } - - list($type) = Strings::unpackSSH2('s', $key); - self::checkType($type); - if (isset($asciiType) && $asciiType != $type) { - throw new \RuntimeException('Two different types of keys are claimed: ' . $asciiType . ' and ' . $type); - } - if (strlen($key) <= 4) { - throw new \UnexpectedValueException('Key appears to be malformed'); - } - - $publicKey = $key; - - return compact('type', 'publicKey', 'comment'); - } - - /** - * Toggle between binary and printable keys - * - * Printable keys are what are generated by default. These are the ones that go in - * $HOME/.ssh/authorized_key. - * - * @param bool $enabled - */ - public static function setBinaryOutput($enabled) - { - self::$binary = $enabled; - } - - /** - * Checks to see if the type is valid - * - * @param string $candidate - */ - private static function checkType($candidate) - { - if (!in_array($candidate, static::$types)) { - throw new \RuntimeException("The key type ($candidate) is not equal to: " . implode(',', static::$types)); - } - } - - /** - * Wrap a private key appropriately - * - * @param string $publicKey - * @param string $privateKey - * @param string $password - * @param array $options - * @return string - */ - protected static function wrapPrivateKey($publicKey, $privateKey, $password, $options) - { - list(, $checkint) = unpack('N', Random::string(4)); - - $comment = isset($options['comment']) ? $options['comment'] : self::$comment; - $paddedKey = Strings::packSSH2('NN', $checkint, $checkint) . - $privateKey . - Strings::packSSH2('s', $comment); - - $usesEncryption = !empty($password) && is_string($password); - - /* - from http://tools.ietf.org/html/rfc4253#section-6 : - - Note that the length of the concatenation of 'packet_length', - 'padding_length', 'payload', and 'random padding' MUST be a multiple - of the cipher block size or 8, whichever is larger. - */ - $blockSize = $usesEncryption ? 16 : 8; - $paddingLength = (($blockSize - 1) * strlen($paddedKey)) % $blockSize; - for ($i = 1; $i <= $paddingLength; $i++) { - $paddedKey .= chr($i); - } - if (!$usesEncryption) { - $key = Strings::packSSH2('sssNss', 'none', 'none', '', 1, $publicKey, $paddedKey); - } else { - $rounds = isset($options['rounds']) ? $options['rounds'] : 16; - $salt = Random::string(16); - $kdfoptions = Strings::packSSH2('sN', $salt, $rounds); - $crypto = new AES('ctr'); - $crypto->setPassword($password, 'bcrypt', $salt, $rounds, 32); - $paddedKey = $crypto->encrypt($paddedKey); - $key = Strings::packSSH2('sssNss', 'aes256-ctr', 'bcrypt', $kdfoptions, 1, $publicKey, $paddedKey); - } - $key = "openssh-key-v1\0$key"; - - return "-----BEGIN OPENSSH PRIVATE KEY-----\n" . - chunk_split(Strings::base64_encode($key), 70, "\n") . - "-----END OPENSSH PRIVATE KEY-----\n"; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS.php deleted file mode 100644 index d142fad..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS.php +++ /dev/null @@ -1,72 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Keys; - -/** - * PKCS1 Formatted Key Handler - * - * @author Jim Wigginton - */ -abstract class PKCS -{ - /** - * Auto-detect the format - */ - const MODE_ANY = 0; - /** - * Require base64-encoded PEM's be supplied - */ - const MODE_PEM = 1; - /** - * Require raw DER's be supplied - */ - const MODE_DER = 2; - /**#@-*/ - - /** - * Is the key a base-64 encoded PEM, DER or should it be auto-detected? - * - * @var int - */ - protected static $format = self::MODE_ANY; - - /** - * Require base64-encoded PEM's be supplied - * - */ - public static function requirePEM() - { - self::$format = self::MODE_PEM; - } - - /** - * Require raw DER's be supplied - * - */ - public static function requireDER() - { - self::$format = self::MODE_DER; - } - - /** - * Accept any format and auto detect the format - * - * This is the default setting - * - */ - public static function requireAny() - { - self::$format = self::MODE_ANY; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS1.php deleted file mode 100644 index 88a0b2a..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS1.php +++ /dev/null @@ -1,209 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Keys; - -use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; -use OCA\Libresign\Vendor\phpseclib3\Crypt\AES; -use OCA\Libresign\Vendor\phpseclib3\Crypt\DES; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Random; -use OCA\Libresign\Vendor\phpseclib3\Crypt\TripleDES; -use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedAlgorithmException; -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * PKCS1 Formatted Key Handler - * - * @author Jim Wigginton - */ -abstract class PKCS1 extends PKCS -{ - /** - * Default encryption algorithm - * - * @var string - */ - private static $defaultEncryptionAlgorithm = 'AES-128-CBC'; - - /** - * Sets the default encryption algorithm - * - * @param string $algo - */ - public static function setEncryptionAlgorithm($algo) - { - self::$defaultEncryptionAlgorithm = $algo; - } - - /** - * Returns the mode constant corresponding to the mode string - * - * @param string $mode - * @return int - * @throws \UnexpectedValueException if the block cipher mode is unsupported - */ - private static function getEncryptionMode($mode) - { - switch ($mode) { - case 'CBC': - case 'ECB': - case 'CFB': - case 'OFB': - case 'CTR': - return $mode; - } - throw new \UnexpectedValueException('Unsupported block cipher mode of operation'); - } - - /** - * Returns a cipher object corresponding to a string - * - * @param string $algo - * @return string - * @throws \UnexpectedValueException if the encryption algorithm is unsupported - */ - private static function getEncryptionObject($algo) - { - $modes = '(CBC|ECB|CFB|OFB|CTR)'; - switch (true) { - case preg_match("#^AES-(128|192|256)-$modes$#", $algo, $matches): - $cipher = new AES(self::getEncryptionMode($matches[2])); - $cipher->setKeyLength($matches[1]); - return $cipher; - case preg_match("#^DES-EDE3-$modes$#", $algo, $matches): - return new TripleDES(self::getEncryptionMode($matches[1])); - case preg_match("#^DES-$modes$#", $algo, $matches): - return new DES(self::getEncryptionMode($matches[1])); - default: - throw new UnsupportedAlgorithmException($algo . ' is not a supported algorithm'); - } - } - - /** - * Generate a symmetric key for PKCS#1 keys - * - * @param string $password - * @param string $iv - * @param int $length - * @return string - */ - private static function generateSymmetricKey($password, $iv, $length) - { - $symkey = ''; - $iv = substr($iv, 0, 8); - while (strlen($symkey) < $length) { - $symkey .= md5($symkey . $password . $iv, true); - } - return substr($symkey, 0, $length); - } - - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - protected static function load($key, $password) - { - if (!Strings::is_stringable($key)) { - throw new \UnexpectedValueException('Key should be a string - not a ' . gettype($key)); - } - - /* Although PKCS#1 proposes a format that public and private keys can use, encrypting them is - "outside the scope" of PKCS#1. PKCS#1 then refers you to PKCS#12 and PKCS#15 if you're wanting to - protect private keys, however, that's not what OpenSSL* does. OpenSSL protects private keys by adding - two new "fields" to the key - DEK-Info and Proc-Type. These fields are discussed here: - - http://tools.ietf.org/html/rfc1421#section-4.6.1.1 - http://tools.ietf.org/html/rfc1421#section-4.6.1.3 - - DES-EDE3-CBC as an algorithm, however, is not discussed anywhere, near as I can tell. - DES-CBC and DES-EDE are discussed in RFC1423, however, DES-EDE3-CBC isn't, nor is its key derivation - function. As is, the definitive authority on this encoding scheme isn't the IETF but rather OpenSSL's - own implementation. ie. the implementation *is* the standard and any bugs that may exist in that - implementation are part of the standard, as well. - - * OpenSSL is the de facto standard. It's utilized by OpenSSH and other projects */ - if (preg_match('#DEK-Info: (.+),(.+)#', $key, $matches)) { - $iv = Strings::hex2bin(trim($matches[2])); - // remove the Proc-Type / DEK-Info sections as they're no longer needed - $key = preg_replace('#^(?:Proc-Type|DEK-Info): .*#m', '', $key); - $ciphertext = ASN1::extractBER($key); - if ($ciphertext === false) { - $ciphertext = $key; - } - $crypto = self::getEncryptionObject($matches[1]); - $crypto->setKey(self::generateSymmetricKey($password, $iv, $crypto->getKeyLength() >> 3)); - $crypto->setIV($iv); - $key = $crypto->decrypt($ciphertext); - } else { - if (self::$format != self::MODE_DER) { - $decoded = ASN1::extractBER($key); - if ($decoded !== false) { - $key = $decoded; - } elseif (self::$format == self::MODE_PEM) { - throw new \UnexpectedValueException('Expected base64-encoded PEM format but was unable to decode base64 text'); - } - } - } - - return $key; - } - - /** - * Wrap a private key appropriately - * - * @param string $key - * @param string $type - * @param string $password - * @param array $options optional - * @return string - */ - protected static function wrapPrivateKey($key, $type, $password, array $options = []) - { - if (empty($password) || !is_string($password)) { - return "-----BEGIN $type PRIVATE KEY-----\r\n" . - chunk_split(Strings::base64_encode($key), 64) . - "-----END $type PRIVATE KEY-----"; - } - - $encryptionAlgorithm = isset($options['encryptionAlgorithm']) ? $options['encryptionAlgorithm'] : self::$defaultEncryptionAlgorithm; - - $cipher = self::getEncryptionObject($encryptionAlgorithm); - $iv = Random::string($cipher->getBlockLength() >> 3); - $cipher->setKey(self::generateSymmetricKey($password, $iv, $cipher->getKeyLength() >> 3)); - $cipher->setIV($iv); - $iv = strtoupper(Strings::bin2hex($iv)); - return "-----BEGIN $type PRIVATE KEY-----\r\n" . - "Proc-Type: 4,ENCRYPTED\r\n" . - "DEK-Info: " . $encryptionAlgorithm . ",$iv\r\n" . - "\r\n" . - chunk_split(Strings::base64_encode($cipher->encrypt($key)), 64) . - "-----END $type PRIVATE KEY-----"; - } - - /** - * Wrap a public key appropriately - * - * @param string $key - * @param string $type - * @return string - */ - protected static function wrapPublicKey($key, $type) - { - return "-----BEGIN $type PUBLIC KEY-----\r\n" . - chunk_split(Strings::base64_encode($key), 64) . - "-----END $type PUBLIC KEY-----"; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS8.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS8.php deleted file mode 100644 index dbcd023..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PKCS8.php +++ /dev/null @@ -1,766 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Keys; - -use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; -use OCA\Libresign\Vendor\phpseclib3\Crypt\AES; -use OCA\Libresign\Vendor\phpseclib3\Crypt\DES; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Random; -use OCA\Libresign\Vendor\phpseclib3\Crypt\RC2; -use OCA\Libresign\Vendor\phpseclib3\Crypt\RC4; -use OCA\Libresign\Vendor\phpseclib3\Crypt\TripleDES; -use OCA\Libresign\Vendor\phpseclib3\Exception\InsufficientSetupException; -use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedAlgorithmException; -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; -use OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -/** - * PKCS#8 Formatted Key Handler - * - * @author Jim Wigginton - */ -abstract class PKCS8 extends PKCS -{ - /** - * Default encryption algorithm - * - * @var string - */ - private static $defaultEncryptionAlgorithm = 'id-PBES2'; - - /** - * Default encryption scheme - * - * Only used when defaultEncryptionAlgorithm is id-PBES2 - * - * @var string - */ - private static $defaultEncryptionScheme = 'aes128-CBC-PAD'; - - /** - * Default PRF - * - * Only used when defaultEncryptionAlgorithm is id-PBES2 - * - * @var string - */ - private static $defaultPRF = 'id-hmacWithSHA256'; - - /** - * Default Iteration Count - * - * @var int - */ - private static $defaultIterationCount = 2048; - - /** - * OIDs loaded - * - * @var bool - */ - private static $oidsLoaded = false; - - /** - * Binary key flag - * - * @var bool - */ - private static $binary = false; - - /** - * Sets the default encryption algorithm - * - * @param string $algo - */ - public static function setEncryptionAlgorithm($algo) - { - self::$defaultEncryptionAlgorithm = $algo; - } - - /** - * Sets the default encryption algorithm for PBES2 - * - * @param string $algo - */ - public static function setEncryptionScheme($algo) - { - self::$defaultEncryptionScheme = $algo; - } - - /** - * Sets the iteration count - * - * @param int $count - */ - public static function setIterationCount($count) - { - self::$defaultIterationCount = $count; - } - - /** - * Sets the PRF for PBES2 - * - * @param string $algo - */ - public static function setPRF($algo) - { - self::$defaultPRF = $algo; - } - - /** - * Returns a SymmetricKey object based on a PBES1 $algo - * - * @return \phpseclib3\Crypt\Common\SymmetricKey - * @param string $algo - */ - private static function getPBES1EncryptionObject($algo) - { - $algo = preg_match('#^pbeWith(?:MD2|MD5|SHA1|SHA)And(.*?)-CBC$#', $algo, $matches) ? - $matches[1] : - substr($algo, 13); // strlen('pbeWithSHAAnd') == 13 - - switch ($algo) { - case 'DES': - $cipher = new DES('cbc'); - break; - case 'RC2': - $cipher = new RC2('cbc'); - $cipher->setKeyLength(64); - break; - case '3-KeyTripleDES': - $cipher = new TripleDES('cbc'); - break; - case '2-KeyTripleDES': - $cipher = new TripleDES('cbc'); - $cipher->setKeyLength(128); - break; - case '128BitRC2': - $cipher = new RC2('cbc'); - $cipher->setKeyLength(128); - break; - case '40BitRC2': - $cipher = new RC2('cbc'); - $cipher->setKeyLength(40); - break; - case '128BitRC4': - $cipher = new RC4(); - $cipher->setKeyLength(128); - break; - case '40BitRC4': - $cipher = new RC4(); - $cipher->setKeyLength(40); - break; - default: - throw new UnsupportedAlgorithmException("$algo is not a supported algorithm"); - } - - return $cipher; - } - - /** - * Returns a hash based on a PBES1 $algo - * - * @return string - * @param string $algo - */ - private static function getPBES1Hash($algo) - { - if (preg_match('#^pbeWith(MD2|MD5|SHA1|SHA)And.*?-CBC$#', $algo, $matches)) { - return $matches[1] == 'SHA' ? 'sha1' : $matches[1]; - } - - return 'sha1'; - } - - /** - * Returns a KDF baesd on a PBES1 $algo - * - * @return string - * @param string $algo - */ - private static function getPBES1KDF($algo) - { - switch ($algo) { - case 'pbeWithMD2AndDES-CBC': - case 'pbeWithMD2AndRC2-CBC': - case 'pbeWithMD5AndDES-CBC': - case 'pbeWithMD5AndRC2-CBC': - case 'pbeWithSHA1AndDES-CBC': - case 'pbeWithSHA1AndRC2-CBC': - return 'pbkdf1'; - } - - return 'pkcs12'; - } - - /** - * Returns a SymmetricKey object baesd on a PBES2 $algo - * - * @return SymmetricKey - * @param string $algo - */ - private static function getPBES2EncryptionObject($algo) - { - switch ($algo) { - case 'desCBC': - $cipher = new DES('cbc'); - break; - case 'des-EDE3-CBC': - $cipher = new TripleDES('cbc'); - break; - case 'rc2CBC': - $cipher = new RC2('cbc'); - // in theory this can be changed - $cipher->setKeyLength(128); - break; - case 'rc5-CBC-PAD': - throw new UnsupportedAlgorithmException('rc5-CBC-PAD is not supported for PBES2 PKCS#8 keys'); - case 'aes128-CBC-PAD': - case 'aes192-CBC-PAD': - case 'aes256-CBC-PAD': - $cipher = new AES('cbc'); - $cipher->setKeyLength(substr($algo, 3, 3)); - break; - default: - throw new UnsupportedAlgorithmException("$algo is not supported"); - } - - return $cipher; - } - - /** - * Initialize static variables - * - */ - private static function initialize_static_variables() - { - if (!isset(static::$childOIDsLoaded)) { - throw new InsufficientSetupException('This class should not be called directly'); - } - - if (!static::$childOIDsLoaded) { - ASN1::loadOIDs(is_array(static::OID_NAME) ? - array_combine(static::OID_NAME, static::OID_VALUE) : - [static::OID_NAME => static::OID_VALUE]); - static::$childOIDsLoaded = true; - } - if (!self::$oidsLoaded) { - // from https://tools.ietf.org/html/rfc2898 - ASN1::loadOIDs([ - // PBES1 encryption schemes - 'pbeWithMD2AndDES-CBC' => '1.2.840.113549.1.5.1', - 'pbeWithMD2AndRC2-CBC' => '1.2.840.113549.1.5.4', - 'pbeWithMD5AndDES-CBC' => '1.2.840.113549.1.5.3', - 'pbeWithMD5AndRC2-CBC' => '1.2.840.113549.1.5.6', - 'pbeWithSHA1AndDES-CBC' => '1.2.840.113549.1.5.10', - 'pbeWithSHA1AndRC2-CBC' => '1.2.840.113549.1.5.11', - - // from PKCS#12: - // https://tools.ietf.org/html/rfc7292 - 'pbeWithSHAAnd128BitRC4' => '1.2.840.113549.1.12.1.1', - 'pbeWithSHAAnd40BitRC4' => '1.2.840.113549.1.12.1.2', - 'pbeWithSHAAnd3-KeyTripleDES-CBC' => '1.2.840.113549.1.12.1.3', - 'pbeWithSHAAnd2-KeyTripleDES-CBC' => '1.2.840.113549.1.12.1.4', - 'pbeWithSHAAnd128BitRC2-CBC' => '1.2.840.113549.1.12.1.5', - 'pbeWithSHAAnd40BitRC2-CBC' => '1.2.840.113549.1.12.1.6', - - 'id-PBKDF2' => '1.2.840.113549.1.5.12', - 'id-PBES2' => '1.2.840.113549.1.5.13', - 'id-PBMAC1' => '1.2.840.113549.1.5.14', - - // from PKCS#5 v2.1: - // http://www.rsa.com/rsalabs/pkcs/files/h11302-wp-pkcs5v2-1-password-based-cryptography-standard.pdf - 'id-hmacWithSHA1' => '1.2.840.113549.2.7', - 'id-hmacWithSHA224' => '1.2.840.113549.2.8', - 'id-hmacWithSHA256' => '1.2.840.113549.2.9', - 'id-hmacWithSHA384' => '1.2.840.113549.2.10', - 'id-hmacWithSHA512' => '1.2.840.113549.2.11', - 'id-hmacWithSHA512-224' => '1.2.840.113549.2.12', - 'id-hmacWithSHA512-256' => '1.2.840.113549.2.13', - - 'desCBC' => '1.3.14.3.2.7', - 'des-EDE3-CBC' => '1.2.840.113549.3.7', - 'rc2CBC' => '1.2.840.113549.3.2', - 'rc5-CBC-PAD' => '1.2.840.113549.3.9', - - 'aes128-CBC-PAD' => '2.16.840.1.101.3.4.1.2', - 'aes192-CBC-PAD' => '2.16.840.1.101.3.4.1.22', - 'aes256-CBC-PAD' => '2.16.840.1.101.3.4.1.42' - ]); - self::$oidsLoaded = true; - } - } - - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - protected static function load($key, $password = '') - { - if (!Strings::is_stringable($key)) { - throw new \UnexpectedValueException('Key should be a string - not a ' . gettype($key)); - } - - $isPublic = strpos($key, 'PUBLIC') !== false; - $isPrivate = strpos($key, 'PRIVATE') !== false; - - $decoded = self::preParse($key); - - $meta = []; - - $decrypted = ASN1::asn1map($decoded[0], Maps\EncryptedPrivateKeyInfo::MAP); - if (strlen($password) && is_array($decrypted)) { - $algorithm = $decrypted['encryptionAlgorithm']['algorithm']; - switch ($algorithm) { - // PBES1 - case 'pbeWithMD2AndDES-CBC': - case 'pbeWithMD2AndRC2-CBC': - case 'pbeWithMD5AndDES-CBC': - case 'pbeWithMD5AndRC2-CBC': - case 'pbeWithSHA1AndDES-CBC': - case 'pbeWithSHA1AndRC2-CBC': - case 'pbeWithSHAAnd3-KeyTripleDES-CBC': - case 'pbeWithSHAAnd2-KeyTripleDES-CBC': - case 'pbeWithSHAAnd128BitRC2-CBC': - case 'pbeWithSHAAnd40BitRC2-CBC': - case 'pbeWithSHAAnd128BitRC4': - case 'pbeWithSHAAnd40BitRC4': - $cipher = self::getPBES1EncryptionObject($algorithm); - $hash = self::getPBES1Hash($algorithm); - $kdf = self::getPBES1KDF($algorithm); - - $meta['meta']['algorithm'] = $algorithm; - - $temp = ASN1::decodeBER($decrypted['encryptionAlgorithm']['parameters']); - if (!$temp) { - throw new \RuntimeException('Unable to decode BER'); - } - $map = ASN1::asn1map($temp[0], Maps\PBEParameter::MAP); - $salt = $map['salt']; - $iterationCount = $map['iterationCount']; - $iterationCount = (int) $iterationCount->toString(); - $cipher->setPassword($password, $kdf, $hash, $salt, $iterationCount); - $key = $cipher->decrypt($decrypted['encryptedData']); - $decoded = ASN1::decodeBER($key); - if (!$decoded) { - throw new \RuntimeException('Unable to decode BER 2'); - } - - break; - case 'id-PBES2': - $meta['meta']['algorithm'] = $algorithm; - - $temp = ASN1::decodeBER($decrypted['encryptionAlgorithm']['parameters']); - if (!$temp) { - throw new \RuntimeException('Unable to decode BER'); - } - $temp = ASN1::asn1map($temp[0], Maps\PBES2params::MAP); - $keyDerivationFunc = $temp['keyDerivationFunc']; - $encryptionScheme = $temp['encryptionScheme']; - - $cipher = self::getPBES2EncryptionObject($encryptionScheme['algorithm']); - $meta['meta']['cipher'] = $encryptionScheme['algorithm']; - - $temp = ASN1::decodeBER($decrypted['encryptionAlgorithm']['parameters']); - if (!$temp) { - throw new \RuntimeException('Unable to decode BER'); - } - $temp = ASN1::asn1map($temp[0], Maps\PBES2params::MAP); - $keyDerivationFunc = $temp['keyDerivationFunc']; - $encryptionScheme = $temp['encryptionScheme']; - - if (!$cipher instanceof RC2) { - $cipher->setIV($encryptionScheme['parameters']['octetString']); - } else { - $temp = ASN1::decodeBER($encryptionScheme['parameters']); - if (!$temp) { - throw new \RuntimeException('Unable to decode BER'); - } - $map = ASN1::asn1map($temp[0], Maps\RC2CBCParameter::MAP); - $rc2ParametersVersion = $map['rc2ParametersVersion']; - $iv = $map['iv']; - $effectiveKeyLength = (int) $rc2ParametersVersion->toString(); - switch ($effectiveKeyLength) { - case 160: - $effectiveKeyLength = 40; - break; - case 120: - $effectiveKeyLength = 64; - break; - case 58: - $effectiveKeyLength = 128; - break; - //default: // should be >= 256 - } - $cipher->setIV($iv); - $cipher->setKeyLength($effectiveKeyLength); - } - - $meta['meta']['keyDerivationFunc'] = $keyDerivationFunc['algorithm']; - switch ($keyDerivationFunc['algorithm']) { - case 'id-PBKDF2': - $temp = ASN1::decodeBER($keyDerivationFunc['parameters']); - if (!$temp) { - throw new \RuntimeException('Unable to decode BER'); - } - $params = ASN1::asn1map($temp[0], Maps\PBKDF2params::MAP); - if (empty($params['prf'])) { - $params['prf'] = ['algorithm' => 'id-hmacWithSHA1']; - } - $salt = $params['salt']; - $iterationCount = $params['iterationCount']; - $prf = $params['prf']; - $meta['meta']['prf'] = $prf['algorithm']; - $hash = str_replace('-', '/', substr($prf['algorithm'], 11)); - $params = [ - $password, - 'pbkdf2', - $hash, - $salt, - (int) $iterationCount->toString() - ]; - if (isset($keyLength)) { - $params[] = (int) $keyLength->toString(); - } - $cipher->setPassword(...$params); - $key = $cipher->decrypt($decrypted['encryptedData']); - $decoded = ASN1::decodeBER($key); - if (!$decoded) { - throw new \RuntimeException('Unable to decode BER 3'); - } - break; - default: - throw new UnsupportedAlgorithmException('Only PBKDF2 is supported for PBES2 PKCS#8 keys'); - } - break; - case 'id-PBMAC1': - //$temp = ASN1::decodeBER($decrypted['encryptionAlgorithm']['parameters']); - //$value = ASN1::asn1map($temp[0], Maps\PBMAC1params::MAP); - // since i can't find any implementation that does PBMAC1 it is unsupported - throw new UnsupportedAlgorithmException('Only PBES1 and PBES2 PKCS#8 keys are supported.'); - // at this point we'll assume that the key conforms to PublicKeyInfo - } - } - - $private = ASN1::asn1map($decoded[0], Maps\OneAsymmetricKey::MAP); - if (is_array($private)) { - if ($isPublic) { - throw new \UnexpectedValueException('Human readable string claims public key but DER encoded string claims private key'); - } - - if (isset($private['privateKeyAlgorithm']['parameters']) && !$private['privateKeyAlgorithm']['parameters'] instanceof ASN1\Element && isset($decoded[0]['content'][1]['content'][1])) { - $temp = $decoded[0]['content'][1]['content'][1]; - $private['privateKeyAlgorithm']['parameters'] = new ASN1\Element(substr($key, $temp['start'], $temp['length'])); - } - if (is_array(static::OID_NAME)) { - if (!in_array($private['privateKeyAlgorithm']['algorithm'], static::OID_NAME)) { - throw new UnsupportedAlgorithmException($private['privateKeyAlgorithm']['algorithm'] . ' is not a supported key type'); - } - } else { - if ($private['privateKeyAlgorithm']['algorithm'] != static::OID_NAME) { - throw new UnsupportedAlgorithmException('Only ' . static::OID_NAME . ' keys are supported; this is a ' . $private['privateKeyAlgorithm']['algorithm'] . ' key'); - } - } - if (isset($private['publicKey'])) { - if ($private['publicKey'][0] != "\0") { - throw new \UnexpectedValueException('The first byte of the public key should be null - not ' . bin2hex($private['publicKey'][0])); - } - $private['publicKey'] = substr($private['publicKey'], 1); - } - return $private + $meta; - } - - // EncryptedPrivateKeyInfo and PublicKeyInfo have largely identical "signatures". the only difference - // is that the former has an octet string and the later has a bit string. the first byte of a bit - // string represents the number of bits in the last byte that are to be ignored but, currently, - // bit strings wanting a non-zero amount of bits trimmed are not supported - $public = ASN1::asn1map($decoded[0], Maps\PublicKeyInfo::MAP); - - if (is_array($public)) { - if ($isPrivate) { - throw new \UnexpectedValueException('Human readable string claims private key but DER encoded string claims public key'); - } - - if ($public['publicKey'][0] != "\0") { - throw new \UnexpectedValueException('The first byte of the public key should be null - not ' . bin2hex($public['publicKey'][0])); - } - if (is_array(static::OID_NAME)) { - if (!in_array($public['publicKeyAlgorithm']['algorithm'], static::OID_NAME)) { - throw new UnsupportedAlgorithmException($public['publicKeyAlgorithm']['algorithm'] . ' is not a supported key type'); - } - } else { - if ($public['publicKeyAlgorithm']['algorithm'] != static::OID_NAME) { - throw new UnsupportedAlgorithmException('Only ' . static::OID_NAME . ' keys are supported; this is a ' . $public['publicKeyAlgorithm']['algorithm'] . ' key'); - } - } - if (isset($public['publicKeyAlgorithm']['parameters']) && !$public['publicKeyAlgorithm']['parameters'] instanceof ASN1\Element && isset($decoded[0]['content'][0]['content'][1])) { - $temp = $decoded[0]['content'][0]['content'][1]; - $public['publicKeyAlgorithm']['parameters'] = new ASN1\Element(substr($key, $temp['start'], $temp['length'])); - } - $public['publicKey'] = substr($public['publicKey'], 1); - return $public; - } - - throw new \RuntimeException('Unable to parse using either OneAsymmetricKey or PublicKeyInfo ASN1 maps'); - } - - /** - * Toggle between binary (DER) and printable (PEM) keys - * - * Printable keys are what are generated by default. - * - * @param bool $enabled - */ - public static function setBinaryOutput($enabled) - { - self::$binary = $enabled; - } - - /** - * Wrap a private key appropriately - * - * @param string $key - * @param string $attr - * @param mixed $params - * @param string $password - * @param string $oid optional - * @param string $publicKey optional - * @param array $options optional - * @return string - */ - protected static function wrapPrivateKey($key, $attr, $params, $password, $oid = null, $publicKey = '', array $options = []) - { - self::initialize_static_variables(); - - $key = [ - 'version' => 'v1', - 'privateKeyAlgorithm' => [ - 'algorithm' => is_string(static::OID_NAME) ? static::OID_NAME : $oid - ], - 'privateKey' => $key - ]; - if ($oid != 'id-Ed25519' && $oid != 'id-Ed448') { - $key['privateKeyAlgorithm']['parameters'] = $params; - } - if (!empty($attr)) { - $key['attributes'] = $attr; - } - if (!empty($publicKey)) { - $key['version'] = 'v2'; - $key['publicKey'] = $publicKey; - } - $key = ASN1::encodeDER($key, Maps\OneAsymmetricKey::MAP); - if (!empty($password) && is_string($password)) { - $salt = Random::string(8); - - $iterationCount = isset($options['iterationCount']) ? $options['iterationCount'] : self::$defaultIterationCount; - $encryptionAlgorithm = isset($options['encryptionAlgorithm']) ? $options['encryptionAlgorithm'] : self::$defaultEncryptionAlgorithm; - $encryptionScheme = isset($options['encryptionScheme']) ? $options['encryptionScheme'] : self::$defaultEncryptionScheme; - $prf = isset($options['PRF']) ? $options['PRF'] : self::$defaultPRF; - - if ($encryptionAlgorithm == 'id-PBES2') { - $crypto = self::getPBES2EncryptionObject($encryptionScheme); - $hash = str_replace('-', '/', substr($prf, 11)); - $kdf = 'pbkdf2'; - $iv = Random::string($crypto->getBlockLength() >> 3); - - $PBKDF2params = [ - 'salt' => $salt, - 'iterationCount' => $iterationCount, - 'prf' => ['algorithm' => $prf, 'parameters' => null] - ]; - $PBKDF2params = ASN1::encodeDER($PBKDF2params, Maps\PBKDF2params::MAP); - - if (!$crypto instanceof RC2) { - $params = ['octetString' => $iv]; - } else { - $params = [ - 'rc2ParametersVersion' => 58, - 'iv' => $iv - ]; - $params = ASN1::encodeDER($params, Maps\RC2CBCParameter::MAP); - $params = new ASN1\Element($params); - } - - $params = [ - 'keyDerivationFunc' => [ - 'algorithm' => 'id-PBKDF2', - 'parameters' => new ASN1\Element($PBKDF2params) - ], - 'encryptionScheme' => [ - 'algorithm' => $encryptionScheme, - 'parameters' => $params - ] - ]; - $params = ASN1::encodeDER($params, Maps\PBES2params::MAP); - - $crypto->setIV($iv); - } else { - $crypto = self::getPBES1EncryptionObject($encryptionAlgorithm); - $hash = self::getPBES1Hash($encryptionAlgorithm); - $kdf = self::getPBES1KDF($encryptionAlgorithm); - - $params = [ - 'salt' => $salt, - 'iterationCount' => $iterationCount - ]; - $params = ASN1::encodeDER($params, Maps\PBEParameter::MAP); - } - $crypto->setPassword($password, $kdf, $hash, $salt, $iterationCount); - $key = $crypto->encrypt($key); - - $key = [ - 'encryptionAlgorithm' => [ - 'algorithm' => $encryptionAlgorithm, - 'parameters' => new ASN1\Element($params) - ], - 'encryptedData' => $key - ]; - - $key = ASN1::encodeDER($key, Maps\EncryptedPrivateKeyInfo::MAP); - - if (isset($options['binary']) ? $options['binary'] : self::$binary) { - return $key; - } - - return "-----BEGIN ENCRYPTED PRIVATE KEY-----\r\n" . - chunk_split(Strings::base64_encode($key), 64) . - "-----END ENCRYPTED PRIVATE KEY-----"; - } - - if (isset($options['binary']) ? $options['binary'] : self::$binary) { - return $key; - } - - return "-----BEGIN PRIVATE KEY-----\r\n" . - chunk_split(Strings::base64_encode($key), 64) . - "-----END PRIVATE KEY-----"; - } - - /** - * Wrap a public key appropriately - * - * @param string $key - * @param mixed $params - * @param string $oid - * @return string - */ - protected static function wrapPublicKey($key, $params, $oid = null, array $options = []) - { - self::initialize_static_variables(); - - $key = [ - 'publicKeyAlgorithm' => [ - 'algorithm' => is_string(static::OID_NAME) ? static::OID_NAME : $oid - ], - 'publicKey' => "\0" . $key - ]; - - if ($oid != 'id-Ed25519' && $oid != 'id-Ed448') { - $key['publicKeyAlgorithm']['parameters'] = $params; - } - - $key = ASN1::encodeDER($key, Maps\PublicKeyInfo::MAP); - - if (isset($options['binary']) ? $options['binary'] : self::$binary) { - return $key; - } - - return "-----BEGIN PUBLIC KEY-----\r\n" . - chunk_split(Strings::base64_encode($key), 64) . - "-----END PUBLIC KEY-----"; - } - - /** - * Perform some preliminary parsing of the key - * - * @param string $key - * @return array - */ - private static function preParse(&$key) - { - self::initialize_static_variables(); - - if (self::$format != self::MODE_DER) { - $decoded = ASN1::extractBER($key); - if ($decoded !== false) { - $key = $decoded; - } elseif (self::$format == self::MODE_PEM) { - throw new \UnexpectedValueException('Expected base64-encoded PEM format but was unable to decode base64 text'); - } - } - - $decoded = ASN1::decodeBER($key); - if (!$decoded) { - throw new \RuntimeException('Unable to decode BER'); - } - - return $decoded; - } - - /** - * Returns the encryption parameters used by the key - * - * @param string $key - * @return array - */ - public static function extractEncryptionAlgorithm($key) - { - if (!Strings::is_stringable($key)) { - throw new \UnexpectedValueException('Key should be a string - not a ' . gettype($key)); - } - - $decoded = self::preParse($key); - - $r = ASN1::asn1map($decoded[0], Maps\EncryptedPrivateKeyInfo::MAP); - if (!is_array($r)) { - throw new \RuntimeException('Unable to parse using EncryptedPrivateKeyInfo map'); - } - - if ($r['encryptionAlgorithm']['algorithm'] == 'id-PBES2') { - $decoded = ASN1::decodeBER($r['encryptionAlgorithm']['parameters']->element); - if (!$decoded) { - throw new \RuntimeException('Unable to decode BER'); - } - $r['encryptionAlgorithm']['parameters'] = ASN1::asn1map($decoded[0], Maps\PBES2params::MAP); - - $kdf = &$r['encryptionAlgorithm']['parameters']['keyDerivationFunc']; - switch ($kdf['algorithm']) { - case 'id-PBKDF2': - $decoded = ASN1::decodeBER($kdf['parameters']->element); - if (!$decoded) { - throw new \RuntimeException('Unable to decode BER'); - } - $kdf['parameters'] = ASN1::asn1map($decoded[0], Maps\PBKDF2params::MAP); - } - } - - return $r['encryptionAlgorithm']; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PuTTY.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PuTTY.php deleted file mode 100644 index 2ac35a1..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Keys/PuTTY.php +++ /dev/null @@ -1,380 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Keys; - -use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; -use OCA\Libresign\Vendor\phpseclib3\Crypt\AES; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Hash; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Random; -use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedAlgorithmException; - -/** - * PuTTY Formatted Key Handler - * - * @author Jim Wigginton - */ -abstract class PuTTY -{ - /** - * Default comment - * - * @var string - */ - private static $comment = 'phpseclib-generated-key'; - - /** - * Default version - * - * @var int - */ - private static $version = 2; - - /** - * Sets the default comment - * - * @param string $comment - */ - public static function setComment($comment) - { - self::$comment = str_replace(["\r", "\n"], '', $comment); - } - - /** - * Sets the default version - * - * @param int $version - */ - public static function setVersion($version) - { - if ($version != 2 && $version != 3) { - throw new \RuntimeException('Only supported versions are 2 and 3'); - } - self::$version = $version; - } - - /** - * Generate a symmetric key for PuTTY v2 keys - * - * @param string $password - * @param int $length - * @return string - */ - private static function generateV2Key($password, $length) - { - $symkey = ''; - $sequence = 0; - while (strlen($symkey) < $length) { - $temp = pack('Na*', $sequence++, $password); - $symkey .= Strings::hex2bin(sha1($temp)); - } - return substr($symkey, 0, $length); - } - - /** - * Generate a symmetric key for PuTTY v3 keys - * - * @param string $password - * @param string $flavour - * @param int $memory - * @param int $passes - * @param string $salt - * @return array - */ - private static function generateV3Key($password, $flavour, $memory, $passes, $salt) - { - if (!function_exists('sodium_crypto_pwhash')) { - throw new \RuntimeException('sodium_crypto_pwhash needs to exist for Argon2 password hasing'); - } - - switch ($flavour) { - case 'Argon2i': - $flavour = SODIUM_CRYPTO_PWHASH_ALG_ARGON2I13; - break; - case 'Argon2id': - $flavour = SODIUM_CRYPTO_PWHASH_ALG_ARGON2ID13; - break; - default: - throw new UnsupportedAlgorithmException('Only Argon2i and Argon2id are supported'); - } - - $length = 80; // keylen + ivlen + mac_keylen - $temp = sodium_crypto_pwhash($length, $password, $salt, $passes, $memory << 10, $flavour); - - $symkey = substr($temp, 0, 32); - $symiv = substr($temp, 32, 16); - $hashkey = substr($temp, -32); - - return compact('symkey', 'symiv', 'hashkey'); - } - - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password - * @return array - */ - public static function load($key, $password) - { - if (!Strings::is_stringable($key)) { - throw new \UnexpectedValueException('Key should be a string - not a ' . gettype($key)); - } - - if (strpos($key, 'BEGIN SSH2 PUBLIC KEY') !== false) { - $lines = preg_split('#[\r\n]+#', $key); - switch (true) { - case $lines[0] != '---- BEGIN SSH2 PUBLIC KEY ----': - throw new \UnexpectedValueException('Key doesn\'t start with ---- BEGIN SSH2 PUBLIC KEY ----'); - case $lines[count($lines) - 1] != '---- END SSH2 PUBLIC KEY ----': - throw new \UnexpectedValueException('Key doesn\'t end with ---- END SSH2 PUBLIC KEY ----'); - } - $lines = array_splice($lines, 1, -1); - $lines = array_map(function ($line) { - return rtrim($line, "\r\n"); - }, $lines); - $data = $current = ''; - $values = []; - $in_value = false; - foreach ($lines as $line) { - switch (true) { - case preg_match('#^(.*?): (.*)#', $line, $match): - $in_value = $line[strlen($line) - 1] == '\\'; - $current = strtolower($match[1]); - $values[$current] = $in_value ? substr($match[2], 0, -1) : $match[2]; - break; - case $in_value: - $in_value = $line[strlen($line) - 1] == '\\'; - $values[$current] .= $in_value ? substr($line, 0, -1) : $line; - break; - default: - $data .= $line; - } - } - - $components = call_user_func([static::PUBLIC_HANDLER, 'load'], $data); - if ($components === false) { - throw new \UnexpectedValueException('Unable to decode public key'); - } - $components += $values; - $components['comment'] = str_replace(['\\\\', '\"'], ['\\', '"'], $values['comment']); - - return $components; - } - - $components = []; - - $key = preg_split('#\r\n|\r|\n#', trim($key)); - if (Strings::shift($key[0], strlen('PuTTY-User-Key-File-')) != 'PuTTY-User-Key-File-') { - return false; - } - $version = (int) Strings::shift($key[0], 3); // should be either "2: " or "3: 0" prior to int casting - if ($version != 2 && $version != 3) { - throw new \RuntimeException('Only v2 and v3 PuTTY private keys are supported'); - } - $components['type'] = $type = rtrim($key[0]); - if (!in_array($type, static::$types)) { - $error = count(static::$types) == 1 ? - 'Only ' . static::$types[0] . ' keys are supported. ' : - ''; - throw new UnsupportedAlgorithmException($error . 'This is an unsupported ' . $type . ' key'); - } - $encryption = trim(preg_replace('#Encryption: (.+)#', '$1', $key[1])); - $components['comment'] = trim(preg_replace('#Comment: (.+)#', '$1', $key[2])); - - $publicLength = trim(preg_replace('#Public-Lines: (\d+)#', '$1', $key[3])); - $public = Strings::base64_decode(implode('', array_map('trim', array_slice($key, 4, $publicLength)))); - - $source = Strings::packSSH2('ssss', $type, $encryption, $components['comment'], $public); - - $length = unpack('Nlength', Strings::shift($public, 4))['length']; - $newtype = Strings::shift($public, $length); - if ($newtype != $type) { - throw new \RuntimeException('The binary type does not match the human readable type field'); - } - - $components['public'] = $public; - - switch ($version) { - case 3: - $hashkey = ''; - break; - case 2: - $hashkey = 'putty-private-key-file-mac-key'; - } - - $offset = $publicLength + 4; - switch ($encryption) { - case 'aes256-cbc': - $crypto = new AES('cbc'); - switch ($version) { - case 3: - $flavour = trim(preg_replace('#Key-Derivation: (.*)#', '$1', $key[$offset++])); - $memory = trim(preg_replace('#Argon2-Memory: (\d+)#', '$1', $key[$offset++])); - $passes = trim(preg_replace('#Argon2-Passes: (\d+)#', '$1', $key[$offset++])); - $parallelism = trim(preg_replace('#Argon2-Parallelism: (\d+)#', '$1', $key[$offset++])); - $salt = Strings::hex2bin(trim(preg_replace('#Argon2-Salt: ([0-9a-f]+)#', '$1', $key[$offset++]))); - - $v3key = self::generateV3Key($password, $flavour, $memory, $passes, $salt); - $symkey = $v3key['symkey']; - $symiv = $v3key['symiv']; - $hashkey = $v3key['hashkey']; - - break; - case 2: - $symkey = self::generateV2Key($password, 32); - $symiv = str_repeat("\0", $crypto->getBlockLength() >> 3); - $hashkey .= $password; - } - } - - switch ($version) { - case 3: - $hash = new Hash('sha256'); - $hash->setKey($hashkey); - break; - case 2: - $hash = new Hash('sha1'); - $hash->setKey(sha1($hashkey, true)); - } - - $privateLength = trim(preg_replace('#Private-Lines: (\d+)#', '$1', $key[$offset++])); - $private = Strings::base64_decode(implode('', array_map('trim', array_slice($key, $offset, $privateLength)))); - - if ($encryption != 'none') { - $crypto->setKey($symkey); - $crypto->setIV($symiv); - $crypto->disablePadding(); - $private = $crypto->decrypt($private); - } - - $source .= Strings::packSSH2('s', $private); - - $hmac = trim(preg_replace('#Private-MAC: (.+)#', '$1', $key[$offset + $privateLength])); - $hmac = Strings::hex2bin($hmac); - - if (!hash_equals($hash->hash($source), $hmac)) { - throw new \UnexpectedValueException('MAC validation error'); - } - - $components['private'] = $private; - - return $components; - } - - /** - * Wrap a private key appropriately - * - * @param string $public - * @param string $private - * @param string $type - * @param string $password - * @param array $options optional - * @return string - */ - protected static function wrapPrivateKey($public, $private, $type, $password, array $options = []) - { - $encryption = (!empty($password) || is_string($password)) ? 'aes256-cbc' : 'none'; - $comment = isset($options['comment']) ? $options['comment'] : self::$comment; - $version = isset($options['version']) ? $options['version'] : self::$version; - - $key = "PuTTY-User-Key-File-$version: $type\r\n"; - $key .= "Encryption: $encryption\r\n"; - $key .= "Comment: $comment\r\n"; - - $public = Strings::packSSH2('s', $type) . $public; - - $source = Strings::packSSH2('ssss', $type, $encryption, $comment, $public); - - $public = Strings::base64_encode($public); - $key .= "Public-Lines: " . ((strlen($public) + 63) >> 6) . "\r\n"; - $key .= chunk_split($public, 64); - - if (empty($password) && !is_string($password)) { - $source .= Strings::packSSH2('s', $private); - switch ($version) { - case 3: - $hash = new Hash('sha256'); - $hash->setKey(''); - break; - case 2: - $hash = new Hash('sha1'); - $hash->setKey(sha1('putty-private-key-file-mac-key', true)); - } - } else { - $private .= Random::string(16 - (strlen($private) & 15)); - $source .= Strings::packSSH2('s', $private); - $crypto = new AES('cbc'); - - switch ($version) { - case 3: - $salt = Random::string(16); - $key .= "Key-Derivation: Argon2id\r\n"; - $key .= "Argon2-Memory: 8192\r\n"; - $key .= "Argon2-Passes: 13\r\n"; - $key .= "Argon2-Parallelism: 1\r\n"; - $key .= "Argon2-Salt: " . Strings::bin2hex($salt) . "\r\n"; - $v3key = self::generateV3Key($password, 'Argon2id', 8192, 13, $salt); - $symkey = $v3key['symkey']; - $symiv = $v3key['symiv']; - $hashkey = $v3key['hashkey']; - - $hash = new Hash('sha256'); - $hash->setKey($hashkey); - - break; - case 2: - $symkey = self::generateV2Key($password, 32); - $symiv = str_repeat("\0", $crypto->getBlockLength() >> 3); - $hashkey = 'putty-private-key-file-mac-key' . $password; - - $hash = new Hash('sha1'); - $hash->setKey(sha1($hashkey, true)); - } - - $crypto->setKey($symkey); - $crypto->setIV($symiv); - $crypto->disablePadding(); - $private = $crypto->encrypt($private); - $mac = $hash->hash($source); - } - - $private = Strings::base64_encode($private); - $key .= 'Private-Lines: ' . ((strlen($private) + 63) >> 6) . "\r\n"; - $key .= chunk_split($private, 64); - $key .= 'Private-MAC: ' . Strings::bin2hex($hash->hash($source)) . "\r\n"; - - return $key; - } - - /** - * Wrap a public key appropriately - * - * This is basically the format described in RFC 4716 (https://tools.ietf.org/html/rfc4716) - * - * @param string $key - * @param string $type - * @return string - */ - protected static function wrapPublicKey($key, $type) - { - $key = pack('Na*a*', strlen($type), $type, $key); - $key = "---- BEGIN SSH2 PUBLIC KEY ----\r\n" . - 'Comment: "' . str_replace(['\\', '"'], ['\\\\', '\"'], self::$comment) . "\"\r\n" . - chunk_split(Strings::base64_encode($key), 64) . - '---- END SSH2 PUBLIC KEY ----'; - return $key; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Signature/Raw.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Signature/Raw.php deleted file mode 100644 index 0c70e21..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Formats/Signature/Raw.php +++ /dev/null @@ -1,60 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Signature; - -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * Raw Signature Handler - * - * @author Jim Wigginton - */ -abstract class Raw -{ - /** - * Loads a signature - * - * @param array $sig - * @return array|bool - */ - public static function load($sig) - { - switch (true) { - case !is_array($sig): - case !isset($sig['r']) || !isset($sig['s']): - case !$sig['r'] instanceof BigInteger: - case !$sig['s'] instanceof BigInteger: - return false; - } - - return [ - 'r' => $sig['r'], - 's' => $sig['s'] - ]; - } - - /** - * Returns a signature in the appropriate format - * - * @param BigInteger $r - * @param BigInteger $s - * @return string - */ - public static function save(BigInteger $r, BigInteger $s) - { - return compact('r', 's'); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/PrivateKey.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/PrivateKey.php deleted file mode 100644 index 5f7ebcb..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/PrivateKey.php +++ /dev/null @@ -1,31 +0,0 @@ - - * @copyright 2009 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\Common; - -/** - * PrivateKey interface - * - * @author Jim Wigginton - */ -interface PrivateKey -{ - public function sign($message); - //public function decrypt($ciphertext); - public function getPublicKey(); - public function toString($type, array $options = []); - - /** - * @param string|false $password - * @return mixed - */ - public function withPassword($password = false); -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/PublicKey.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/PublicKey.php deleted file mode 100644 index 36f6b99..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/PublicKey.php +++ /dev/null @@ -1,25 +0,0 @@ - - * @copyright 2009 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\Common; - -/** - * PublicKey interface - * - * @author Jim Wigginton - */ -interface PublicKey -{ - public function verify($message, $signature); - //public function encrypt($plaintext); - public function toString($type, array $options = []); - public function getFingerprint($algorithm); -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/StreamCipher.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/StreamCipher.php deleted file mode 100644 index ad74a21..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/StreamCipher.php +++ /dev/null @@ -1,54 +0,0 @@ - - * @author Hans-Juergen Petrich - * @copyright 2007 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\Common; - -/** - * Base Class for all stream cipher classes - * - * @author Jim Wigginton - */ -abstract class StreamCipher extends SymmetricKey -{ - /** - * Block Length of the cipher - * - * Stream ciphers do not have a block size - * - * @see SymmetricKey::block_size - * @var int - */ - protected $block_size = 0; - - /** - * Default Constructor. - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::__construct() - * @return StreamCipher - */ - public function __construct() - { - parent::__construct('stream'); - } - - /** - * Stream ciphers not use an IV - * - * @return bool - */ - public function usesIV() - { - return false; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/SymmetricKey.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/SymmetricKey.php deleted file mode 100644 index 12cda8d..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/SymmetricKey.php +++ /dev/null @@ -1,3398 +0,0 @@ - - * @author Hans-Juergen Petrich - * @copyright 2007 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\Common; - -use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Blowfish; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Hash; -use OCA\Libresign\Vendor\phpseclib3\Exception\BadDecryptionException; -use OCA\Libresign\Vendor\phpseclib3\Exception\BadModeException; -use OCA\Libresign\Vendor\phpseclib3\Exception\InconsistentSetupException; -use OCA\Libresign\Vendor\phpseclib3\Exception\InsufficientSetupException; -use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedAlgorithmException; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -use OCA\Libresign\Vendor\phpseclib3\Math\BinaryField; -use OCA\Libresign\Vendor\phpseclib3\Math\PrimeField; - -/** - * Base Class for all \phpseclib3\Crypt\* cipher classes - * - * @author Jim Wigginton - * @author Hans-Juergen Petrich - */ -abstract class SymmetricKey -{ - /** - * Encrypt / decrypt using the Counter mode. - * - * Set to -1 since that's what Crypt/Random.php uses to index the CTR mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Counter_.28CTR.29 - * @see \phpseclib3\Crypt\Common\SymmetricKey::encrypt() - * @see \phpseclib3\Crypt\Common\SymmetricKey::decrypt() - */ - const MODE_CTR = -1; - /** - * Encrypt / decrypt using the Electronic Code Book mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Electronic_codebook_.28ECB.29 - * @see \phpseclib3\Crypt\Common\SymmetricKey::encrypt() - * @see \phpseclib3\Crypt\Common\SymmetricKey::decrypt() - */ - const MODE_ECB = 1; - /** - * Encrypt / decrypt using the Code Book Chaining mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29 - * @see \phpseclib3\Crypt\Common\SymmetricKey::encrypt() - * @see \phpseclib3\Crypt\Common\SymmetricKey::decrypt() - */ - const MODE_CBC = 2; - /** - * Encrypt / decrypt using the Cipher Feedback mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher_feedback_.28CFB.29 - * @see \phpseclib3\Crypt\Common\SymmetricKey::encrypt() - * @see \phpseclib3\Crypt\Common\SymmetricKey::decrypt() - */ - const MODE_CFB = 3; - /** - * Encrypt / decrypt using the Cipher Feedback mode (8bit) - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::encrypt() - * @see \phpseclib3\Crypt\Common\SymmetricKey::decrypt() - */ - const MODE_CFB8 = 7; - /** - * Encrypt / decrypt using the Output Feedback mode (8bit) - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::encrypt() - * @see \phpseclib3\Crypt\Common\SymmetricKey::decrypt() - */ - const MODE_OFB8 = 8; - /** - * Encrypt / decrypt using the Output Feedback mode. - * - * @link http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Output_feedback_.28OFB.29 - * @see \phpseclib3\Crypt\Common\SymmetricKey::encrypt() - * @see \phpseclib3\Crypt\Common\SymmetricKey::decrypt() - */ - const MODE_OFB = 4; - /** - * Encrypt / decrypt using Galois/Counter mode. - * - * @link https://en.wikipedia.org/wiki/Galois/Counter_Mode - * @see \phpseclib3\Crypt\Common\SymmetricKey::encrypt() - * @see \phpseclib3\Crypt\Common\SymmetricKey::decrypt() - */ - const MODE_GCM = 5; - /** - * Encrypt / decrypt using streaming mode. - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::encrypt() - * @see \phpseclib3\Crypt\Common\SymmetricKey::decrypt() - */ - const MODE_STREAM = 6; - - /** - * Mode Map - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::__construct() - */ - const MODE_MAP = [ - 'ctr' => self::MODE_CTR, - 'ecb' => self::MODE_ECB, - 'cbc' => self::MODE_CBC, - 'cfb' => self::MODE_CFB, - 'cfb8' => self::MODE_CFB8, - 'ofb' => self::MODE_OFB, - 'ofb8' => self::MODE_OFB8, - 'gcm' => self::MODE_GCM, - 'stream' => self::MODE_STREAM - ]; - - /** - * Base value for the internal implementation $engine switch - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::__construct() - */ - const ENGINE_INTERNAL = 1; - /** - * Base value for the eval() implementation $engine switch - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::__construct() - */ - const ENGINE_EVAL = 2; - /** - * Base value for the mcrypt implementation $engine switch - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::__construct() - */ - const ENGINE_MCRYPT = 3; - /** - * Base value for the openssl implementation $engine switch - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::__construct() - */ - const ENGINE_OPENSSL = 4; - /** - * Base value for the libsodium implementation $engine switch - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::__construct() - */ - const ENGINE_LIBSODIUM = 5; - /** - * Base value for the openssl / gcm implementation $engine switch - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::__construct() - */ - const ENGINE_OPENSSL_GCM = 6; - - /** - * Engine Reverse Map - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::getEngine() - */ - const ENGINE_MAP = [ - self::ENGINE_INTERNAL => 'PHP', - self::ENGINE_EVAL => 'Eval', - self::ENGINE_MCRYPT => 'mcrypt', - self::ENGINE_OPENSSL => 'OpenSSL', - self::ENGINE_LIBSODIUM => 'libsodium', - self::ENGINE_OPENSSL_GCM => 'OpenSSL (GCM)' - ]; - - /** - * The Encryption Mode - * - * @see self::__construct() - * @var int - */ - protected $mode; - - /** - * The Block Length of the block cipher - * - * @var int - */ - protected $block_size = 16; - - /** - * The Key - * - * @see self::setKey() - * @var string - */ - protected $key = false; - - /** - * HMAC Key - * - * @see self::setupGCM() - * @var ?string - */ - protected $hKey = false; - - /** - * The Initialization Vector - * - * @see self::setIV() - * @var string - */ - protected $iv = false; - - /** - * A "sliding" Initialization Vector - * - * @see self::enableContinuousBuffer() - * @see self::clearBuffers() - * @var string - */ - protected $encryptIV; - - /** - * A "sliding" Initialization Vector - * - * @see self::enableContinuousBuffer() - * @see self::clearBuffers() - * @var string - */ - protected $decryptIV; - - /** - * Continuous Buffer status - * - * @see self::enableContinuousBuffer() - * @var bool - */ - protected $continuousBuffer = false; - - /** - * Encryption buffer for CTR, OFB and CFB modes - * - * @see self::encrypt() - * @see self::clearBuffers() - * @var array - */ - protected $enbuffer; - - /** - * Decryption buffer for CTR, OFB and CFB modes - * - * @see self::decrypt() - * @see self::clearBuffers() - * @var array - */ - protected $debuffer; - - /** - * mcrypt resource for encryption - * - * The mcrypt resource can be recreated every time something needs to be created or it can be created just once. - * Since mcrypt operates in continuous mode, by default, it'll need to be recreated when in non-continuous mode. - * - * @see self::encrypt() - * @var resource - */ - private $enmcrypt; - - /** - * mcrypt resource for decryption - * - * The mcrypt resource can be recreated every time something needs to be created or it can be created just once. - * Since mcrypt operates in continuous mode, by default, it'll need to be recreated when in non-continuous mode. - * - * @see self::decrypt() - * @var resource - */ - private $demcrypt; - - /** - * Does the enmcrypt resource need to be (re)initialized? - * - * @see \phpseclib3\Crypt\Twofish::setKey() - * @see \phpseclib3\Crypt\Twofish::setIV() - * @var bool - */ - private $enchanged = true; - - /** - * Does the demcrypt resource need to be (re)initialized? - * - * @see \phpseclib3\Crypt\Twofish::setKey() - * @see \phpseclib3\Crypt\Twofish::setIV() - * @var bool - */ - private $dechanged = true; - - /** - * mcrypt resource for CFB mode - * - * mcrypt's CFB mode, in (and only in) buffered context, - * is broken, so phpseclib implements the CFB mode by it self, - * even when the mcrypt php extension is available. - * - * In order to do the CFB-mode work (fast) phpseclib - * use a separate ECB-mode mcrypt resource. - * - * @link http://phpseclib.sourceforge.net/cfb-demo.phps - * @see self::encrypt() - * @see self::decrypt() - * @see self::setupMcrypt() - * @var resource - */ - private $ecb; - - /** - * Optimizing value while CFB-encrypting - * - * Only relevant if $continuousBuffer enabled - * and $engine == self::ENGINE_MCRYPT - * - * It's faster to re-init $enmcrypt if - * $buffer bytes > $cfb_init_len than - * using the $ecb resource furthermore. - * - * This value depends of the chosen cipher - * and the time it would be needed for it's - * initialization [by mcrypt_generic_init()] - * which, typically, depends on the complexity - * on its internaly Key-expanding algorithm. - * - * @see self::encrypt() - * @var int - */ - protected $cfb_init_len = 600; - - /** - * Does internal cipher state need to be (re)initialized? - * - * @see self::setKey() - * @see self::setIV() - * @see self::disableContinuousBuffer() - * @var bool - */ - protected $changed = true; - - /** - * Does Eval engie need to be (re)initialized? - * - * @see self::setup() - * @var bool - */ - protected $nonIVChanged = true; - - /** - * Padding status - * - * @see self::enablePadding() - * @var bool - */ - private $padding = true; - - /** - * Is the mode one that is paddable? - * - * @see self::__construct() - * @var bool - */ - private $paddable = false; - - /** - * Holds which crypt engine internaly should be use, - * which will be determined automatically on __construct() - * - * Currently available $engines are: - * - self::ENGINE_LIBSODIUM (very fast, php-extension: libsodium, extension_loaded('libsodium') required) - * - self::ENGINE_OPENSSL_GCM (very fast, php-extension: openssl, extension_loaded('openssl') required) - * - self::ENGINE_OPENSSL (very fast, php-extension: openssl, extension_loaded('openssl') required) - * - self::ENGINE_MCRYPT (fast, php-extension: mcrypt, extension_loaded('mcrypt') required) - * - self::ENGINE_EVAL (medium, pure php-engine, no php-extension required) - * - self::ENGINE_INTERNAL (slower, pure php-engine, no php-extension required) - * - * @see self::setEngine() - * @see self::encrypt() - * @see self::decrypt() - * @var int - */ - protected $engine; - - /** - * Holds the preferred crypt engine - * - * @see self::setEngine() - * @see self::setPreferredEngine() - * @var int - */ - private $preferredEngine; - - /** - * The mcrypt specific name of the cipher - * - * Only used if $engine == self::ENGINE_MCRYPT - * - * @link http://www.php.net/mcrypt_module_open - * @link http://www.php.net/mcrypt_list_algorithms - * @see self::setupMcrypt() - * @var string - */ - protected $cipher_name_mcrypt; - - /** - * The openssl specific name of the cipher - * - * Only used if $engine == self::ENGINE_OPENSSL - * - * @link http://www.php.net/openssl-get-cipher-methods - * @var string - */ - protected $cipher_name_openssl; - - /** - * The openssl specific name of the cipher in ECB mode - * - * If OpenSSL does not support the mode we're trying to use (CTR) - * it can still be emulated with ECB mode. - * - * @link http://www.php.net/openssl-get-cipher-methods - * @var string - */ - protected $cipher_name_openssl_ecb; - - /** - * The default salt used by setPassword() - * - * @see self::setPassword() - * @var string - */ - private $password_default_salt = 'phpseclib/salt'; - - /** - * The name of the performance-optimized callback function - * - * Used by encrypt() / decrypt() - * only if $engine == self::ENGINE_INTERNAL - * - * @see self::encrypt() - * @see self::decrypt() - * @see self::setupInlineCrypt() - * @var Callback - */ - protected $inline_crypt; - - /** - * If OpenSSL can be used in ECB but not in CTR we can emulate CTR - * - * @see self::openssl_ctr_process() - * @var bool - */ - private $openssl_emulate_ctr = false; - - /** - * Don't truncate / null pad key - * - * @see self::clearBuffers() - * @var bool - */ - private $skip_key_adjustment = false; - - /** - * Has the key length explicitly been set or should it be derived from the key, itself? - * - * @see self::setKeyLength() - * @var bool - */ - protected $explicit_key_length = false; - - /** - * Hash subkey for GHASH - * - * @see self::setupGCM() - * @see self::ghash() - * @var BinaryField\Integer - */ - private $h; - - /** - * Additional authenticated data - * - * @var string - */ - protected $aad = ''; - - /** - * Authentication Tag produced after a round of encryption - * - * @var string - */ - protected $newtag = false; - - /** - * Authentication Tag to be verified during decryption - * - * @var string - */ - protected $oldtag = false; - - /** - * GCM Binary Field - * - * @see self::__construct() - * @see self::ghash() - * @var BinaryField - */ - private static $gcmField; - - /** - * Poly1305 Prime Field - * - * @see self::enablePoly1305() - * @see self::poly1305() - * @var PrimeField - */ - private static $poly1305Field; - - /** - * Flag for using regular vs "safe" intval - * - * @see self::initialize_static_variables() - * @var boolean - */ - protected static $use_reg_intval; - - /** - * Poly1305 Key - * - * @see self::setPoly1305Key() - * @see self::poly1305() - * @var string - */ - protected $poly1305Key; - - /** - * Poly1305 Flag - * - * @see self::setPoly1305Key() - * @see self::enablePoly1305() - * @var boolean - */ - protected $usePoly1305 = false; - - /** - * The Original Initialization Vector - * - * GCM uses the nonce to build the IV but we want to be able to distinguish between nonce-derived - * IV's and user-set IV's - * - * @see self::setIV() - * @var string - */ - private $origIV = false; - - /** - * Nonce - * - * Only used with GCM. We could re-use setIV() but nonce's can be of a different length and - * toggling between GCM and other modes could be more complicated if we re-used setIV() - * - * @see self::setNonce() - * @var string - */ - protected $nonce = false; - - /** - * Default Constructor. - * - * $mode could be: - * - * - ecb - * - * - cbc - * - * - ctr - * - * - cfb - * - * - cfb8 - * - * - ofb - * - * - ofb8 - * - * - gcm - * - * @param string $mode - * @throws BadModeException if an invalid / unsupported mode is provided - */ - public function __construct($mode) - { - $mode = strtolower($mode); - // necessary because of 5.6 compatibility; we can't do isset(self::MODE_MAP[$mode]) in 5.6 - $map = self::MODE_MAP; - if (!isset($map[$mode])) { - throw new BadModeException('No valid mode has been specified'); - } - - $mode = self::MODE_MAP[$mode]; - - // $mode dependent settings - switch ($mode) { - case self::MODE_ECB: - case self::MODE_CBC: - $this->paddable = true; - break; - case self::MODE_CTR: - case self::MODE_CFB: - case self::MODE_CFB8: - case self::MODE_OFB: - case self::MODE_OFB8: - case self::MODE_STREAM: - $this->paddable = false; - break; - case self::MODE_GCM: - if ($this->block_size != 16) { - throw new BadModeException('GCM is only valid for block ciphers with a block size of 128 bits'); - } - if (!isset(self::$gcmField)) { - self::$gcmField = new BinaryField(128, 7, 2, 1, 0); - } - $this->paddable = false; - break; - default: - throw new BadModeException('No valid mode has been specified'); - } - - $this->mode = $mode; - - static::initialize_static_variables(); - } - - /** - * Initialize static variables - */ - protected static function initialize_static_variables() - { - if (!isset(self::$use_reg_intval)) { - switch (true) { - // PHP_OS & "\xDF\xDF\xDF" == strtoupper(substr(PHP_OS, 0, 3)), but a lot faster - case (PHP_OS & "\xDF\xDF\xDF") === 'WIN': - case !function_exists('php_uname'): - case !is_string(php_uname('m')): - case (php_uname('m') & "\xDF\xDF\xDF") != 'ARM': - case defined('PHP_INT_SIZE') && PHP_INT_SIZE == 8: - self::$use_reg_intval = true; - break; - case (php_uname('m') & "\xDF\xDF\xDF") == 'ARM': - switch (true) { - /* PHP 7.0.0 introduced a bug that affected 32-bit ARM processors: - - https://github.com/php/php-src/commit/716da71446ebbd40fa6cf2cea8a4b70f504cc3cd - - altho the changelogs make no mention of it, this bug was fixed with this commit: - - https://github.com/php/php-src/commit/c1729272b17a1fe893d1a54e423d3b71470f3ee8 - - affected versions of PHP are: 7.0.x, 7.1.0 - 7.1.23 and 7.2.0 - 7.2.11 */ - case PHP_VERSION_ID >= 70000 && PHP_VERSION_ID <= 70123: - case PHP_VERSION_ID >= 70200 && PHP_VERSION_ID <= 70211: - self::$use_reg_intval = false; - break; - default: - self::$use_reg_intval = true; - } - } - } - } - - /** - * Sets the initialization vector. - * - * setIV() is not required when ecb or gcm modes are being used. - * - * {@internal Can be overwritten by a sub class, but does not have to be} - * - * @param string $iv - * @throws \LengthException if the IV length isn't equal to the block size - * @throws \BadMethodCallException if an IV is provided when one shouldn't be - */ - public function setIV($iv) - { - if ($this->mode == self::MODE_ECB) { - throw new \BadMethodCallException('This mode does not require an IV.'); - } - - if ($this->mode == self::MODE_GCM) { - throw new \BadMethodCallException('Use setNonce instead'); - } - - if (!$this->usesIV()) { - throw new \BadMethodCallException('This algorithm does not use an IV.'); - } - - if (strlen($iv) != $this->block_size) { - throw new \LengthException('Received initialization vector of size ' . strlen($iv) . ', but size ' . $this->block_size . ' is required'); - } - - $this->iv = $this->origIV = $iv; - $this->changed = true; - } - - /** - * Enables Poly1305 mode. - * - * Once enabled Poly1305 cannot be disabled. - * - * @throws \BadMethodCallException if Poly1305 is enabled whilst in GCM mode - */ - public function enablePoly1305() - { - if ($this->mode == self::MODE_GCM) { - throw new \BadMethodCallException('Poly1305 cannot be used in GCM mode'); - } - - $this->usePoly1305 = true; - } - - /** - * Enables Poly1305 mode. - * - * Once enabled Poly1305 cannot be disabled. If $key is not passed then an attempt to call createPoly1305Key - * will be made. - * - * @param string $key optional - * @throws \LengthException if the key isn't long enough - * @throws \BadMethodCallException if Poly1305 is enabled whilst in GCM mode - */ - public function setPoly1305Key($key = null) - { - if ($this->mode == self::MODE_GCM) { - throw new \BadMethodCallException('Poly1305 cannot be used in GCM mode'); - } - - if (!is_string($key) || strlen($key) != 32) { - throw new \LengthException('The Poly1305 key must be 32 bytes long (256 bits)'); - } - - if (!isset(self::$poly1305Field)) { - // 2^130-5 - self::$poly1305Field = new PrimeField(new BigInteger('3fffffffffffffffffffffffffffffffb', 16)); - } - - $this->poly1305Key = $key; - $this->usePoly1305 = true; - } - - /** - * Sets the nonce. - * - * setNonce() is only required when gcm is used - * - * @param string $nonce - * @throws \BadMethodCallException if an nonce is provided when one shouldn't be - */ - public function setNonce($nonce) - { - if ($this->mode != self::MODE_GCM) { - throw new \BadMethodCallException('Nonces are only used in GCM mode.'); - } - - $this->nonce = $nonce; - $this->setEngine(); - } - - /** - * Sets additional authenticated data - * - * setAAD() is only used by gcm or in poly1305 mode - * - * @param string $aad - * @throws \BadMethodCallException if mode isn't GCM or if poly1305 isn't being utilized - */ - public function setAAD($aad) - { - if ($this->mode != self::MODE_GCM && !$this->usePoly1305) { - throw new \BadMethodCallException('Additional authenticated data is only utilized in GCM mode or with Poly1305'); - } - - $this->aad = $aad; - } - - /** - * Returns whether or not the algorithm uses an IV - * - * @return bool - */ - public function usesIV() - { - return $this->mode != self::MODE_GCM && $this->mode != self::MODE_ECB; - } - - /** - * Returns whether or not the algorithm uses a nonce - * - * @return bool - */ - public function usesNonce() - { - return $this->mode == self::MODE_GCM; - } - - /** - * Returns the current key length in bits - * - * @return int - */ - public function getKeyLength() - { - return $this->key_length << 3; - } - - /** - * Returns the current block length in bits - * - * @return int - */ - public function getBlockLength() - { - return $this->block_size << 3; - } - - /** - * Returns the current block length in bytes - * - * @return int - */ - public function getBlockLengthInBytes() - { - return $this->block_size; - } - - /** - * Sets the key length. - * - * Keys with explicitly set lengths need to be treated accordingly - * - * @param int $length - */ - public function setKeyLength($length) - { - $this->explicit_key_length = $length >> 3; - - if (is_string($this->key) && strlen($this->key) != $this->explicit_key_length) { - $this->key = false; - throw new InconsistentSetupException('Key has already been set and is not ' . $this->explicit_key_length . ' bytes long'); - } - } - - /** - * Sets the key. - * - * The min/max length(s) of the key depends on the cipher which is used. - * If the key not fits the length(s) of the cipher it will paded with null bytes - * up to the closest valid key length. If the key is more than max length, - * we trim the excess bits. - * - * If the key is not explicitly set, it'll be assumed to be all null bytes. - * - * {@internal Could, but not must, extend by the child Crypt_* class} - * - * @param string $key - */ - public function setKey($key) - { - if ($this->explicit_key_length !== false && strlen($key) != $this->explicit_key_length) { - throw new InconsistentSetupException('Key length has already been set to ' . $this->explicit_key_length . ' bytes and this key is ' . strlen($key) . ' bytes'); - } - - $this->key = $key; - $this->key_length = strlen($key); - $this->setEngine(); - } - - /** - * Sets the password. - * - * Depending on what $method is set to, setPassword()'s (optional) parameters are as follows: - * {@link http://en.wikipedia.org/wiki/PBKDF2 pbkdf2} or pbkdf1: - * $hash, $salt, $count, $dkLen - * - * Where $hash (default = sha1) currently supports the following hashes: see: Crypt/Hash.php - * {@link https://en.wikipedia.org/wiki/Bcrypt bcypt}: - * $salt, $rounds, $keylen - * - * This is a modified version of bcrypt used by OpenSSH. - * - * {@internal Could, but not must, extend by the child Crypt_* class} - * - * @see Crypt/Hash.php - * @param string $password - * @param string $method - * @param int|string ...$func_args - * @throws \LengthException if pbkdf1 is being used and the derived key length exceeds the hash length - * @throws \RuntimeException if bcrypt is being used and a salt isn't provided - * @return bool - */ - public function setPassword($password, $method = 'pbkdf2', ...$func_args) - { - $key = ''; - - $method = strtolower($method); - switch ($method) { - case 'bcrypt': - if (!isset($func_args[2])) { - throw new \RuntimeException('A salt must be provided for bcrypt to work'); - } - - $salt = $func_args[0]; - - $rounds = isset($func_args[1]) ? $func_args[1] : 16; - $keylen = isset($func_args[2]) ? $func_args[2] : $this->key_length; - - $key = Blowfish::bcrypt_pbkdf($password, $salt, $keylen + $this->block_size, $rounds); - - $this->setKey(substr($key, 0, $keylen)); - $this->setIV(substr($key, $keylen)); - - return true; - case 'pkcs12': // from https://tools.ietf.org/html/rfc7292#appendix-B.2 - case 'pbkdf1': - case 'pbkdf2': - // Hash function - $hash = isset($func_args[0]) ? strtolower($func_args[0]) : 'sha1'; - $hashObj = new Hash(); - $hashObj->setHash($hash); - - // WPA and WPA2 use the SSID as the salt - $salt = isset($func_args[1]) ? $func_args[1] : $this->password_default_salt; - - // RFC2898#section-4.2 uses 1,000 iterations by default - // WPA and WPA2 use 4,096. - $count = isset($func_args[2]) ? $func_args[2] : 1000; - - // Keylength - if (isset($func_args[3])) { - if ($func_args[3] <= 0) { - throw new \LengthException('Derived key length cannot be longer 0 or less'); - } - $dkLen = $func_args[3]; - } else { - $key_length = $this->explicit_key_length !== false ? $this->explicit_key_length : $this->key_length; - $dkLen = $method == 'pbkdf1' ? 2 * $key_length : $key_length; - } - - switch (true) { - case $method == 'pkcs12': - /* - In this specification, however, all passwords are created from - BMPStrings with a NULL terminator. This means that each character in - the original BMPString is encoded in 2 bytes in big-endian format - (most-significant byte first). There are no Unicode byte order - marks. The 2 bytes produced from the last character in the BMPString - are followed by 2 additional bytes with the value 0x00. - - -- https://tools.ietf.org/html/rfc7292#appendix-B.1 - */ - $password = "\0" . chunk_split($password, 1, "\0") . "\0"; - - /* - This standard specifies 3 different values for the ID byte mentioned - above: - - 1. If ID=1, then the pseudorandom bits being produced are to be used - as key material for performing encryption or decryption. - - 2. If ID=2, then the pseudorandom bits being produced are to be used - as an IV (Initial Value) for encryption or decryption. - - 3. If ID=3, then the pseudorandom bits being produced are to be used - as an integrity key for MACing. - */ - // Construct a string, D (the "diversifier"), by concatenating v/8 - // copies of ID. - $blockLength = $hashObj->getBlockLengthInBytes(); - $d1 = str_repeat(chr(1), $blockLength); - $d2 = str_repeat(chr(2), $blockLength); - $s = ''; - if (strlen($salt)) { - while (strlen($s) < $blockLength) { - $s .= $salt; - } - } - $s = substr($s, 0, $blockLength); - - $p = ''; - if (strlen($password)) { - while (strlen($p) < $blockLength) { - $p .= $password; - } - } - $p = substr($p, 0, $blockLength); - - $i = $s . $p; - - $this->setKey(self::pkcs12helper($dkLen, $hashObj, $i, $d1, $count)); - if ($this->usesIV()) { - $this->setIV(self::pkcs12helper($this->block_size, $hashObj, $i, $d2, $count)); - } - - return true; - case $method == 'pbkdf1': - if ($dkLen > $hashObj->getLengthInBytes()) { - throw new \LengthException('Derived key length cannot be longer than the hash length'); - } - $t = $password . $salt; - for ($i = 0; $i < $count; ++$i) { - $t = $hashObj->hash($t); - } - $key = substr($t, 0, $dkLen); - - $this->setKey(substr($key, 0, $dkLen >> 1)); - if ($this->usesIV()) { - $this->setIV(substr($key, $dkLen >> 1)); - } - - return true; - case !in_array($hash, hash_algos()): - $i = 1; - $hashObj->setKey($password); - while (strlen($key) < $dkLen) { - $f = $u = $hashObj->hash($salt . pack('N', $i++)); - for ($j = 2; $j <= $count; ++$j) { - $u = $hashObj->hash($u); - $f ^= $u; - } - $key .= $f; - } - $key = substr($key, 0, $dkLen); - break; - default: - $key = hash_pbkdf2($hash, $password, $salt, $count, $dkLen, true); - } - break; - default: - throw new UnsupportedAlgorithmException($method . ' is not a supported password hashing method'); - } - - $this->setKey($key); - - return true; - } - - /** - * PKCS#12 KDF Helper Function - * - * As discussed here: - * - * {@link https://tools.ietf.org/html/rfc7292#appendix-B} - * - * @see self::setPassword() - * @param int $n - * @param Hash $hashObj - * @param string $i - * @param string $d - * @param int $count - * @return string $a - */ - private static function pkcs12helper($n, $hashObj, $i, $d, $count) - { - static $one; - if (!isset($one)) { - $one = new BigInteger(1); - } - - $blockLength = $hashObj->getBlockLength() >> 3; - - $c = ceil($n / $hashObj->getLengthInBytes()); - $a = ''; - for ($j = 1; $j <= $c; $j++) { - $ai = $d . $i; - for ($k = 0; $k < $count; $k++) { - $ai = $hashObj->hash($ai); - } - $b = ''; - while (strlen($b) < $blockLength) { - $b .= $ai; - } - $b = substr($b, 0, $blockLength); - $b = new BigInteger($b, 256); - $newi = ''; - for ($k = 0; $k < strlen($i); $k += $blockLength) { - $temp = substr($i, $k, $blockLength); - $temp = new BigInteger($temp, 256); - $temp->setPrecision($blockLength << 3); - $temp = $temp->add($b); - $temp = $temp->add($one); - $newi .= $temp->toBytes(false); - } - $i = $newi; - $a .= $ai; - } - - return substr($a, 0, $n); - } - - /** - * Encrypts a message. - * - * $plaintext will be padded with additional bytes such that it's length is a multiple of the block size. Other cipher - * implementations may or may not pad in the same manner. Other common approaches to padding and the reasons why it's - * necessary are discussed in the following - * URL: - * - * {@link http://www.di-mgt.com.au/cryptopad.html http://www.di-mgt.com.au/cryptopad.html} - * - * An alternative to padding is to, separately, send the length of the file. This is what SSH, in fact, does. - * strlen($plaintext) will still need to be a multiple of the block size, however, arbitrary values can be added to make it that - * length. - * - * {@internal Could, but not must, extend by the child Crypt_* class} - * - * @see self::decrypt() - * @param string $plaintext - * @return string $ciphertext - */ - public function encrypt($plaintext) - { - if ($this->paddable) { - $plaintext = $this->pad($plaintext); - } - - $this->setup(); - - if ($this->mode == self::MODE_GCM) { - $oldIV = $this->iv; - Strings::increment_str($this->iv); - $cipher = new static('ctr'); - $cipher->setKey($this->key); - $cipher->setIV($this->iv); - $ciphertext = $cipher->encrypt($plaintext); - - $s = $this->ghash( - self::nullPad128($this->aad) . - self::nullPad128($ciphertext) . - self::len64($this->aad) . - self::len64($ciphertext) - ); - $cipher->encryptIV = $this->iv = $this->encryptIV = $this->decryptIV = $oldIV; - $this->newtag = $cipher->encrypt($s); - return $ciphertext; - } - - if (isset($this->poly1305Key)) { - $cipher = clone $this; - unset($cipher->poly1305Key); - $this->usePoly1305 = false; - $ciphertext = $cipher->encrypt($plaintext); - $this->newtag = $this->poly1305($ciphertext); - return $ciphertext; - } - - if ($this->engine === self::ENGINE_OPENSSL) { - switch ($this->mode) { - case self::MODE_STREAM: - return openssl_encrypt($plaintext, $this->cipher_name_openssl, $this->key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING); - case self::MODE_ECB: - return openssl_encrypt($plaintext, $this->cipher_name_openssl, $this->key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING); - case self::MODE_CBC: - $result = openssl_encrypt($plaintext, $this->cipher_name_openssl, $this->key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $this->encryptIV); - if ($this->continuousBuffer) { - $this->encryptIV = substr($result, -$this->block_size); - } - return $result; - case self::MODE_CTR: - return $this->openssl_ctr_process($plaintext, $this->encryptIV, $this->enbuffer); - case self::MODE_CFB: - // cfb loosely routines inspired by openssl's: - // {@link http://cvs.openssl.org/fileview?f=openssl/crypto/modes/cfb128.c&v=1.3.2.2.2.1} - $ciphertext = ''; - if ($this->continuousBuffer) { - $iv = &$this->encryptIV; - $pos = &$this->enbuffer['pos']; - } else { - $iv = $this->encryptIV; - $pos = 0; - } - $len = strlen($plaintext); - $i = 0; - if ($pos) { - $orig_pos = $pos; - $max = $this->block_size - $pos; - if ($len >= $max) { - $i = $max; - $len -= $max; - $pos = 0; - } else { - $i = $len; - $pos += $len; - $len = 0; - } - // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $blocksize - $ciphertext = substr($iv, $orig_pos) ^ $plaintext; - $iv = substr_replace($iv, $ciphertext, $orig_pos, $i); - $plaintext = substr($plaintext, $i); - } - - $overflow = $len % $this->block_size; - - if ($overflow) { - $ciphertext .= openssl_encrypt(substr($plaintext, 0, -$overflow) . str_repeat("\0", $this->block_size), $this->cipher_name_openssl, $this->key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv); - $iv = Strings::pop($ciphertext, $this->block_size); - - $size = $len - $overflow; - $block = $iv ^ substr($plaintext, -$overflow); - $iv = substr_replace($iv, $block, 0, $overflow); - $ciphertext .= $block; - $pos = $overflow; - } elseif ($len) { - $ciphertext = openssl_encrypt($plaintext, $this->cipher_name_openssl, $this->key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv); - $iv = substr($ciphertext, -$this->block_size); - } - - return $ciphertext; - case self::MODE_CFB8: - $ciphertext = openssl_encrypt($plaintext, $this->cipher_name_openssl, $this->key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $this->encryptIV); - if ($this->continuousBuffer) { - if (($len = strlen($ciphertext)) >= $this->block_size) { - $this->encryptIV = substr($ciphertext, -$this->block_size); - } else { - $this->encryptIV = substr($this->encryptIV, $len - $this->block_size) . substr($ciphertext, -$len); - } - } - return $ciphertext; - case self::MODE_OFB8: - $ciphertext = ''; - $len = strlen($plaintext); - $iv = $this->encryptIV; - - for ($i = 0; $i < $len; ++$i) { - $xor = openssl_encrypt($iv, $this->cipher_name_openssl_ecb, $this->key, $this->openssl_options, $this->decryptIV); - $ciphertext .= $plaintext[$i] ^ $xor; - $iv = substr($iv, 1) . $xor[0]; - } - - if ($this->continuousBuffer) { - $this->encryptIV = $iv; - } - break; - case self::MODE_OFB: - return $this->openssl_ofb_process($plaintext, $this->encryptIV, $this->enbuffer); - } - } - - if ($this->engine === self::ENGINE_MCRYPT) { - set_error_handler(function () { - }); - if ($this->enchanged) { - mcrypt_generic_init($this->enmcrypt, $this->key, $this->getIV($this->encryptIV)); - $this->enchanged = false; - } - - // re: {@link http://phpseclib.sourceforge.net/cfb-demo.phps} - // using mcrypt's default handing of CFB the above would output two different things. using phpseclib's - // rewritten CFB implementation the above outputs the same thing twice. - if ($this->mode == self::MODE_CFB && $this->continuousBuffer) { - $block_size = $this->block_size; - $iv = &$this->encryptIV; - $pos = &$this->enbuffer['pos']; - $len = strlen($plaintext); - $ciphertext = ''; - $i = 0; - if ($pos) { - $orig_pos = $pos; - $max = $block_size - $pos; - if ($len >= $max) { - $i = $max; - $len -= $max; - $pos = 0; - } else { - $i = $len; - $pos += $len; - $len = 0; - } - $ciphertext = substr($iv, $orig_pos) ^ $plaintext; - $iv = substr_replace($iv, $ciphertext, $orig_pos, $i); - $this->enbuffer['enmcrypt_init'] = true; - } - if ($len >= $block_size) { - if ($this->enbuffer['enmcrypt_init'] === false || $len > $this->cfb_init_len) { - if ($this->enbuffer['enmcrypt_init'] === true) { - mcrypt_generic_init($this->enmcrypt, $this->key, $iv); - $this->enbuffer['enmcrypt_init'] = false; - } - $ciphertext .= mcrypt_generic($this->enmcrypt, substr($plaintext, $i, $len - $len % $block_size)); - $iv = substr($ciphertext, -$block_size); - $len %= $block_size; - } else { - while ($len >= $block_size) { - $iv = mcrypt_generic($this->ecb, $iv) ^ substr($plaintext, $i, $block_size); - $ciphertext .= $iv; - $len -= $block_size; - $i += $block_size; - } - } - } - - if ($len) { - $iv = mcrypt_generic($this->ecb, $iv); - $block = $iv ^ substr($plaintext, -$len); - $iv = substr_replace($iv, $block, 0, $len); - $ciphertext .= $block; - $pos = $len; - } - - restore_error_handler(); - - return $ciphertext; - } - - $ciphertext = mcrypt_generic($this->enmcrypt, $plaintext); - - if (!$this->continuousBuffer) { - mcrypt_generic_init($this->enmcrypt, $this->key, $this->getIV($this->encryptIV)); - } - - restore_error_handler(); - - return $ciphertext; - } - - if ($this->engine === self::ENGINE_EVAL) { - $inline = $this->inline_crypt; - return $inline('encrypt', $plaintext); - } - - $buffer = &$this->enbuffer; - $block_size = $this->block_size; - $ciphertext = ''; - switch ($this->mode) { - case self::MODE_ECB: - for ($i = 0; $i < strlen($plaintext); $i += $block_size) { - $ciphertext .= $this->encryptBlock(substr($plaintext, $i, $block_size)); - } - break; - case self::MODE_CBC: - $xor = $this->encryptIV; - for ($i = 0; $i < strlen($plaintext); $i += $block_size) { - $block = substr($plaintext, $i, $block_size); - $block = $this->encryptBlock($block ^ $xor); - $xor = $block; - $ciphertext .= $block; - } - if ($this->continuousBuffer) { - $this->encryptIV = $xor; - } - break; - case self::MODE_CTR: - $xor = $this->encryptIV; - if (strlen($buffer['ciphertext'])) { - for ($i = 0; $i < strlen($plaintext); $i += $block_size) { - $block = substr($plaintext, $i, $block_size); - if (strlen($block) > strlen($buffer['ciphertext'])) { - $buffer['ciphertext'] .= $this->encryptBlock($xor); - Strings::increment_str($xor); - } - $key = Strings::shift($buffer['ciphertext'], $block_size); - $ciphertext .= $block ^ $key; - } - } else { - for ($i = 0; $i < strlen($plaintext); $i += $block_size) { - $block = substr($plaintext, $i, $block_size); - $key = $this->encryptBlock($xor); - Strings::increment_str($xor); - $ciphertext .= $block ^ $key; - } - } - if ($this->continuousBuffer) { - $this->encryptIV = $xor; - if ($start = strlen($plaintext) % $block_size) { - $buffer['ciphertext'] = substr($key, $start) . $buffer['ciphertext']; - } - } - break; - case self::MODE_CFB: - // cfb loosely routines inspired by openssl's: - // {@link http://cvs.openssl.org/fileview?f=openssl/crypto/modes/cfb128.c&v=1.3.2.2.2.1} - if ($this->continuousBuffer) { - $iv = &$this->encryptIV; - $pos = &$buffer['pos']; - } else { - $iv = $this->encryptIV; - $pos = 0; - } - $len = strlen($plaintext); - $i = 0; - if ($pos) { - $orig_pos = $pos; - $max = $block_size - $pos; - if ($len >= $max) { - $i = $max; - $len -= $max; - $pos = 0; - } else { - $i = $len; - $pos += $len; - $len = 0; - } - // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $blocksize - $ciphertext = substr($iv, $orig_pos) ^ $plaintext; - $iv = substr_replace($iv, $ciphertext, $orig_pos, $i); - } - while ($len >= $block_size) { - $iv = $this->encryptBlock($iv) ^ substr($plaintext, $i, $block_size); - $ciphertext .= $iv; - $len -= $block_size; - $i += $block_size; - } - if ($len) { - $iv = $this->encryptBlock($iv); - $block = $iv ^ substr($plaintext, $i); - $iv = substr_replace($iv, $block, 0, $len); - $ciphertext .= $block; - $pos = $len; - } - break; - case self::MODE_CFB8: - $ciphertext = ''; - $len = strlen($plaintext); - $iv = $this->encryptIV; - - for ($i = 0; $i < $len; ++$i) { - $ciphertext .= ($c = $plaintext[$i] ^ $this->encryptBlock($iv)); - $iv = substr($iv, 1) . $c; - } - - if ($this->continuousBuffer) { - if ($len >= $block_size) { - $this->encryptIV = substr($ciphertext, -$block_size); - } else { - $this->encryptIV = substr($this->encryptIV, $len - $block_size) . substr($ciphertext, -$len); - } - } - break; - case self::MODE_OFB8: - $ciphertext = ''; - $len = strlen($plaintext); - $iv = $this->encryptIV; - - for ($i = 0; $i < $len; ++$i) { - $xor = $this->encryptBlock($iv); - $ciphertext .= $plaintext[$i] ^ $xor; - $iv = substr($iv, 1) . $xor[0]; - } - - if ($this->continuousBuffer) { - $this->encryptIV = $iv; - } - break; - case self::MODE_OFB: - $xor = $this->encryptIV; - if (strlen($buffer['xor'])) { - for ($i = 0; $i < strlen($plaintext); $i += $block_size) { - $block = substr($plaintext, $i, $block_size); - if (strlen($block) > strlen($buffer['xor'])) { - $xor = $this->encryptBlock($xor); - $buffer['xor'] .= $xor; - } - $key = Strings::shift($buffer['xor'], $block_size); - $ciphertext .= $block ^ $key; - } - } else { - for ($i = 0; $i < strlen($plaintext); $i += $block_size) { - $xor = $this->encryptBlock($xor); - $ciphertext .= substr($plaintext, $i, $block_size) ^ $xor; - } - $key = $xor; - } - if ($this->continuousBuffer) { - $this->encryptIV = $xor; - if ($start = strlen($plaintext) % $block_size) { - $buffer['xor'] = substr($key, $start) . $buffer['xor']; - } - } - break; - case self::MODE_STREAM: - $ciphertext = $this->encryptBlock($plaintext); - break; - } - - return $ciphertext; - } - - /** - * Decrypts a message. - * - * If strlen($ciphertext) is not a multiple of the block size, null bytes will be added to the end of the string until - * it is. - * - * {@internal Could, but not must, extend by the child Crypt_* class} - * - * @see self::encrypt() - * @param string $ciphertext - * @return string $plaintext - * @throws \LengthException if we're inside a block cipher and the ciphertext length is not a multiple of the block size - */ - public function decrypt($ciphertext) - { - if ($this->paddable && strlen($ciphertext) % $this->block_size) { - throw new \LengthException('The ciphertext length (' . strlen($ciphertext) . ') needs to be a multiple of the block size (' . $this->block_size . ')'); - } - $this->setup(); - - if ($this->mode == self::MODE_GCM || isset($this->poly1305Key)) { - if ($this->oldtag === false) { - throw new InsufficientSetupException('Authentication Tag has not been set'); - } - - if (isset($this->poly1305Key)) { - $newtag = $this->poly1305($ciphertext); - } else { - $oldIV = $this->iv; - Strings::increment_str($this->iv); - $cipher = new static('ctr'); - $cipher->setKey($this->key); - $cipher->setIV($this->iv); - $plaintext = $cipher->decrypt($ciphertext); - - $s = $this->ghash( - self::nullPad128($this->aad) . - self::nullPad128($ciphertext) . - self::len64($this->aad) . - self::len64($ciphertext) - ); - $cipher->encryptIV = $this->iv = $this->encryptIV = $this->decryptIV = $oldIV; - $newtag = $cipher->encrypt($s); - } - if ($this->oldtag != substr($newtag, 0, strlen($newtag))) { - $cipher = clone $this; - unset($cipher->poly1305Key); - $this->usePoly1305 = false; - $plaintext = $cipher->decrypt($ciphertext); - $this->oldtag = false; - throw new BadDecryptionException('Derived authentication tag and supplied authentication tag do not match'); - } - $this->oldtag = false; - return $plaintext; - } - - if ($this->engine === self::ENGINE_OPENSSL) { - switch ($this->mode) { - case self::MODE_STREAM: - $plaintext = openssl_decrypt($ciphertext, $this->cipher_name_openssl, $this->key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING); - break; - case self::MODE_ECB: - $plaintext = openssl_decrypt($ciphertext, $this->cipher_name_openssl, $this->key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING); - break; - case self::MODE_CBC: - $offset = $this->block_size; - $plaintext = openssl_decrypt($ciphertext, $this->cipher_name_openssl, $this->key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $this->decryptIV); - if ($this->continuousBuffer) { - $this->decryptIV = substr($ciphertext, -$offset, $this->block_size); - } - break; - case self::MODE_CTR: - $plaintext = $this->openssl_ctr_process($ciphertext, $this->decryptIV, $this->debuffer); - break; - case self::MODE_CFB: - // cfb loosely routines inspired by openssl's: - // {@link http://cvs.openssl.org/fileview?f=openssl/crypto/modes/cfb128.c&v=1.3.2.2.2.1} - $plaintext = ''; - if ($this->continuousBuffer) { - $iv = &$this->decryptIV; - $pos = &$this->debuffer['pos']; - } else { - $iv = $this->decryptIV; - $pos = 0; - } - $len = strlen($ciphertext); - $i = 0; - if ($pos) { - $orig_pos = $pos; - $max = $this->block_size - $pos; - if ($len >= $max) { - $i = $max; - $len -= $max; - $pos = 0; - } else { - $i = $len; - $pos += $len; - $len = 0; - } - // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $this->blocksize - $plaintext = substr($iv, $orig_pos) ^ $ciphertext; - $iv = substr_replace($iv, substr($ciphertext, 0, $i), $orig_pos, $i); - $ciphertext = substr($ciphertext, $i); - } - $overflow = $len % $this->block_size; - if ($overflow) { - $plaintext .= openssl_decrypt(substr($ciphertext, 0, -$overflow), $this->cipher_name_openssl, $this->key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv); - if ($len - $overflow) { - $iv = substr($ciphertext, -$overflow - $this->block_size, -$overflow); - } - $iv = openssl_encrypt(str_repeat("\0", $this->block_size), $this->cipher_name_openssl, $this->key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv); - $plaintext .= $iv ^ substr($ciphertext, -$overflow); - $iv = substr_replace($iv, substr($ciphertext, -$overflow), 0, $overflow); - $pos = $overflow; - } elseif ($len) { - $plaintext .= openssl_decrypt($ciphertext, $this->cipher_name_openssl, $this->key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $iv); - $iv = substr($ciphertext, -$this->block_size); - } - break; - case self::MODE_CFB8: - $plaintext = openssl_decrypt($ciphertext, $this->cipher_name_openssl, $this->key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $this->decryptIV); - if ($this->continuousBuffer) { - if (($len = strlen($ciphertext)) >= $this->block_size) { - $this->decryptIV = substr($ciphertext, -$this->block_size); - } else { - $this->decryptIV = substr($this->decryptIV, $len - $this->block_size) . substr($ciphertext, -$len); - } - } - break; - case self::MODE_OFB8: - $plaintext = ''; - $len = strlen($ciphertext); - $iv = $this->decryptIV; - - for ($i = 0; $i < $len; ++$i) { - $xor = openssl_encrypt($iv, $this->cipher_name_openssl_ecb, $this->key, $this->openssl_options, $this->decryptIV); - $plaintext .= $ciphertext[$i] ^ $xor; - $iv = substr($iv, 1) . $xor[0]; - } - - if ($this->continuousBuffer) { - $this->decryptIV = $iv; - } - break; - case self::MODE_OFB: - $plaintext = $this->openssl_ofb_process($ciphertext, $this->decryptIV, $this->debuffer); - } - - return $this->paddable ? $this->unpad($plaintext) : $plaintext; - } - - if ($this->engine === self::ENGINE_MCRYPT) { - set_error_handler(function () { - }); - $block_size = $this->block_size; - if ($this->dechanged) { - mcrypt_generic_init($this->demcrypt, $this->key, $this->getIV($this->decryptIV)); - $this->dechanged = false; - } - - if ($this->mode == self::MODE_CFB && $this->continuousBuffer) { - $iv = &$this->decryptIV; - $pos = &$this->debuffer['pos']; - $len = strlen($ciphertext); - $plaintext = ''; - $i = 0; - if ($pos) { - $orig_pos = $pos; - $max = $block_size - $pos; - if ($len >= $max) { - $i = $max; - $len -= $max; - $pos = 0; - } else { - $i = $len; - $pos += $len; - $len = 0; - } - // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $blocksize - $plaintext = substr($iv, $orig_pos) ^ $ciphertext; - $iv = substr_replace($iv, substr($ciphertext, 0, $i), $orig_pos, $i); - } - if ($len >= $block_size) { - $cb = substr($ciphertext, $i, $len - $len % $block_size); - $plaintext .= mcrypt_generic($this->ecb, $iv . $cb) ^ $cb; - $iv = substr($cb, -$block_size); - $len %= $block_size; - } - if ($len) { - $iv = mcrypt_generic($this->ecb, $iv); - $plaintext .= $iv ^ substr($ciphertext, -$len); - $iv = substr_replace($iv, substr($ciphertext, -$len), 0, $len); - $pos = $len; - } - - restore_error_handler(); - - return $plaintext; - } - - $plaintext = mdecrypt_generic($this->demcrypt, $ciphertext); - - if (!$this->continuousBuffer) { - mcrypt_generic_init($this->demcrypt, $this->key, $this->getIV($this->decryptIV)); - } - - restore_error_handler(); - - return $this->paddable ? $this->unpad($plaintext) : $plaintext; - } - - if ($this->engine === self::ENGINE_EVAL) { - $inline = $this->inline_crypt; - return $inline('decrypt', $ciphertext); - } - - $block_size = $this->block_size; - - $buffer = &$this->debuffer; - $plaintext = ''; - switch ($this->mode) { - case self::MODE_ECB: - for ($i = 0; $i < strlen($ciphertext); $i += $block_size) { - $plaintext .= $this->decryptBlock(substr($ciphertext, $i, $block_size)); - } - break; - case self::MODE_CBC: - $xor = $this->decryptIV; - for ($i = 0; $i < strlen($ciphertext); $i += $block_size) { - $block = substr($ciphertext, $i, $block_size); - $plaintext .= $this->decryptBlock($block) ^ $xor; - $xor = $block; - } - if ($this->continuousBuffer) { - $this->decryptIV = $xor; - } - break; - case self::MODE_CTR: - $xor = $this->decryptIV; - if (strlen($buffer['ciphertext'])) { - for ($i = 0; $i < strlen($ciphertext); $i += $block_size) { - $block = substr($ciphertext, $i, $block_size); - if (strlen($block) > strlen($buffer['ciphertext'])) { - $buffer['ciphertext'] .= $this->encryptBlock($xor); - Strings::increment_str($xor); - } - $key = Strings::shift($buffer['ciphertext'], $block_size); - $plaintext .= $block ^ $key; - } - } else { - for ($i = 0; $i < strlen($ciphertext); $i += $block_size) { - $block = substr($ciphertext, $i, $block_size); - $key = $this->encryptBlock($xor); - Strings::increment_str($xor); - $plaintext .= $block ^ $key; - } - } - if ($this->continuousBuffer) { - $this->decryptIV = $xor; - if ($start = strlen($ciphertext) % $block_size) { - $buffer['ciphertext'] = substr($key, $start) . $buffer['ciphertext']; - } - } - break; - case self::MODE_CFB: - if ($this->continuousBuffer) { - $iv = &$this->decryptIV; - $pos = &$buffer['pos']; - } else { - $iv = $this->decryptIV; - $pos = 0; - } - $len = strlen($ciphertext); - $i = 0; - if ($pos) { - $orig_pos = $pos; - $max = $block_size - $pos; - if ($len >= $max) { - $i = $max; - $len -= $max; - $pos = 0; - } else { - $i = $len; - $pos += $len; - $len = 0; - } - // ie. $i = min($max, $len), $len-= $i, $pos+= $i, $pos%= $blocksize - $plaintext = substr($iv, $orig_pos) ^ $ciphertext; - $iv = substr_replace($iv, substr($ciphertext, 0, $i), $orig_pos, $i); - } - while ($len >= $block_size) { - $iv = $this->encryptBlock($iv); - $cb = substr($ciphertext, $i, $block_size); - $plaintext .= $iv ^ $cb; - $iv = $cb; - $len -= $block_size; - $i += $block_size; - } - if ($len) { - $iv = $this->encryptBlock($iv); - $plaintext .= $iv ^ substr($ciphertext, $i); - $iv = substr_replace($iv, substr($ciphertext, $i), 0, $len); - $pos = $len; - } - break; - case self::MODE_CFB8: - $plaintext = ''; - $len = strlen($ciphertext); - $iv = $this->decryptIV; - - for ($i = 0; $i < $len; ++$i) { - $plaintext .= $ciphertext[$i] ^ $this->encryptBlock($iv); - $iv = substr($iv, 1) . $ciphertext[$i]; - } - - if ($this->continuousBuffer) { - if ($len >= $block_size) { - $this->decryptIV = substr($ciphertext, -$block_size); - } else { - $this->decryptIV = substr($this->decryptIV, $len - $block_size) . substr($ciphertext, -$len); - } - } - break; - case self::MODE_OFB8: - $plaintext = ''; - $len = strlen($ciphertext); - $iv = $this->decryptIV; - - for ($i = 0; $i < $len; ++$i) { - $xor = $this->encryptBlock($iv); - $plaintext .= $ciphertext[$i] ^ $xor; - $iv = substr($iv, 1) . $xor[0]; - } - - if ($this->continuousBuffer) { - $this->decryptIV = $iv; - } - break; - case self::MODE_OFB: - $xor = $this->decryptIV; - if (strlen($buffer['xor'])) { - for ($i = 0; $i < strlen($ciphertext); $i += $block_size) { - $block = substr($ciphertext, $i, $block_size); - if (strlen($block) > strlen($buffer['xor'])) { - $xor = $this->encryptBlock($xor); - $buffer['xor'] .= $xor; - } - $key = Strings::shift($buffer['xor'], $block_size); - $plaintext .= $block ^ $key; - } - } else { - for ($i = 0; $i < strlen($ciphertext); $i += $block_size) { - $xor = $this->encryptBlock($xor); - $plaintext .= substr($ciphertext, $i, $block_size) ^ $xor; - } - $key = $xor; - } - if ($this->continuousBuffer) { - $this->decryptIV = $xor; - if ($start = strlen($ciphertext) % $block_size) { - $buffer['xor'] = substr($key, $start) . $buffer['xor']; - } - } - break; - case self::MODE_STREAM: - $plaintext = $this->decryptBlock($ciphertext); - break; - } - return $this->paddable ? $this->unpad($plaintext) : $plaintext; - } - - /** - * Get the authentication tag - * - * Only used in GCM or Poly1305 mode - * - * @see self::encrypt() - * @param int $length optional - * @return string - * @throws \LengthException if $length isn't of a sufficient length - * @throws \RuntimeException if GCM mode isn't being used - */ - public function getTag($length = 16) - { - if ($this->mode != self::MODE_GCM && !$this->usePoly1305) { - throw new \BadMethodCallException('Authentication tags are only utilized in GCM mode or with Poly1305'); - } - - if ($this->newtag === false) { - throw new \BadMethodCallException('A tag can only be returned after a round of encryption has been performed'); - } - - // the tag is 128-bits. it can't be greater than 16 bytes because that's bigger than the tag is. if it - // were 0 you might as well be doing CTR and less than 4 provides minimal security that could be trivially - // easily brute forced. - // see https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38d.pdf#page=36 - // for more info - if ($length < 4 || $length > 16) { - throw new \LengthException('The authentication tag must be between 4 and 16 bytes long'); - } - - return $length == 16 ? - $this->newtag : - substr($this->newtag, 0, $length); - } - - /** - * Sets the authentication tag - * - * Only used in GCM mode - * - * @see self::decrypt() - * @param string $tag - * @throws \LengthException if $length isn't of a sufficient length - * @throws \RuntimeException if GCM mode isn't being used - */ - public function setTag($tag) - { - if ($this->usePoly1305 && !isset($this->poly1305Key) && method_exists($this, 'createPoly1305Key')) { - $this->createPoly1305Key(); - } - - if ($this->mode != self::MODE_GCM && !$this->usePoly1305) { - throw new \BadMethodCallException('Authentication tags are only utilized in GCM mode or with Poly1305'); - } - - $length = strlen($tag); - if ($length < 4 || $length > 16) { - throw new \LengthException('The authentication tag must be between 4 and 16 bytes long'); - } - $this->oldtag = $tag; - } - - /** - * Get the IV - * - * mcrypt requires an IV even if ECB is used - * - * @see self::encrypt() - * @see self::decrypt() - * @param string $iv - * @return string - */ - protected function getIV($iv) - { - return $this->mode == self::MODE_ECB ? str_repeat("\0", $this->block_size) : $iv; - } - - /** - * OpenSSL CTR Processor - * - * PHP's OpenSSL bindings do not operate in continuous mode so we'll wrap around it. Since the keystream - * for CTR is the same for both encrypting and decrypting this function is re-used by both SymmetricKey::encrypt() - * and SymmetricKey::decrypt(). Also, OpenSSL doesn't implement CTR for all of it's symmetric ciphers so this - * function will emulate CTR with ECB when necessary. - * - * @see self::encrypt() - * @see self::decrypt() - * @param string $plaintext - * @param string $encryptIV - * @param array $buffer - * @return string - */ - private function openssl_ctr_process($plaintext, &$encryptIV, &$buffer) - { - $ciphertext = ''; - - $block_size = $this->block_size; - $key = $this->key; - - if ($this->openssl_emulate_ctr) { - $xor = $encryptIV; - if (strlen($buffer['ciphertext'])) { - for ($i = 0; $i < strlen($plaintext); $i += $block_size) { - $block = substr($plaintext, $i, $block_size); - if (strlen($block) > strlen($buffer['ciphertext'])) { - $buffer['ciphertext'] .= openssl_encrypt($xor, $this->cipher_name_openssl_ecb, $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING); - } - Strings::increment_str($xor); - $otp = Strings::shift($buffer['ciphertext'], $block_size); - $ciphertext .= $block ^ $otp; - } - } else { - for ($i = 0; $i < strlen($plaintext); $i += $block_size) { - $block = substr($plaintext, $i, $block_size); - $otp = openssl_encrypt($xor, $this->cipher_name_openssl_ecb, $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING); - Strings::increment_str($xor); - $ciphertext .= $block ^ $otp; - } - } - if ($this->continuousBuffer) { - $encryptIV = $xor; - if ($start = strlen($plaintext) % $block_size) { - $buffer['ciphertext'] = substr($key, $start) . $buffer['ciphertext']; - } - } - - return $ciphertext; - } - - if (strlen($buffer['ciphertext'])) { - $ciphertext = $plaintext ^ Strings::shift($buffer['ciphertext'], strlen($plaintext)); - $plaintext = substr($plaintext, strlen($ciphertext)); - - if (!strlen($plaintext)) { - return $ciphertext; - } - } - - $overflow = strlen($plaintext) % $block_size; - if ($overflow) { - $plaintext2 = Strings::pop($plaintext, $overflow); // ie. trim $plaintext to a multiple of $block_size and put rest of $plaintext in $plaintext2 - $encrypted = openssl_encrypt($plaintext . str_repeat("\0", $block_size), $this->cipher_name_openssl, $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $encryptIV); - $temp = Strings::pop($encrypted, $block_size); - $ciphertext .= $encrypted . ($plaintext2 ^ $temp); - if ($this->continuousBuffer) { - $buffer['ciphertext'] = substr($temp, $overflow); - $encryptIV = $temp; - } - } elseif (!strlen($buffer['ciphertext'])) { - $ciphertext .= openssl_encrypt($plaintext . str_repeat("\0", $block_size), $this->cipher_name_openssl, $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $encryptIV); - $temp = Strings::pop($ciphertext, $block_size); - if ($this->continuousBuffer) { - $encryptIV = $temp; - } - } - if ($this->continuousBuffer) { - $encryptIV = openssl_decrypt($encryptIV, $this->cipher_name_openssl_ecb, $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING); - if ($overflow) { - Strings::increment_str($encryptIV); - } - } - - return $ciphertext; - } - - /** - * OpenSSL OFB Processor - * - * PHP's OpenSSL bindings do not operate in continuous mode so we'll wrap around it. Since the keystream - * for OFB is the same for both encrypting and decrypting this function is re-used by both SymmetricKey::encrypt() - * and SymmetricKey::decrypt(). - * - * @see self::encrypt() - * @see self::decrypt() - * @param string $plaintext - * @param string $encryptIV - * @param array $buffer - * @return string - */ - private function openssl_ofb_process($plaintext, &$encryptIV, &$buffer) - { - if (strlen($buffer['xor'])) { - $ciphertext = $plaintext ^ $buffer['xor']; - $buffer['xor'] = substr($buffer['xor'], strlen($ciphertext)); - $plaintext = substr($plaintext, strlen($ciphertext)); - } else { - $ciphertext = ''; - } - - $block_size = $this->block_size; - - $len = strlen($plaintext); - $key = $this->key; - $overflow = $len % $block_size; - - if (strlen($plaintext)) { - if ($overflow) { - $ciphertext .= openssl_encrypt(substr($plaintext, 0, -$overflow) . str_repeat("\0", $block_size), $this->cipher_name_openssl, $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $encryptIV); - $xor = Strings::pop($ciphertext, $block_size); - if ($this->continuousBuffer) { - $encryptIV = $xor; - } - $ciphertext .= Strings::shift($xor, $overflow) ^ substr($plaintext, -$overflow); - if ($this->continuousBuffer) { - $buffer['xor'] = $xor; - } - } else { - $ciphertext = openssl_encrypt($plaintext, $this->cipher_name_openssl, $key, OPENSSL_RAW_DATA | OPENSSL_ZERO_PADDING, $encryptIV); - if ($this->continuousBuffer) { - $encryptIV = substr($ciphertext, -$block_size) ^ substr($plaintext, -$block_size); - } - } - } - - return $ciphertext; - } - - /** - * phpseclib <-> OpenSSL Mode Mapper - * - * May need to be overwritten by classes extending this one in some cases - * - * @return string - */ - protected function openssl_translate_mode() - { - switch ($this->mode) { - case self::MODE_ECB: - return 'ecb'; - case self::MODE_CBC: - return 'cbc'; - case self::MODE_CTR: - case self::MODE_GCM: - return 'ctr'; - case self::MODE_CFB: - return 'cfb'; - case self::MODE_CFB8: - return 'cfb8'; - case self::MODE_OFB: - return 'ofb'; - } - } - - /** - * Pad "packets". - * - * Block ciphers working by encrypting between their specified [$this->]block_size at a time - * If you ever need to encrypt or decrypt something that isn't of the proper length, it becomes necessary to - * pad the input so that it is of the proper length. - * - * Padding is enabled by default. Sometimes, however, it is undesirable to pad strings. Such is the case in SSH, - * where "packets" are padded with random bytes before being encrypted. Unpad these packets and you risk stripping - * away characters that shouldn't be stripped away. (SSH knows how many bytes are added because the length is - * transmitted separately) - * - * @see self::disablePadding() - */ - public function enablePadding() - { - $this->padding = true; - } - - /** - * Do not pad packets. - * - * @see self::enablePadding() - */ - public function disablePadding() - { - $this->padding = false; - } - - /** - * Treat consecutive "packets" as if they are a continuous buffer. - * - * Say you have a 32-byte plaintext $plaintext. Using the default behavior, the two following code snippets - * will yield different outputs: - * - * - * echo $rijndael->encrypt(substr($plaintext, 0, 16)); - * echo $rijndael->encrypt(substr($plaintext, 16, 16)); - * - * - * echo $rijndael->encrypt($plaintext); - * - * - * The solution is to enable the continuous buffer. Although this will resolve the above discrepancy, it creates - * another, as demonstrated with the following: - * - * - * $rijndael->encrypt(substr($plaintext, 0, 16)); - * echo $rijndael->decrypt($rijndael->encrypt(substr($plaintext, 16, 16))); - * - * - * echo $rijndael->decrypt($rijndael->encrypt(substr($plaintext, 16, 16))); - * - * - * With the continuous buffer disabled, these would yield the same output. With it enabled, they yield different - * outputs. The reason is due to the fact that the initialization vector's change after every encryption / - * decryption round when the continuous buffer is enabled. When it's disabled, they remain constant. - * - * Put another way, when the continuous buffer is enabled, the state of the \phpseclib3\Crypt\*() object changes after each - * encryption / decryption round, whereas otherwise, it'd remain constant. For this reason, it's recommended that - * continuous buffers not be used. They do offer better security and are, in fact, sometimes required (SSH uses them), - * however, they are also less intuitive and more likely to cause you problems. - * - * {@internal Could, but not must, extend by the child Crypt_* class} - * - * @see self::disableContinuousBuffer() - */ - public function enableContinuousBuffer() - { - if ($this->mode == self::MODE_ECB) { - return; - } - - if ($this->mode == self::MODE_GCM) { - throw new \BadMethodCallException('This mode does not run in continuous mode'); - } - - $this->continuousBuffer = true; - - $this->setEngine(); - } - - /** - * Treat consecutive packets as if they are a discontinuous buffer. - * - * The default behavior. - * - * {@internal Could, but not must, extend by the child Crypt_* class} - * - * @see self::enableContinuousBuffer() - */ - public function disableContinuousBuffer() - { - if ($this->mode == self::MODE_ECB) { - return; - } - if (!$this->continuousBuffer) { - return; - } - - $this->continuousBuffer = false; - - $this->setEngine(); - } - - /** - * Test for engine validity - * - * @see self::__construct() - * @param int $engine - * @return bool - */ - protected function isValidEngineHelper($engine) - { - switch ($engine) { - case self::ENGINE_OPENSSL: - $this->openssl_emulate_ctr = false; - $result = $this->cipher_name_openssl && - extension_loaded('openssl'); - if (!$result) { - return false; - } - - $methods = openssl_get_cipher_methods(); - if (in_array($this->cipher_name_openssl, $methods)) { - return true; - } - // not all of openssl's symmetric cipher's support ctr. for those - // that don't we'll emulate it - switch ($this->mode) { - case self::MODE_CTR: - if (in_array($this->cipher_name_openssl_ecb, $methods)) { - $this->openssl_emulate_ctr = true; - return true; - } - } - return false; - case self::ENGINE_MCRYPT: - set_error_handler(function () { - }); - $result = $this->cipher_name_mcrypt && - extension_loaded('mcrypt') && - in_array($this->cipher_name_mcrypt, mcrypt_list_algorithms()); - restore_error_handler(); - return $result; - case self::ENGINE_EVAL: - return method_exists($this, 'setupInlineCrypt'); - case self::ENGINE_INTERNAL: - return true; - } - - return false; - } - - /** - * Test for engine validity - * - * @see self::__construct() - * @param string $engine - * @return bool - */ - public function isValidEngine($engine) - { - static $reverseMap; - if (!isset($reverseMap)) { - $reverseMap = array_map('strtolower', self::ENGINE_MAP); - $reverseMap = array_flip($reverseMap); - } - $engine = strtolower($engine); - if (!isset($reverseMap[$engine])) { - return false; - } - - return $this->isValidEngineHelper($reverseMap[$engine]); - } - - /** - * Sets the preferred crypt engine - * - * Currently, $engine could be: - * - * - libsodium[very fast] - * - * - OpenSSL [very fast] - * - * - mcrypt [fast] - * - * - Eval [slow] - * - * - PHP [slowest] - * - * If the preferred crypt engine is not available the fastest available one will be used - * - * @see self::__construct() - * @param string $engine - */ - public function setPreferredEngine($engine) - { - static $reverseMap; - if (!isset($reverseMap)) { - $reverseMap = array_map('strtolower', self::ENGINE_MAP); - $reverseMap = array_flip($reverseMap); - } - $engine = is_string($engine) ? strtolower($engine) : ''; - $this->preferredEngine = isset($reverseMap[$engine]) ? $reverseMap[$engine] : self::ENGINE_LIBSODIUM; - - $this->setEngine(); - } - - /** - * Returns the engine currently being utilized - * - * @see self::setEngine() - */ - public function getEngine() - { - return self::ENGINE_MAP[$this->engine]; - } - - /** - * Sets the engine as appropriate - * - * @see self::__construct() - */ - protected function setEngine() - { - $this->engine = null; - - $candidateEngines = [ - self::ENGINE_LIBSODIUM, - self::ENGINE_OPENSSL_GCM, - self::ENGINE_OPENSSL, - self::ENGINE_MCRYPT, - self::ENGINE_EVAL - ]; - if (isset($this->preferredEngine)) { - $temp = [$this->preferredEngine]; - $candidateEngines = array_merge( - $temp, - array_diff($candidateEngines, $temp) - ); - } - foreach ($candidateEngines as $engine) { - if ($this->isValidEngineHelper($engine)) { - $this->engine = $engine; - break; - } - } - if (!$this->engine) { - $this->engine = self::ENGINE_INTERNAL; - } - - if ($this->engine != self::ENGINE_MCRYPT && $this->enmcrypt) { - set_error_handler(function () { - }); - // Closing the current mcrypt resource(s). _mcryptSetup() will, if needed, - // (re)open them with the module named in $this->cipher_name_mcrypt - mcrypt_module_close($this->enmcrypt); - mcrypt_module_close($this->demcrypt); - $this->enmcrypt = null; - $this->demcrypt = null; - - if ($this->ecb) { - mcrypt_module_close($this->ecb); - $this->ecb = null; - } - restore_error_handler(); - } - - $this->changed = $this->nonIVChanged = true; - } - - /** - * Encrypts a block - * - * Note: Must be extended by the child \phpseclib3\Crypt\* class - * - * @param string $in - * @return string - */ - abstract protected function encryptBlock($in); - - /** - * Decrypts a block - * - * Note: Must be extended by the child \phpseclib3\Crypt\* class - * - * @param string $in - * @return string - */ - abstract protected function decryptBlock($in); - - /** - * Setup the key (expansion) - * - * Only used if $engine == self::ENGINE_INTERNAL - * - * Note: Must extend by the child \phpseclib3\Crypt\* class - * - * @see self::setup() - */ - abstract protected function setupKey(); - - /** - * Setup the self::ENGINE_INTERNAL $engine - * - * (re)init, if necessary, the internal cipher $engine and flush all $buffers - * Used (only) if $engine == self::ENGINE_INTERNAL - * - * _setup() will be called each time if $changed === true - * typically this happens when using one or more of following public methods: - * - * - setKey() - * - * - setIV() - * - * - disableContinuousBuffer() - * - * - First run of encrypt() / decrypt() with no init-settings - * - * {@internal setup() is always called before en/decryption.} - * - * {@internal Could, but not must, extend by the child Crypt_* class} - * - * @see self::setKey() - * @see self::setIV() - * @see self::disableContinuousBuffer() - */ - protected function setup() - { - if (!$this->changed) { - return; - } - - $this->changed = false; - - if ($this->usePoly1305 && !isset($this->poly1305Key) && method_exists($this, 'createPoly1305Key')) { - $this->createPoly1305Key(); - } - - $this->enbuffer = $this->debuffer = ['ciphertext' => '', 'xor' => '', 'pos' => 0, 'enmcrypt_init' => true]; - //$this->newtag = $this->oldtag = false; - - if ($this->usesNonce()) { - if ($this->nonce === false) { - throw new InsufficientSetupException('No nonce has been defined'); - } - if ($this->mode == self::MODE_GCM && !in_array($this->engine, [self::ENGINE_LIBSODIUM, self::ENGINE_OPENSSL_GCM])) { - $this->setupGCM(); - } - } else { - $this->iv = $this->origIV; - } - - if ($this->iv === false && !in_array($this->mode, [self::MODE_STREAM, self::MODE_ECB])) { - if ($this->mode != self::MODE_GCM || !in_array($this->engine, [self::ENGINE_LIBSODIUM, self::ENGINE_OPENSSL_GCM])) { - throw new InsufficientSetupException('No IV has been defined'); - } - } - - if ($this->key === false) { - throw new InsufficientSetupException('No key has been defined'); - } - - $this->encryptIV = $this->decryptIV = $this->iv; - - switch ($this->engine) { - case self::ENGINE_MCRYPT: - $this->enchanged = $this->dechanged = true; - - set_error_handler(function () { - }); - - if (!isset($this->enmcrypt)) { - static $mcrypt_modes = [ - self::MODE_CTR => 'ctr', - self::MODE_ECB => MCRYPT_MODE_ECB, - self::MODE_CBC => MCRYPT_MODE_CBC, - self::MODE_CFB => 'ncfb', - self::MODE_CFB8 => MCRYPT_MODE_CFB, - self::MODE_OFB => MCRYPT_MODE_NOFB, - self::MODE_OFB8 => MCRYPT_MODE_OFB, - self::MODE_STREAM => MCRYPT_MODE_STREAM, - ]; - - $this->demcrypt = mcrypt_module_open($this->cipher_name_mcrypt, '', $mcrypt_modes[$this->mode], ''); - $this->enmcrypt = mcrypt_module_open($this->cipher_name_mcrypt, '', $mcrypt_modes[$this->mode], ''); - - // we need the $ecb mcrypt resource (only) in MODE_CFB with enableContinuousBuffer() - // to workaround mcrypt's broken ncfb implementation in buffered mode - // see: {@link http://phpseclib.sourceforge.net/cfb-demo.phps} - if ($this->mode == self::MODE_CFB) { - $this->ecb = mcrypt_module_open($this->cipher_name_mcrypt, '', MCRYPT_MODE_ECB, ''); - } - } // else should mcrypt_generic_deinit be called? - - if ($this->mode == self::MODE_CFB) { - mcrypt_generic_init($this->ecb, $this->key, str_repeat("\0", $this->block_size)); - } - - restore_error_handler(); - - break; - case self::ENGINE_INTERNAL: - $this->setupKey(); - break; - case self::ENGINE_EVAL: - if ($this->nonIVChanged) { - $this->setupKey(); - $this->setupInlineCrypt(); - } - } - - $this->nonIVChanged = false; - } - - /** - * Pads a string - * - * Pads a string using the RSA PKCS padding standards so that its length is a multiple of the blocksize. - * $this->block_size - (strlen($text) % $this->block_size) bytes are added, each of which is equal to - * chr($this->block_size - (strlen($text) % $this->block_size) - * - * If padding is disabled and $text is not a multiple of the blocksize, the string will be padded regardless - * and padding will, hence forth, be enabled. - * - * @see self::unpad() - * @param string $text - * @throws \LengthException if padding is disabled and the plaintext's length is not a multiple of the block size - * @return string - */ - protected function pad($text) - { - $length = strlen($text); - - if (!$this->padding) { - if ($length % $this->block_size == 0) { - return $text; - } else { - throw new \LengthException("The plaintext's length ($length) is not a multiple of the block size ({$this->block_size}). Try enabling padding."); - } - } - - $pad = $this->block_size - ($length % $this->block_size); - - return str_pad($text, $length + $pad, chr($pad)); - } - - /** - * Unpads a string. - * - * If padding is enabled and the reported padding length is invalid the encryption key will be assumed to be wrong - * and false will be returned. - * - * @see self::pad() - * @param string $text - * @throws \LengthException if the ciphertext's length is not a multiple of the block size - * @return string - */ - protected function unpad($text) - { - if (!$this->padding) { - return $text; - } - - $length = ord($text[strlen($text) - 1]); - - if (!$length || $length > $this->block_size) { - throw new BadDecryptionException("The ciphertext has an invalid padding length ($length) compared to the block size ({$this->block_size})"); - } - - return substr($text, 0, -$length); - } - - /** - * Setup the performance-optimized function for de/encrypt() - * - * Stores the created (or existing) callback function-name - * in $this->inline_crypt - * - * Internally for phpseclib developers: - * - * _setupInlineCrypt() would be called only if: - * - * - $this->engine === self::ENGINE_EVAL - * - * - each time on _setup(), after(!) _setupKey() - * - * - * This ensures that _setupInlineCrypt() has always a - * full ready2go initializated internal cipher $engine state - * where, for example, the keys already expanded, - * keys/block_size calculated and such. - * - * It is, each time if called, the responsibility of _setupInlineCrypt(): - * - * - to set $this->inline_crypt to a valid and fully working callback function - * as a (faster) replacement for encrypt() / decrypt() - * - * - NOT to create unlimited callback functions (for memory reasons!) - * no matter how often _setupInlineCrypt() would be called. At some - * point of amount they must be generic re-useable. - * - * - the code of _setupInlineCrypt() it self, - * and the generated callback code, - * must be, in following order: - * - 100% safe - * - 100% compatible to encrypt()/decrypt() - * - using only php5+ features/lang-constructs/php-extensions if - * compatibility (down to php4) or fallback is provided - * - readable/maintainable/understandable/commented and... not-cryptic-styled-code :-) - * - >= 10% faster than encrypt()/decrypt() [which is, by the way, - * the reason for the existence of _setupInlineCrypt() :-)] - * - memory-nice - * - short (as good as possible) - * - * Note: - _setupInlineCrypt() is using _createInlineCryptFunction() to create the full callback function code. - * - In case of using inline crypting, _setupInlineCrypt() must extend by the child \phpseclib3\Crypt\* class. - * - The following variable names are reserved: - * - $_* (all variable names prefixed with an underscore) - * - $self (object reference to it self. Do not use $this, but $self instead) - * - $in (the content of $in has to en/decrypt by the generated code) - * - The callback function should not use the 'return' statement, but en/decrypt'ing the content of $in only - * - * {@internal If a Crypt_* class providing inline crypting it must extend _setupInlineCrypt()} - * - * @see self::setup() - * @see self::createInlineCryptFunction() - * @see self::encrypt() - * @see self::decrypt() - */ - //protected function setupInlineCrypt(); - - /** - * Creates the performance-optimized function for en/decrypt() - * - * Internally for phpseclib developers: - * - * _createInlineCryptFunction(): - * - * - merge the $cipher_code [setup'ed by _setupInlineCrypt()] - * with the current [$this->]mode of operation code - * - * - create the $inline function, which called by encrypt() / decrypt() - * as its replacement to speed up the en/decryption operations. - * - * - return the name of the created $inline callback function - * - * - used to speed up en/decryption - * - * - * - * The main reason why can speed up things [up to 50%] this way are: - * - * - using variables more effective then regular. - * (ie no use of expensive arrays but integers $k_0, $k_1 ... - * or even, for example, the pure $key[] values hardcoded) - * - * - avoiding 1000's of function calls of ie _encryptBlock() - * but inlining the crypt operations. - * in the mode of operation for() loop. - * - * - full loop unroll the (sometimes key-dependent) rounds - * avoiding this way ++$i counters and runtime-if's etc... - * - * The basic code architectur of the generated $inline en/decrypt() - * lambda function, in pseudo php, is: - * - * - * +----------------------------------------------------------------------------------------------+ - * | callback $inline = create_function: | - * | lambda_function_0001_crypt_ECB($action, $text) | - * | { | - * | INSERT PHP CODE OF: | - * | $cipher_code['init_crypt']; // general init code. | - * | // ie: $sbox'es declarations used for | - * | // encrypt and decrypt'ing. | - * | | - * | switch ($action) { | - * | case 'encrypt': | - * | INSERT PHP CODE OF: | - * | $cipher_code['init_encrypt']; // encrypt sepcific init code. | - * | ie: specified $key or $box | - * | declarations for encrypt'ing. | - * | | - * | foreach ($ciphertext) { | - * | $in = $block_size of $ciphertext; | - * | | - * | INSERT PHP CODE OF: | - * | $cipher_code['encrypt_block']; // encrypt's (string) $in, which is always: | - * | // strlen($in) == $this->block_size | - * | // here comes the cipher algorithm in action | - * | // for encryption. | - * | // $cipher_code['encrypt_block'] has to | - * | // encrypt the content of the $in variable | - * | | - * | $plaintext .= $in; | - * | } | - * | return $plaintext; | - * | | - * | case 'decrypt': | - * | INSERT PHP CODE OF: | - * | $cipher_code['init_decrypt']; // decrypt sepcific init code | - * | ie: specified $key or $box | - * | declarations for decrypt'ing. | - * | foreach ($plaintext) { | - * | $in = $block_size of $plaintext; | - * | | - * | INSERT PHP CODE OF: | - * | $cipher_code['decrypt_block']; // decrypt's (string) $in, which is always | - * | // strlen($in) == $this->block_size | - * | // here comes the cipher algorithm in action | - * | // for decryption. | - * | // $cipher_code['decrypt_block'] has to | - * | // decrypt the content of the $in variable | - * | $ciphertext .= $in; | - * | } | - * | return $ciphertext; | - * | } | - * | } | - * +----------------------------------------------------------------------------------------------+ - * - * - * See also the \phpseclib3\Crypt\*::_setupInlineCrypt()'s for - * productive inline $cipher_code's how they works. - * - * Structure of: - * - * $cipher_code = [ - * 'init_crypt' => (string) '', // optional - * 'init_encrypt' => (string) '', // optional - * 'init_decrypt' => (string) '', // optional - * 'encrypt_block' => (string) '', // required - * 'decrypt_block' => (string) '' // required - * ]; - * - * - * @see self::setupInlineCrypt() - * @see self::encrypt() - * @see self::decrypt() - * @param array $cipher_code - * @return string (the name of the created callback function) - */ - protected function createInlineCryptFunction($cipher_code) - { - $block_size = $this->block_size; - - // optional - $init_crypt = isset($cipher_code['init_crypt']) ? $cipher_code['init_crypt'] : ''; - $init_encrypt = isset($cipher_code['init_encrypt']) ? $cipher_code['init_encrypt'] : ''; - $init_decrypt = isset($cipher_code['init_decrypt']) ? $cipher_code['init_decrypt'] : ''; - // required - $encrypt_block = $cipher_code['encrypt_block']; - $decrypt_block = $cipher_code['decrypt_block']; - - // Generating mode of operation inline code, - // merged with the $cipher_code algorithm - // for encrypt- and decryption. - switch ($this->mode) { - case self::MODE_ECB: - $encrypt = $init_encrypt . ' - $_ciphertext = ""; - $_plaintext_len = strlen($_text); - - for ($_i = 0; $_i < $_plaintext_len; $_i+= ' . $block_size . ') { - $in = substr($_text, $_i, ' . $block_size . '); - ' . $encrypt_block . ' - $_ciphertext.= $in; - } - - return $_ciphertext; - '; - - $decrypt = $init_decrypt . ' - $_plaintext = ""; - $_text = str_pad($_text, strlen($_text) + (' . $block_size . ' - strlen($_text) % ' . $block_size . ') % ' . $block_size . ', chr(0)); - $_ciphertext_len = strlen($_text); - - for ($_i = 0; $_i < $_ciphertext_len; $_i+= ' . $block_size . ') { - $in = substr($_text, $_i, ' . $block_size . '); - ' . $decrypt_block . ' - $_plaintext.= $in; - } - - return $this->unpad($_plaintext); - '; - break; - case self::MODE_CTR: - $encrypt = $init_encrypt . ' - $_ciphertext = ""; - $_plaintext_len = strlen($_text); - $_xor = $this->encryptIV; - $_buffer = &$this->enbuffer; - if (strlen($_buffer["ciphertext"])) { - for ($_i = 0; $_i < $_plaintext_len; $_i+= ' . $block_size . ') { - $_block = substr($_text, $_i, ' . $block_size . '); - if (strlen($_block) > strlen($_buffer["ciphertext"])) { - $in = $_xor; - ' . $encrypt_block . ' - \phpseclib3\Common\Functions\Strings::increment_str($_xor); - $_buffer["ciphertext"].= $in; - } - $_key = \phpseclib3\Common\Functions\Strings::shift($_buffer["ciphertext"], ' . $block_size . '); - $_ciphertext.= $_block ^ $_key; - } - } else { - for ($_i = 0; $_i < $_plaintext_len; $_i+= ' . $block_size . ') { - $_block = substr($_text, $_i, ' . $block_size . '); - $in = $_xor; - ' . $encrypt_block . ' - \phpseclib3\Common\Functions\Strings::increment_str($_xor); - $_key = $in; - $_ciphertext.= $_block ^ $_key; - } - } - if ($this->continuousBuffer) { - $this->encryptIV = $_xor; - if ($_start = $_plaintext_len % ' . $block_size . ') { - $_buffer["ciphertext"] = substr($_key, $_start) . $_buffer["ciphertext"]; - } - } - - return $_ciphertext; - '; - - $decrypt = $init_encrypt . ' - $_plaintext = ""; - $_ciphertext_len = strlen($_text); - $_xor = $this->decryptIV; - $_buffer = &$this->debuffer; - - if (strlen($_buffer["ciphertext"])) { - for ($_i = 0; $_i < $_ciphertext_len; $_i+= ' . $block_size . ') { - $_block = substr($_text, $_i, ' . $block_size . '); - if (strlen($_block) > strlen($_buffer["ciphertext"])) { - $in = $_xor; - ' . $encrypt_block . ' - \phpseclib3\Common\Functions\Strings::increment_str($_xor); - $_buffer["ciphertext"].= $in; - } - $_key = \phpseclib3\Common\Functions\Strings::shift($_buffer["ciphertext"], ' . $block_size . '); - $_plaintext.= $_block ^ $_key; - } - } else { - for ($_i = 0; $_i < $_ciphertext_len; $_i+= ' . $block_size . ') { - $_block = substr($_text, $_i, ' . $block_size . '); - $in = $_xor; - ' . $encrypt_block . ' - \phpseclib3\Common\Functions\Strings::increment_str($_xor); - $_key = $in; - $_plaintext.= $_block ^ $_key; - } - } - if ($this->continuousBuffer) { - $this->decryptIV = $_xor; - if ($_start = $_ciphertext_len % ' . $block_size . ') { - $_buffer["ciphertext"] = substr($_key, $_start) . $_buffer["ciphertext"]; - } - } - - return $_plaintext; - '; - break; - case self::MODE_CFB: - $encrypt = $init_encrypt . ' - $_ciphertext = ""; - $_buffer = &$this->enbuffer; - - if ($this->continuousBuffer) { - $_iv = &$this->encryptIV; - $_pos = &$_buffer["pos"]; - } else { - $_iv = $this->encryptIV; - $_pos = 0; - } - $_len = strlen($_text); - $_i = 0; - if ($_pos) { - $_orig_pos = $_pos; - $_max = ' . $block_size . ' - $_pos; - if ($_len >= $_max) { - $_i = $_max; - $_len-= $_max; - $_pos = 0; - } else { - $_i = $_len; - $_pos+= $_len; - $_len = 0; - } - $_ciphertext = substr($_iv, $_orig_pos) ^ $_text; - $_iv = substr_replace($_iv, $_ciphertext, $_orig_pos, $_i); - } - while ($_len >= ' . $block_size . ') { - $in = $_iv; - ' . $encrypt_block . '; - $_iv = $in ^ substr($_text, $_i, ' . $block_size . '); - $_ciphertext.= $_iv; - $_len-= ' . $block_size . '; - $_i+= ' . $block_size . '; - } - if ($_len) { - $in = $_iv; - ' . $encrypt_block . ' - $_iv = $in; - $_block = $_iv ^ substr($_text, $_i); - $_iv = substr_replace($_iv, $_block, 0, $_len); - $_ciphertext.= $_block; - $_pos = $_len; - } - return $_ciphertext; - '; - - $decrypt = $init_encrypt . ' - $_plaintext = ""; - $_buffer = &$this->debuffer; - - if ($this->continuousBuffer) { - $_iv = &$this->decryptIV; - $_pos = &$_buffer["pos"]; - } else { - $_iv = $this->decryptIV; - $_pos = 0; - } - $_len = strlen($_text); - $_i = 0; - if ($_pos) { - $_orig_pos = $_pos; - $_max = ' . $block_size . ' - $_pos; - if ($_len >= $_max) { - $_i = $_max; - $_len-= $_max; - $_pos = 0; - } else { - $_i = $_len; - $_pos+= $_len; - $_len = 0; - } - $_plaintext = substr($_iv, $_orig_pos) ^ $_text; - $_iv = substr_replace($_iv, substr($_text, 0, $_i), $_orig_pos, $_i); - } - while ($_len >= ' . $block_size . ') { - $in = $_iv; - ' . $encrypt_block . ' - $_iv = $in; - $cb = substr($_text, $_i, ' . $block_size . '); - $_plaintext.= $_iv ^ $cb; - $_iv = $cb; - $_len-= ' . $block_size . '; - $_i+= ' . $block_size . '; - } - if ($_len) { - $in = $_iv; - ' . $encrypt_block . ' - $_iv = $in; - $_plaintext.= $_iv ^ substr($_text, $_i); - $_iv = substr_replace($_iv, substr($_text, $_i), 0, $_len); - $_pos = $_len; - } - - return $_plaintext; - '; - break; - case self::MODE_CFB8: - $encrypt = $init_encrypt . ' - $_ciphertext = ""; - $_len = strlen($_text); - $_iv = $this->encryptIV; - - for ($_i = 0; $_i < $_len; ++$_i) { - $in = $_iv; - ' . $encrypt_block . ' - $_ciphertext .= ($_c = $_text[$_i] ^ $in); - $_iv = substr($_iv, 1) . $_c; - } - - if ($this->continuousBuffer) { - if ($_len >= ' . $block_size . ') { - $this->encryptIV = substr($_ciphertext, -' . $block_size . '); - } else { - $this->encryptIV = substr($this->encryptIV, $_len - ' . $block_size . ') . substr($_ciphertext, -$_len); - } - } - - return $_ciphertext; - '; - $decrypt = $init_encrypt . ' - $_plaintext = ""; - $_len = strlen($_text); - $_iv = $this->decryptIV; - - for ($_i = 0; $_i < $_len; ++$_i) { - $in = $_iv; - ' . $encrypt_block . ' - $_plaintext .= $_text[$_i] ^ $in; - $_iv = substr($_iv, 1) . $_text[$_i]; - } - - if ($this->continuousBuffer) { - if ($_len >= ' . $block_size . ') { - $this->decryptIV = substr($_text, -' . $block_size . '); - } else { - $this->decryptIV = substr($this->decryptIV, $_len - ' . $block_size . ') . substr($_text, -$_len); - } - } - - return $_plaintext; - '; - break; - case self::MODE_OFB8: - $encrypt = $init_encrypt . ' - $_ciphertext = ""; - $_len = strlen($_text); - $_iv = $this->encryptIV; - - for ($_i = 0; $_i < $_len; ++$_i) { - $in = $_iv; - ' . $encrypt_block . ' - $_ciphertext.= $_text[$_i] ^ $in; - $_iv = substr($_iv, 1) . $in[0]; - } - - if ($this->continuousBuffer) { - $this->encryptIV = $_iv; - } - - return $_ciphertext; - '; - $decrypt = $init_encrypt . ' - $_plaintext = ""; - $_len = strlen($_text); - $_iv = $this->decryptIV; - - for ($_i = 0; $_i < $_len; ++$_i) { - $in = $_iv; - ' . $encrypt_block . ' - $_plaintext.= $_text[$_i] ^ $in; - $_iv = substr($_iv, 1) . $in[0]; - } - - if ($this->continuousBuffer) { - $this->decryptIV = $_iv; - } - - return $_plaintext; - '; - break; - case self::MODE_OFB: - $encrypt = $init_encrypt . ' - $_ciphertext = ""; - $_plaintext_len = strlen($_text); - $_xor = $this->encryptIV; - $_buffer = &$this->enbuffer; - - if (strlen($_buffer["xor"])) { - for ($_i = 0; $_i < $_plaintext_len; $_i+= ' . $block_size . ') { - $_block = substr($_text, $_i, ' . $block_size . '); - if (strlen($_block) > strlen($_buffer["xor"])) { - $in = $_xor; - ' . $encrypt_block . ' - $_xor = $in; - $_buffer["xor"].= $_xor; - } - $_key = \phpseclib3\Common\Functions\Strings::shift($_buffer["xor"], ' . $block_size . '); - $_ciphertext.= $_block ^ $_key; - } - } else { - for ($_i = 0; $_i < $_plaintext_len; $_i+= ' . $block_size . ') { - $in = $_xor; - ' . $encrypt_block . ' - $_xor = $in; - $_ciphertext.= substr($_text, $_i, ' . $block_size . ') ^ $_xor; - } - $_key = $_xor; - } - if ($this->continuousBuffer) { - $this->encryptIV = $_xor; - if ($_start = $_plaintext_len % ' . $block_size . ') { - $_buffer["xor"] = substr($_key, $_start) . $_buffer["xor"]; - } - } - return $_ciphertext; - '; - - $decrypt = $init_encrypt . ' - $_plaintext = ""; - $_ciphertext_len = strlen($_text); - $_xor = $this->decryptIV; - $_buffer = &$this->debuffer; - - if (strlen($_buffer["xor"])) { - for ($_i = 0; $_i < $_ciphertext_len; $_i+= ' . $block_size . ') { - $_block = substr($_text, $_i, ' . $block_size . '); - if (strlen($_block) > strlen($_buffer["xor"])) { - $in = $_xor; - ' . $encrypt_block . ' - $_xor = $in; - $_buffer["xor"].= $_xor; - } - $_key = \phpseclib3\Common\Functions\Strings::shift($_buffer["xor"], ' . $block_size . '); - $_plaintext.= $_block ^ $_key; - } - } else { - for ($_i = 0; $_i < $_ciphertext_len; $_i+= ' . $block_size . ') { - $in = $_xor; - ' . $encrypt_block . ' - $_xor = $in; - $_plaintext.= substr($_text, $_i, ' . $block_size . ') ^ $_xor; - } - $_key = $_xor; - } - if ($this->continuousBuffer) { - $this->decryptIV = $_xor; - if ($_start = $_ciphertext_len % ' . $block_size . ') { - $_buffer["xor"] = substr($_key, $_start) . $_buffer["xor"]; - } - } - return $_plaintext; - '; - break; - case self::MODE_STREAM: - $encrypt = $init_encrypt . ' - $_ciphertext = ""; - ' . $encrypt_block . ' - return $_ciphertext; - '; - $decrypt = $init_decrypt . ' - $_plaintext = ""; - ' . $decrypt_block . ' - return $_plaintext; - '; - break; - // case self::MODE_CBC: - default: - $encrypt = $init_encrypt . ' - $_ciphertext = ""; - $_plaintext_len = strlen($_text); - - $in = $this->encryptIV; - - for ($_i = 0; $_i < $_plaintext_len; $_i+= ' . $block_size . ') { - $in = substr($_text, $_i, ' . $block_size . ') ^ $in; - ' . $encrypt_block . ' - $_ciphertext.= $in; - } - - if ($this->continuousBuffer) { - $this->encryptIV = $in; - } - - return $_ciphertext; - '; - - $decrypt = $init_decrypt . ' - $_plaintext = ""; - $_text = str_pad($_text, strlen($_text) + (' . $block_size . ' - strlen($_text) % ' . $block_size . ') % ' . $block_size . ', chr(0)); - $_ciphertext_len = strlen($_text); - - $_iv = $this->decryptIV; - - for ($_i = 0; $_i < $_ciphertext_len; $_i+= ' . $block_size . ') { - $in = $_block = substr($_text, $_i, ' . $block_size . '); - ' . $decrypt_block . ' - $_plaintext.= $in ^ $_iv; - $_iv = $_block; - } - - if ($this->continuousBuffer) { - $this->decryptIV = $_iv; - } - - return $this->unpad($_plaintext); - '; - break; - } - - // Before discrediting this, please read the following: - // @see https://github.com/phpseclib/phpseclib/issues/1293 - // @see https://github.com/phpseclib/phpseclib/pull/1143 - eval('$func = function ($_action, $_text) { ' . $init_crypt . 'if ($_action == "encrypt") { ' . $encrypt . ' } else { ' . $decrypt . ' }};'); - - return \Closure::bind($func, $this, static::class); - } - - /** - * Convert float to int - * - * On ARM CPUs converting floats to ints doesn't always work - * - * @param string $x - * @return int - */ - protected static function safe_intval($x) - { - if (is_int($x)) { - return $x; - } - - if (self::$use_reg_intval) { - return PHP_INT_SIZE == 4 && PHP_VERSION_ID >= 80100 ? intval($x) : $x; - } - - return (fmod($x, 0x80000000) & 0x7FFFFFFF) | - ((fmod(floor($x / 0x80000000), 2) & 1) << 31); - } - - /** - * eval()'able string for in-line float to int - * - * @return string - */ - protected static function safe_intval_inline() - { - if (self::$use_reg_intval) { - return PHP_INT_SIZE == 4 && PHP_VERSION_ID >= 80100 ? 'intval(%s)' : '%s'; - } - - $safeint = '(is_int($temp = %s) ? $temp : (fmod($temp, 0x80000000) & 0x7FFFFFFF) | '; - return $safeint . '((fmod(floor($temp / 0x80000000), 2) & 1) << 31))'; - } - - /** - * Sets up GCM parameters - * - * See steps 1-2 of https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38d.pdf#page=23 - * for more info - * - */ - private function setupGCM() - { - // don't keep on re-calculating $this->h - if (!$this->h || $this->hKey != $this->key) { - $cipher = new static('ecb'); - $cipher->setKey($this->key); - $cipher->disablePadding(); - - $this->h = self::$gcmField->newInteger( - Strings::switchEndianness($cipher->encrypt("\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0")) - ); - $this->hKey = $this->key; - } - - if (strlen($this->nonce) == 12) { - $this->iv = $this->nonce . "\0\0\0\1"; - } else { - $this->iv = $this->ghash( - self::nullPad128($this->nonce) . str_repeat("\0", 8) . self::len64($this->nonce) - ); - } - } - - /** - * Performs GHASH operation - * - * See https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38d.pdf#page=20 - * for more info - * - * @see self::decrypt() - * @see self::encrypt() - * @param string $x - * @return string - */ - private function ghash($x) - { - $h = $this->h; - $y = ["\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"]; - $x = str_split($x, 16); - $n = 0; - // the switchEndianness calls are necessary because the multiplication algorithm in BinaryField/Integer - // interprets strings as polynomials in big endian order whereas in GCM they're interpreted in little - // endian order per https://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-38d.pdf#page=19. - // big endian order is what binary field elliptic curves use per http://www.secg.org/sec1-v2.pdf#page=18. - - // we could switchEndianness here instead of in the while loop but doing so in the while loop seems like it - // might be slightly more performant - //$x = Strings::switchEndianness($x); - foreach ($x as $xn) { - $xn = Strings::switchEndianness($xn); - $t = $y[$n] ^ $xn; - $temp = self::$gcmField->newInteger($t); - $y[++$n] = $temp->multiply($h)->toBytes(); - $y[$n] = substr($y[$n], 1); - } - $y[$n] = Strings::switchEndianness($y[$n]); - return $y[$n]; - } - - /** - * Returns the bit length of a string in a packed format - * - * @see self::decrypt() - * @see self::encrypt() - * @see self::setupGCM() - * @param string $str - * @return string - */ - private static function len64($str) - { - return "\0\0\0\0" . pack('N', 8 * strlen($str)); - } - - /** - * NULL pads a string to be a multiple of 128 - * - * @see self::decrypt() - * @see self::encrypt() - * @see self::setupGCM() - * @param string $str - * @return string - */ - protected static function nullPad128($str) - { - $len = strlen($str); - return $str . str_repeat("\0", 16 * ceil($len / 16) - $len); - } - - /** - * Calculates Poly1305 MAC - * - * On my system ChaCha20, with libsodium, takes 0.5s. With this custom Poly1305 implementation - * it takes 1.2s. - * - * @see self::decrypt() - * @see self::encrypt() - * @param string $text - * @return string - */ - protected function poly1305($text) - { - $s = $this->poly1305Key; // strlen($this->poly1305Key) == 32 - $r = Strings::shift($s, 16); - $r = strrev($r); - $r &= "\x0f\xff\xff\xfc\x0f\xff\xff\xfc\x0f\xff\xff\xfc\x0f\xff\xff\xff"; - $s = strrev($s); - - $r = self::$poly1305Field->newInteger(new BigInteger($r, 256)); - $s = self::$poly1305Field->newInteger(new BigInteger($s, 256)); - $a = self::$poly1305Field->newInteger(new BigInteger()); - - $blocks = str_split($text, 16); - foreach ($blocks as $block) { - $n = strrev($block . chr(1)); - $n = self::$poly1305Field->newInteger(new BigInteger($n, 256)); - $a = $a->add($n); - $a = $a->multiply($r); - } - $r = $a->toBigInteger()->add($s->toBigInteger()); - $mask = "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"; - return strrev($r->toBytes()) & $mask; - } - - /** - * Return the mode - * - * You can do $obj instanceof AES or whatever to get the cipher but you can't do that to get the mode - * - * @return string - */ - public function getMode() - { - return array_flip(self::MODE_MAP)[$this->mode]; - } - - /** - * Is the continuous buffer enabled? - * - * @return boolean - */ - public function continuousBufferEnabled() - { - return $this->continuousBuffer; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Traits/Fingerprint.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Traits/Fingerprint.php deleted file mode 100644 index f4cf071..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Traits/Fingerprint.php +++ /dev/null @@ -1,57 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Traits; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\Hash; - -/** - * Fingerprint Trait for Private Keys - * - * @author Jim Wigginton - */ -trait Fingerprint -{ - /** - * Returns the public key's fingerprint - * - * The public key's fingerprint is returned, which is equivalent to running `ssh-keygen -lf rsa.pub`. If there is - * no public key currently loaded, false is returned. - * Example output (md5): "c1:b1:30:29:d7:b8:de:6c:97:77:10:d7:46:41:63:87" (as specified by RFC 4716) - * - * @param string $algorithm The hashing algorithm to be used. Valid options are 'md5' and 'sha256'. False is returned - * for invalid values. - * @return mixed - */ - public function getFingerprint($algorithm = 'md5') - { - $type = self::validatePlugin('Keys', 'OpenSSH', 'savePublicKey'); - if ($type === false) { - return false; - } - $key = $this->toString('OpenSSH', ['binary' => true]); - if ($key === false) { - return false; - } - switch ($algorithm) { - case 'sha256': - $hash = new Hash('sha256'); - $base = base64_encode($hash->hash($key)); - return substr($base, 0, strlen($base) - 1); - case 'md5': - return substr(chunk_split(md5($key), 2, ':'), 0, -1); - default: - return false; - } - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Traits/PasswordProtected.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Traits/PasswordProtected.php deleted file mode 100644 index f53b02a..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/Common/Traits/PasswordProtected.php +++ /dev/null @@ -1,46 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Traits; - -/** - * Password Protected Trait for Private Keys - * - * @author Jim Wigginton - */ -trait PasswordProtected -{ - /** - * Password - * - * @var string|bool - */ - private $password = false; - - /** - * Sets the password - * - * Private keys can be encrypted with a password. To unset the password, pass in the empty string or false. - * Or rather, pass in $password such that empty($password) && !is_string($password) is true. - * - * @see self::createKey() - * @see self::load() - * @param string|bool $password - */ - public function withPassword($password = false) - { - $new = clone $this; - $new->password = $password; - return $new; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/DES.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/DES.php deleted file mode 100644 index 5ba761b..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/DES.php +++ /dev/null @@ -1,1392 +0,0 @@ - - * setKey('abcdefgh'); - * - * $size = 10 * 1024; - * $plaintext = ''; - * for ($i = 0; $i < $size; $i++) { - * $plaintext.= 'a'; - * } - * - * echo $des->decrypt($des->encrypt($plaintext)); - * ?> - * - * - * @author Jim Wigginton - * @copyright 2007 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\BlockCipher; -use OCA\Libresign\Vendor\phpseclib3\Exception\BadModeException; - -/** - * Pure-PHP implementation of DES. - * - * @author Jim Wigginton - */ -class DES extends BlockCipher -{ - /** - * Contains $keys[self::ENCRYPT] - * - * @see \phpseclib3\Crypt\DES::setupKey() - * @see \phpseclib3\Crypt\DES::processBlock() - */ - const ENCRYPT = 0; - /** - * Contains $keys[self::DECRYPT] - * - * @see \phpseclib3\Crypt\DES::setupKey() - * @see \phpseclib3\Crypt\DES::processBlock() - */ - const DECRYPT = 1; - - /** - * Block Length of the cipher - * - * @see Common\SymmetricKey::block_size - * @var int - */ - protected $block_size = 8; - - /** - * Key Length (in bytes) - * - * @see Common\SymmetricKey::setKeyLength() - * @var int - */ - protected $key_length = 8; - - /** - * The mcrypt specific name of the cipher - * - * @see Common\SymmetricKey::cipher_name_mcrypt - * @var string - */ - protected $cipher_name_mcrypt = 'des'; - - /** - * The OpenSSL names of the cipher / modes - * - * @see Common\SymmetricKey::openssl_mode_names - * @var array - */ - protected $openssl_mode_names = [ - self::MODE_ECB => 'des-ecb', - self::MODE_CBC => 'des-cbc', - self::MODE_CFB => 'des-cfb', - self::MODE_OFB => 'des-ofb' - // self::MODE_CTR is undefined for DES - ]; - - /** - * Optimizing value while CFB-encrypting - * - * @see Common\SymmetricKey::cfb_init_len - * @var int - */ - protected $cfb_init_len = 500; - - /** - * Switch for DES/3DES encryption - * - * Used only if $engine == self::ENGINE_INTERNAL - * - * @see self::setupKey() - * @see self::processBlock() - * @var int - */ - protected $des_rounds = 1; - - /** - * max possible size of $key - * - * @see self::setKey() - * @var string - */ - protected $key_length_max = 8; - - /** - * The Key Schedule - * - * @see self::setupKey() - * @var array - */ - private $keys; - - /** - * Key Cache "key" - * - * @see self::setupKey() - * @var array - */ - private $kl; - - /** - * Shuffle table. - * - * For each byte value index, the entry holds an 8-byte string - * with each byte containing all bits in the same state as the - * corresponding bit in the index value. - * - * @see self::processBlock() - * @see self::setupKey() - * @var array - */ - protected static $shuffle = [ - "\x00\x00\x00\x00\x00\x00\x00\x00", "\x00\x00\x00\x00\x00\x00\x00\xFF", - "\x00\x00\x00\x00\x00\x00\xFF\x00", "\x00\x00\x00\x00\x00\x00\xFF\xFF", - "\x00\x00\x00\x00\x00\xFF\x00\x00", "\x00\x00\x00\x00\x00\xFF\x00\xFF", - "\x00\x00\x00\x00\x00\xFF\xFF\x00", "\x00\x00\x00\x00\x00\xFF\xFF\xFF", - "\x00\x00\x00\x00\xFF\x00\x00\x00", "\x00\x00\x00\x00\xFF\x00\x00\xFF", - "\x00\x00\x00\x00\xFF\x00\xFF\x00", "\x00\x00\x00\x00\xFF\x00\xFF\xFF", - "\x00\x00\x00\x00\xFF\xFF\x00\x00", "\x00\x00\x00\x00\xFF\xFF\x00\xFF", - "\x00\x00\x00\x00\xFF\xFF\xFF\x00", "\x00\x00\x00\x00\xFF\xFF\xFF\xFF", - "\x00\x00\x00\xFF\x00\x00\x00\x00", "\x00\x00\x00\xFF\x00\x00\x00\xFF", - "\x00\x00\x00\xFF\x00\x00\xFF\x00", "\x00\x00\x00\xFF\x00\x00\xFF\xFF", - "\x00\x00\x00\xFF\x00\xFF\x00\x00", "\x00\x00\x00\xFF\x00\xFF\x00\xFF", - "\x00\x00\x00\xFF\x00\xFF\xFF\x00", "\x00\x00\x00\xFF\x00\xFF\xFF\xFF", - "\x00\x00\x00\xFF\xFF\x00\x00\x00", "\x00\x00\x00\xFF\xFF\x00\x00\xFF", - "\x00\x00\x00\xFF\xFF\x00\xFF\x00", "\x00\x00\x00\xFF\xFF\x00\xFF\xFF", - "\x00\x00\x00\xFF\xFF\xFF\x00\x00", "\x00\x00\x00\xFF\xFF\xFF\x00\xFF", - "\x00\x00\x00\xFF\xFF\xFF\xFF\x00", "\x00\x00\x00\xFF\xFF\xFF\xFF\xFF", - "\x00\x00\xFF\x00\x00\x00\x00\x00", "\x00\x00\xFF\x00\x00\x00\x00\xFF", - "\x00\x00\xFF\x00\x00\x00\xFF\x00", "\x00\x00\xFF\x00\x00\x00\xFF\xFF", - "\x00\x00\xFF\x00\x00\xFF\x00\x00", "\x00\x00\xFF\x00\x00\xFF\x00\xFF", - "\x00\x00\xFF\x00\x00\xFF\xFF\x00", "\x00\x00\xFF\x00\x00\xFF\xFF\xFF", - "\x00\x00\xFF\x00\xFF\x00\x00\x00", "\x00\x00\xFF\x00\xFF\x00\x00\xFF", - "\x00\x00\xFF\x00\xFF\x00\xFF\x00", "\x00\x00\xFF\x00\xFF\x00\xFF\xFF", - "\x00\x00\xFF\x00\xFF\xFF\x00\x00", "\x00\x00\xFF\x00\xFF\xFF\x00\xFF", - "\x00\x00\xFF\x00\xFF\xFF\xFF\x00", "\x00\x00\xFF\x00\xFF\xFF\xFF\xFF", - "\x00\x00\xFF\xFF\x00\x00\x00\x00", "\x00\x00\xFF\xFF\x00\x00\x00\xFF", - "\x00\x00\xFF\xFF\x00\x00\xFF\x00", "\x00\x00\xFF\xFF\x00\x00\xFF\xFF", - "\x00\x00\xFF\xFF\x00\xFF\x00\x00", "\x00\x00\xFF\xFF\x00\xFF\x00\xFF", - "\x00\x00\xFF\xFF\x00\xFF\xFF\x00", "\x00\x00\xFF\xFF\x00\xFF\xFF\xFF", - "\x00\x00\xFF\xFF\xFF\x00\x00\x00", "\x00\x00\xFF\xFF\xFF\x00\x00\xFF", - "\x00\x00\xFF\xFF\xFF\x00\xFF\x00", "\x00\x00\xFF\xFF\xFF\x00\xFF\xFF", - "\x00\x00\xFF\xFF\xFF\xFF\x00\x00", "\x00\x00\xFF\xFF\xFF\xFF\x00\xFF", - "\x00\x00\xFF\xFF\xFF\xFF\xFF\x00", "\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF", - "\x00\xFF\x00\x00\x00\x00\x00\x00", "\x00\xFF\x00\x00\x00\x00\x00\xFF", - "\x00\xFF\x00\x00\x00\x00\xFF\x00", "\x00\xFF\x00\x00\x00\x00\xFF\xFF", - "\x00\xFF\x00\x00\x00\xFF\x00\x00", "\x00\xFF\x00\x00\x00\xFF\x00\xFF", - "\x00\xFF\x00\x00\x00\xFF\xFF\x00", "\x00\xFF\x00\x00\x00\xFF\xFF\xFF", - "\x00\xFF\x00\x00\xFF\x00\x00\x00", "\x00\xFF\x00\x00\xFF\x00\x00\xFF", - "\x00\xFF\x00\x00\xFF\x00\xFF\x00", "\x00\xFF\x00\x00\xFF\x00\xFF\xFF", - "\x00\xFF\x00\x00\xFF\xFF\x00\x00", "\x00\xFF\x00\x00\xFF\xFF\x00\xFF", - "\x00\xFF\x00\x00\xFF\xFF\xFF\x00", "\x00\xFF\x00\x00\xFF\xFF\xFF\xFF", - "\x00\xFF\x00\xFF\x00\x00\x00\x00", "\x00\xFF\x00\xFF\x00\x00\x00\xFF", - "\x00\xFF\x00\xFF\x00\x00\xFF\x00", "\x00\xFF\x00\xFF\x00\x00\xFF\xFF", - "\x00\xFF\x00\xFF\x00\xFF\x00\x00", "\x00\xFF\x00\xFF\x00\xFF\x00\xFF", - "\x00\xFF\x00\xFF\x00\xFF\xFF\x00", "\x00\xFF\x00\xFF\x00\xFF\xFF\xFF", - "\x00\xFF\x00\xFF\xFF\x00\x00\x00", "\x00\xFF\x00\xFF\xFF\x00\x00\xFF", - "\x00\xFF\x00\xFF\xFF\x00\xFF\x00", "\x00\xFF\x00\xFF\xFF\x00\xFF\xFF", - "\x00\xFF\x00\xFF\xFF\xFF\x00\x00", "\x00\xFF\x00\xFF\xFF\xFF\x00\xFF", - "\x00\xFF\x00\xFF\xFF\xFF\xFF\x00", "\x00\xFF\x00\xFF\xFF\xFF\xFF\xFF", - "\x00\xFF\xFF\x00\x00\x00\x00\x00", "\x00\xFF\xFF\x00\x00\x00\x00\xFF", - "\x00\xFF\xFF\x00\x00\x00\xFF\x00", "\x00\xFF\xFF\x00\x00\x00\xFF\xFF", - "\x00\xFF\xFF\x00\x00\xFF\x00\x00", "\x00\xFF\xFF\x00\x00\xFF\x00\xFF", - "\x00\xFF\xFF\x00\x00\xFF\xFF\x00", "\x00\xFF\xFF\x00\x00\xFF\xFF\xFF", - "\x00\xFF\xFF\x00\xFF\x00\x00\x00", "\x00\xFF\xFF\x00\xFF\x00\x00\xFF", - "\x00\xFF\xFF\x00\xFF\x00\xFF\x00", "\x00\xFF\xFF\x00\xFF\x00\xFF\xFF", - "\x00\xFF\xFF\x00\xFF\xFF\x00\x00", "\x00\xFF\xFF\x00\xFF\xFF\x00\xFF", - "\x00\xFF\xFF\x00\xFF\xFF\xFF\x00", "\x00\xFF\xFF\x00\xFF\xFF\xFF\xFF", - "\x00\xFF\xFF\xFF\x00\x00\x00\x00", "\x00\xFF\xFF\xFF\x00\x00\x00\xFF", - "\x00\xFF\xFF\xFF\x00\x00\xFF\x00", "\x00\xFF\xFF\xFF\x00\x00\xFF\xFF", - "\x00\xFF\xFF\xFF\x00\xFF\x00\x00", "\x00\xFF\xFF\xFF\x00\xFF\x00\xFF", - "\x00\xFF\xFF\xFF\x00\xFF\xFF\x00", "\x00\xFF\xFF\xFF\x00\xFF\xFF\xFF", - "\x00\xFF\xFF\xFF\xFF\x00\x00\x00", "\x00\xFF\xFF\xFF\xFF\x00\x00\xFF", - "\x00\xFF\xFF\xFF\xFF\x00\xFF\x00", "\x00\xFF\xFF\xFF\xFF\x00\xFF\xFF", - "\x00\xFF\xFF\xFF\xFF\xFF\x00\x00", "\x00\xFF\xFF\xFF\xFF\xFF\x00\xFF", - "\x00\xFF\xFF\xFF\xFF\xFF\xFF\x00", "\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF", - "\xFF\x00\x00\x00\x00\x00\x00\x00", "\xFF\x00\x00\x00\x00\x00\x00\xFF", - "\xFF\x00\x00\x00\x00\x00\xFF\x00", "\xFF\x00\x00\x00\x00\x00\xFF\xFF", - "\xFF\x00\x00\x00\x00\xFF\x00\x00", "\xFF\x00\x00\x00\x00\xFF\x00\xFF", - "\xFF\x00\x00\x00\x00\xFF\xFF\x00", "\xFF\x00\x00\x00\x00\xFF\xFF\xFF", - "\xFF\x00\x00\x00\xFF\x00\x00\x00", "\xFF\x00\x00\x00\xFF\x00\x00\xFF", - "\xFF\x00\x00\x00\xFF\x00\xFF\x00", "\xFF\x00\x00\x00\xFF\x00\xFF\xFF", - "\xFF\x00\x00\x00\xFF\xFF\x00\x00", "\xFF\x00\x00\x00\xFF\xFF\x00\xFF", - "\xFF\x00\x00\x00\xFF\xFF\xFF\x00", "\xFF\x00\x00\x00\xFF\xFF\xFF\xFF", - "\xFF\x00\x00\xFF\x00\x00\x00\x00", "\xFF\x00\x00\xFF\x00\x00\x00\xFF", - "\xFF\x00\x00\xFF\x00\x00\xFF\x00", "\xFF\x00\x00\xFF\x00\x00\xFF\xFF", - "\xFF\x00\x00\xFF\x00\xFF\x00\x00", "\xFF\x00\x00\xFF\x00\xFF\x00\xFF", - "\xFF\x00\x00\xFF\x00\xFF\xFF\x00", "\xFF\x00\x00\xFF\x00\xFF\xFF\xFF", - "\xFF\x00\x00\xFF\xFF\x00\x00\x00", "\xFF\x00\x00\xFF\xFF\x00\x00\xFF", - "\xFF\x00\x00\xFF\xFF\x00\xFF\x00", "\xFF\x00\x00\xFF\xFF\x00\xFF\xFF", - "\xFF\x00\x00\xFF\xFF\xFF\x00\x00", "\xFF\x00\x00\xFF\xFF\xFF\x00\xFF", - "\xFF\x00\x00\xFF\xFF\xFF\xFF\x00", "\xFF\x00\x00\xFF\xFF\xFF\xFF\xFF", - "\xFF\x00\xFF\x00\x00\x00\x00\x00", "\xFF\x00\xFF\x00\x00\x00\x00\xFF", - "\xFF\x00\xFF\x00\x00\x00\xFF\x00", "\xFF\x00\xFF\x00\x00\x00\xFF\xFF", - "\xFF\x00\xFF\x00\x00\xFF\x00\x00", "\xFF\x00\xFF\x00\x00\xFF\x00\xFF", - "\xFF\x00\xFF\x00\x00\xFF\xFF\x00", "\xFF\x00\xFF\x00\x00\xFF\xFF\xFF", - "\xFF\x00\xFF\x00\xFF\x00\x00\x00", "\xFF\x00\xFF\x00\xFF\x00\x00\xFF", - "\xFF\x00\xFF\x00\xFF\x00\xFF\x00", "\xFF\x00\xFF\x00\xFF\x00\xFF\xFF", - "\xFF\x00\xFF\x00\xFF\xFF\x00\x00", "\xFF\x00\xFF\x00\xFF\xFF\x00\xFF", - "\xFF\x00\xFF\x00\xFF\xFF\xFF\x00", "\xFF\x00\xFF\x00\xFF\xFF\xFF\xFF", - "\xFF\x00\xFF\xFF\x00\x00\x00\x00", "\xFF\x00\xFF\xFF\x00\x00\x00\xFF", - "\xFF\x00\xFF\xFF\x00\x00\xFF\x00", "\xFF\x00\xFF\xFF\x00\x00\xFF\xFF", - "\xFF\x00\xFF\xFF\x00\xFF\x00\x00", "\xFF\x00\xFF\xFF\x00\xFF\x00\xFF", - "\xFF\x00\xFF\xFF\x00\xFF\xFF\x00", "\xFF\x00\xFF\xFF\x00\xFF\xFF\xFF", - "\xFF\x00\xFF\xFF\xFF\x00\x00\x00", "\xFF\x00\xFF\xFF\xFF\x00\x00\xFF", - "\xFF\x00\xFF\xFF\xFF\x00\xFF\x00", "\xFF\x00\xFF\xFF\xFF\x00\xFF\xFF", - "\xFF\x00\xFF\xFF\xFF\xFF\x00\x00", "\xFF\x00\xFF\xFF\xFF\xFF\x00\xFF", - "\xFF\x00\xFF\xFF\xFF\xFF\xFF\x00", "\xFF\x00\xFF\xFF\xFF\xFF\xFF\xFF", - "\xFF\xFF\x00\x00\x00\x00\x00\x00", "\xFF\xFF\x00\x00\x00\x00\x00\xFF", - "\xFF\xFF\x00\x00\x00\x00\xFF\x00", "\xFF\xFF\x00\x00\x00\x00\xFF\xFF", - "\xFF\xFF\x00\x00\x00\xFF\x00\x00", "\xFF\xFF\x00\x00\x00\xFF\x00\xFF", - "\xFF\xFF\x00\x00\x00\xFF\xFF\x00", "\xFF\xFF\x00\x00\x00\xFF\xFF\xFF", - "\xFF\xFF\x00\x00\xFF\x00\x00\x00", "\xFF\xFF\x00\x00\xFF\x00\x00\xFF", - "\xFF\xFF\x00\x00\xFF\x00\xFF\x00", "\xFF\xFF\x00\x00\xFF\x00\xFF\xFF", - "\xFF\xFF\x00\x00\xFF\xFF\x00\x00", "\xFF\xFF\x00\x00\xFF\xFF\x00\xFF", - "\xFF\xFF\x00\x00\xFF\xFF\xFF\x00", "\xFF\xFF\x00\x00\xFF\xFF\xFF\xFF", - "\xFF\xFF\x00\xFF\x00\x00\x00\x00", "\xFF\xFF\x00\xFF\x00\x00\x00\xFF", - "\xFF\xFF\x00\xFF\x00\x00\xFF\x00", "\xFF\xFF\x00\xFF\x00\x00\xFF\xFF", - "\xFF\xFF\x00\xFF\x00\xFF\x00\x00", "\xFF\xFF\x00\xFF\x00\xFF\x00\xFF", - "\xFF\xFF\x00\xFF\x00\xFF\xFF\x00", "\xFF\xFF\x00\xFF\x00\xFF\xFF\xFF", - "\xFF\xFF\x00\xFF\xFF\x00\x00\x00", "\xFF\xFF\x00\xFF\xFF\x00\x00\xFF", - "\xFF\xFF\x00\xFF\xFF\x00\xFF\x00", "\xFF\xFF\x00\xFF\xFF\x00\xFF\xFF", - "\xFF\xFF\x00\xFF\xFF\xFF\x00\x00", "\xFF\xFF\x00\xFF\xFF\xFF\x00\xFF", - "\xFF\xFF\x00\xFF\xFF\xFF\xFF\x00", "\xFF\xFF\x00\xFF\xFF\xFF\xFF\xFF", - "\xFF\xFF\xFF\x00\x00\x00\x00\x00", "\xFF\xFF\xFF\x00\x00\x00\x00\xFF", - "\xFF\xFF\xFF\x00\x00\x00\xFF\x00", "\xFF\xFF\xFF\x00\x00\x00\xFF\xFF", - "\xFF\xFF\xFF\x00\x00\xFF\x00\x00", "\xFF\xFF\xFF\x00\x00\xFF\x00\xFF", - "\xFF\xFF\xFF\x00\x00\xFF\xFF\x00", "\xFF\xFF\xFF\x00\x00\xFF\xFF\xFF", - "\xFF\xFF\xFF\x00\xFF\x00\x00\x00", "\xFF\xFF\xFF\x00\xFF\x00\x00\xFF", - "\xFF\xFF\xFF\x00\xFF\x00\xFF\x00", "\xFF\xFF\xFF\x00\xFF\x00\xFF\xFF", - "\xFF\xFF\xFF\x00\xFF\xFF\x00\x00", "\xFF\xFF\xFF\x00\xFF\xFF\x00\xFF", - "\xFF\xFF\xFF\x00\xFF\xFF\xFF\x00", "\xFF\xFF\xFF\x00\xFF\xFF\xFF\xFF", - "\xFF\xFF\xFF\xFF\x00\x00\x00\x00", "\xFF\xFF\xFF\xFF\x00\x00\x00\xFF", - "\xFF\xFF\xFF\xFF\x00\x00\xFF\x00", "\xFF\xFF\xFF\xFF\x00\x00\xFF\xFF", - "\xFF\xFF\xFF\xFF\x00\xFF\x00\x00", "\xFF\xFF\xFF\xFF\x00\xFF\x00\xFF", - "\xFF\xFF\xFF\xFF\x00\xFF\xFF\x00", "\xFF\xFF\xFF\xFF\x00\xFF\xFF\xFF", - "\xFF\xFF\xFF\xFF\xFF\x00\x00\x00", "\xFF\xFF\xFF\xFF\xFF\x00\x00\xFF", - "\xFF\xFF\xFF\xFF\xFF\x00\xFF\x00", "\xFF\xFF\xFF\xFF\xFF\x00\xFF\xFF", - "\xFF\xFF\xFF\xFF\xFF\xFF\x00\x00", "\xFF\xFF\xFF\xFF\xFF\xFF\x00\xFF", - "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x00", "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" - ]; - - /** - * IP mapping helper table. - * - * Indexing this table with each source byte performs the initial bit permutation. - * - * @var array - */ - protected static $ipmap = [ - 0x00, 0x10, 0x01, 0x11, 0x20, 0x30, 0x21, 0x31, - 0x02, 0x12, 0x03, 0x13, 0x22, 0x32, 0x23, 0x33, - 0x40, 0x50, 0x41, 0x51, 0x60, 0x70, 0x61, 0x71, - 0x42, 0x52, 0x43, 0x53, 0x62, 0x72, 0x63, 0x73, - 0x04, 0x14, 0x05, 0x15, 0x24, 0x34, 0x25, 0x35, - 0x06, 0x16, 0x07, 0x17, 0x26, 0x36, 0x27, 0x37, - 0x44, 0x54, 0x45, 0x55, 0x64, 0x74, 0x65, 0x75, - 0x46, 0x56, 0x47, 0x57, 0x66, 0x76, 0x67, 0x77, - 0x80, 0x90, 0x81, 0x91, 0xA0, 0xB0, 0xA1, 0xB1, - 0x82, 0x92, 0x83, 0x93, 0xA2, 0xB2, 0xA3, 0xB3, - 0xC0, 0xD0, 0xC1, 0xD1, 0xE0, 0xF0, 0xE1, 0xF1, - 0xC2, 0xD2, 0xC3, 0xD3, 0xE2, 0xF2, 0xE3, 0xF3, - 0x84, 0x94, 0x85, 0x95, 0xA4, 0xB4, 0xA5, 0xB5, - 0x86, 0x96, 0x87, 0x97, 0xA6, 0xB6, 0xA7, 0xB7, - 0xC4, 0xD4, 0xC5, 0xD5, 0xE4, 0xF4, 0xE5, 0xF5, - 0xC6, 0xD6, 0xC7, 0xD7, 0xE6, 0xF6, 0xE7, 0xF7, - 0x08, 0x18, 0x09, 0x19, 0x28, 0x38, 0x29, 0x39, - 0x0A, 0x1A, 0x0B, 0x1B, 0x2A, 0x3A, 0x2B, 0x3B, - 0x48, 0x58, 0x49, 0x59, 0x68, 0x78, 0x69, 0x79, - 0x4A, 0x5A, 0x4B, 0x5B, 0x6A, 0x7A, 0x6B, 0x7B, - 0x0C, 0x1C, 0x0D, 0x1D, 0x2C, 0x3C, 0x2D, 0x3D, - 0x0E, 0x1E, 0x0F, 0x1F, 0x2E, 0x3E, 0x2F, 0x3F, - 0x4C, 0x5C, 0x4D, 0x5D, 0x6C, 0x7C, 0x6D, 0x7D, - 0x4E, 0x5E, 0x4F, 0x5F, 0x6E, 0x7E, 0x6F, 0x7F, - 0x88, 0x98, 0x89, 0x99, 0xA8, 0xB8, 0xA9, 0xB9, - 0x8A, 0x9A, 0x8B, 0x9B, 0xAA, 0xBA, 0xAB, 0xBB, - 0xC8, 0xD8, 0xC9, 0xD9, 0xE8, 0xF8, 0xE9, 0xF9, - 0xCA, 0xDA, 0xCB, 0xDB, 0xEA, 0xFA, 0xEB, 0xFB, - 0x8C, 0x9C, 0x8D, 0x9D, 0xAC, 0xBC, 0xAD, 0xBD, - 0x8E, 0x9E, 0x8F, 0x9F, 0xAE, 0xBE, 0xAF, 0xBF, - 0xCC, 0xDC, 0xCD, 0xDD, 0xEC, 0xFC, 0xED, 0xFD, - 0xCE, 0xDE, 0xCF, 0xDF, 0xEE, 0xFE, 0xEF, 0xFF - ]; - - /** - * Inverse IP mapping helper table. - * Indexing this table with a byte value reverses the bit order. - * - * @var array - */ - protected static $invipmap = [ - 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0, - 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0, - 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8, - 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8, - 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4, - 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4, - 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC, - 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC, - 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2, - 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2, - 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA, - 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA, - 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6, - 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6, - 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE, - 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE, - 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1, - 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1, - 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9, - 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9, - 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5, - 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5, - 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED, - 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD, - 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3, - 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3, - 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB, - 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB, - 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7, - 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7, - 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF, - 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF - ]; - - /** - * Pre-permuted S-box1 - * - * Each box ($sbox1-$sbox8) has been vectorized, then each value pre-permuted using the - * P table: concatenation can then be replaced by exclusive ORs. - * - * @var array - */ - protected static $sbox1 = [ - 0x00808200, 0x00000000, 0x00008000, 0x00808202, - 0x00808002, 0x00008202, 0x00000002, 0x00008000, - 0x00000200, 0x00808200, 0x00808202, 0x00000200, - 0x00800202, 0x00808002, 0x00800000, 0x00000002, - 0x00000202, 0x00800200, 0x00800200, 0x00008200, - 0x00008200, 0x00808000, 0x00808000, 0x00800202, - 0x00008002, 0x00800002, 0x00800002, 0x00008002, - 0x00000000, 0x00000202, 0x00008202, 0x00800000, - 0x00008000, 0x00808202, 0x00000002, 0x00808000, - 0x00808200, 0x00800000, 0x00800000, 0x00000200, - 0x00808002, 0x00008000, 0x00008200, 0x00800002, - 0x00000200, 0x00000002, 0x00800202, 0x00008202, - 0x00808202, 0x00008002, 0x00808000, 0x00800202, - 0x00800002, 0x00000202, 0x00008202, 0x00808200, - 0x00000202, 0x00800200, 0x00800200, 0x00000000, - 0x00008002, 0x00008200, 0x00000000, 0x00808002 - ]; - - /** - * Pre-permuted S-box2 - * - * @var array - */ - protected static $sbox2 = [ - 0x40084010, 0x40004000, 0x00004000, 0x00084010, - 0x00080000, 0x00000010, 0x40080010, 0x40004010, - 0x40000010, 0x40084010, 0x40084000, 0x40000000, - 0x40004000, 0x00080000, 0x00000010, 0x40080010, - 0x00084000, 0x00080010, 0x40004010, 0x00000000, - 0x40000000, 0x00004000, 0x00084010, 0x40080000, - 0x00080010, 0x40000010, 0x00000000, 0x00084000, - 0x00004010, 0x40084000, 0x40080000, 0x00004010, - 0x00000000, 0x00084010, 0x40080010, 0x00080000, - 0x40004010, 0x40080000, 0x40084000, 0x00004000, - 0x40080000, 0x40004000, 0x00000010, 0x40084010, - 0x00084010, 0x00000010, 0x00004000, 0x40000000, - 0x00004010, 0x40084000, 0x00080000, 0x40000010, - 0x00080010, 0x40004010, 0x40000010, 0x00080010, - 0x00084000, 0x00000000, 0x40004000, 0x00004010, - 0x40000000, 0x40080010, 0x40084010, 0x00084000 - ]; - - /** - * Pre-permuted S-box3 - * - * @var array - */ - protected static $sbox3 = [ - 0x00000104, 0x04010100, 0x00000000, 0x04010004, - 0x04000100, 0x00000000, 0x00010104, 0x04000100, - 0x00010004, 0x04000004, 0x04000004, 0x00010000, - 0x04010104, 0x00010004, 0x04010000, 0x00000104, - 0x04000000, 0x00000004, 0x04010100, 0x00000100, - 0x00010100, 0x04010000, 0x04010004, 0x00010104, - 0x04000104, 0x00010100, 0x00010000, 0x04000104, - 0x00000004, 0x04010104, 0x00000100, 0x04000000, - 0x04010100, 0x04000000, 0x00010004, 0x00000104, - 0x00010000, 0x04010100, 0x04000100, 0x00000000, - 0x00000100, 0x00010004, 0x04010104, 0x04000100, - 0x04000004, 0x00000100, 0x00000000, 0x04010004, - 0x04000104, 0x00010000, 0x04000000, 0x04010104, - 0x00000004, 0x00010104, 0x00010100, 0x04000004, - 0x04010000, 0x04000104, 0x00000104, 0x04010000, - 0x00010104, 0x00000004, 0x04010004, 0x00010100 - ]; - - /** - * Pre-permuted S-box4 - * - * @var array - */ - protected static $sbox4 = [ - 0x80401000, 0x80001040, 0x80001040, 0x00000040, - 0x00401040, 0x80400040, 0x80400000, 0x80001000, - 0x00000000, 0x00401000, 0x00401000, 0x80401040, - 0x80000040, 0x00000000, 0x00400040, 0x80400000, - 0x80000000, 0x00001000, 0x00400000, 0x80401000, - 0x00000040, 0x00400000, 0x80001000, 0x00001040, - 0x80400040, 0x80000000, 0x00001040, 0x00400040, - 0x00001000, 0x00401040, 0x80401040, 0x80000040, - 0x00400040, 0x80400000, 0x00401000, 0x80401040, - 0x80000040, 0x00000000, 0x00000000, 0x00401000, - 0x00001040, 0x00400040, 0x80400040, 0x80000000, - 0x80401000, 0x80001040, 0x80001040, 0x00000040, - 0x80401040, 0x80000040, 0x80000000, 0x00001000, - 0x80400000, 0x80001000, 0x00401040, 0x80400040, - 0x80001000, 0x00001040, 0x00400000, 0x80401000, - 0x00000040, 0x00400000, 0x00001000, 0x00401040 - ]; - - /** - * Pre-permuted S-box5 - * - * @var array - */ - protected static $sbox5 = [ - 0x00000080, 0x01040080, 0x01040000, 0x21000080, - 0x00040000, 0x00000080, 0x20000000, 0x01040000, - 0x20040080, 0x00040000, 0x01000080, 0x20040080, - 0x21000080, 0x21040000, 0x00040080, 0x20000000, - 0x01000000, 0x20040000, 0x20040000, 0x00000000, - 0x20000080, 0x21040080, 0x21040080, 0x01000080, - 0x21040000, 0x20000080, 0x00000000, 0x21000000, - 0x01040080, 0x01000000, 0x21000000, 0x00040080, - 0x00040000, 0x21000080, 0x00000080, 0x01000000, - 0x20000000, 0x01040000, 0x21000080, 0x20040080, - 0x01000080, 0x20000000, 0x21040000, 0x01040080, - 0x20040080, 0x00000080, 0x01000000, 0x21040000, - 0x21040080, 0x00040080, 0x21000000, 0x21040080, - 0x01040000, 0x00000000, 0x20040000, 0x21000000, - 0x00040080, 0x01000080, 0x20000080, 0x00040000, - 0x00000000, 0x20040000, 0x01040080, 0x20000080 - ]; - - /** - * Pre-permuted S-box6 - * - * @var array - */ - protected static $sbox6 = [ - 0x10000008, 0x10200000, 0x00002000, 0x10202008, - 0x10200000, 0x00000008, 0x10202008, 0x00200000, - 0x10002000, 0x00202008, 0x00200000, 0x10000008, - 0x00200008, 0x10002000, 0x10000000, 0x00002008, - 0x00000000, 0x00200008, 0x10002008, 0x00002000, - 0x00202000, 0x10002008, 0x00000008, 0x10200008, - 0x10200008, 0x00000000, 0x00202008, 0x10202000, - 0x00002008, 0x00202000, 0x10202000, 0x10000000, - 0x10002000, 0x00000008, 0x10200008, 0x00202000, - 0x10202008, 0x00200000, 0x00002008, 0x10000008, - 0x00200000, 0x10002000, 0x10000000, 0x00002008, - 0x10000008, 0x10202008, 0x00202000, 0x10200000, - 0x00202008, 0x10202000, 0x00000000, 0x10200008, - 0x00000008, 0x00002000, 0x10200000, 0x00202008, - 0x00002000, 0x00200008, 0x10002008, 0x00000000, - 0x10202000, 0x10000000, 0x00200008, 0x10002008 - ]; - - /** - * Pre-permuted S-box7 - * - * @var array - */ - protected static $sbox7 = [ - 0x00100000, 0x02100001, 0x02000401, 0x00000000, - 0x00000400, 0x02000401, 0x00100401, 0x02100400, - 0x02100401, 0x00100000, 0x00000000, 0x02000001, - 0x00000001, 0x02000000, 0x02100001, 0x00000401, - 0x02000400, 0x00100401, 0x00100001, 0x02000400, - 0x02000001, 0x02100000, 0x02100400, 0x00100001, - 0x02100000, 0x00000400, 0x00000401, 0x02100401, - 0x00100400, 0x00000001, 0x02000000, 0x00100400, - 0x02000000, 0x00100400, 0x00100000, 0x02000401, - 0x02000401, 0x02100001, 0x02100001, 0x00000001, - 0x00100001, 0x02000000, 0x02000400, 0x00100000, - 0x02100400, 0x00000401, 0x00100401, 0x02100400, - 0x00000401, 0x02000001, 0x02100401, 0x02100000, - 0x00100400, 0x00000000, 0x00000001, 0x02100401, - 0x00000000, 0x00100401, 0x02100000, 0x00000400, - 0x02000001, 0x02000400, 0x00000400, 0x00100001 - ]; - - /** - * Pre-permuted S-box8 - * - * @var array - */ - protected static $sbox8 = [ - 0x08000820, 0x00000800, 0x00020000, 0x08020820, - 0x08000000, 0x08000820, 0x00000020, 0x08000000, - 0x00020020, 0x08020000, 0x08020820, 0x00020800, - 0x08020800, 0x00020820, 0x00000800, 0x00000020, - 0x08020000, 0x08000020, 0x08000800, 0x00000820, - 0x00020800, 0x00020020, 0x08020020, 0x08020800, - 0x00000820, 0x00000000, 0x00000000, 0x08020020, - 0x08000020, 0x08000800, 0x00020820, 0x00020000, - 0x00020820, 0x00020000, 0x08020800, 0x00000800, - 0x00000020, 0x08020020, 0x00000800, 0x00020820, - 0x08000800, 0x00000020, 0x08000020, 0x08020000, - 0x08020020, 0x08000000, 0x00020000, 0x08000820, - 0x00000000, 0x08020820, 0x00020020, 0x08000020, - 0x08020000, 0x08000800, 0x08000820, 0x00000000, - 0x08020820, 0x00020800, 0x00020800, 0x00000820, - 0x00000820, 0x00020020, 0x08000000, 0x08020800 - ]; - - /** - * Default Constructor. - * - * @param string $mode - * @throws BadModeException if an invalid / unsupported mode is provided - */ - public function __construct($mode) - { - parent::__construct($mode); - - if ($this->mode == self::MODE_STREAM) { - throw new BadModeException('Block ciphers cannot be ran in stream mode'); - } - } - - /** - * Test for engine validity - * - * This is mainly just a wrapper to set things up for \phpseclib3\Crypt\Common\SymmetricKey::isValidEngine() - * - * @see Common\SymmetricKey::isValidEngine() - * @param int $engine - * @return bool - */ - protected function isValidEngineHelper($engine) - { - if ($this->key_length_max == 8) { - if ($engine == self::ENGINE_OPENSSL) { - // quoting https://www.openssl.org/news/openssl-3.0-notes.html, OpenSSL 3.0.1 - // "Moved all variations of the EVP ciphers CAST5, BF, IDEA, SEED, RC2, RC4, RC5, and DES to the legacy provider" - // in theory openssl_get_cipher_methods() should catch this but, on GitHub Actions, at least, it does not - if (defined('OPENSSL_VERSION_TEXT') && version_compare(preg_replace('#OpenSSL (\d+\.\d+\.\d+) .*#', '$1', OPENSSL_VERSION_TEXT), '3.0.1', '>=')) { - return false; - } - $this->cipher_name_openssl_ecb = 'des-ecb'; - $this->cipher_name_openssl = 'des-' . $this->openssl_translate_mode(); - } - } - - return parent::isValidEngineHelper($engine); - } - - /** - * Sets the key. - * - * Keys must be 64-bits long or 8 bytes long. - * - * DES also requires that every eighth bit be a parity bit, however, we'll ignore that. - * - * @see Common\SymmetricKey::setKey() - * @param string $key - */ - public function setKey($key) - { - if (!($this instanceof TripleDES) && strlen($key) != 8) { - throw new \LengthException('Key of size ' . strlen($key) . ' not supported by this algorithm. Only keys of size 8 are supported'); - } - - // Sets the key - parent::setKey($key); - } - - /** - * Encrypts a block - * - * @see Common\SymmetricKey::encryptBlock() - * @see Common\SymmetricKey::encrypt() - * @see self::encrypt() - * @param string $in - * @return string - */ - protected function encryptBlock($in) - { - return $this->processBlock($in, self::ENCRYPT); - } - - /** - * Decrypts a block - * - * @see Common\SymmetricKey::decryptBlock() - * @see Common\SymmetricKey::decrypt() - * @see self::decrypt() - * @param string $in - * @return string - */ - protected function decryptBlock($in) - { - return $this->processBlock($in, self::DECRYPT); - } - - /** - * Encrypts or decrypts a 64-bit block - * - * $mode should be either self::ENCRYPT or self::DECRYPT. See - * {@link http://en.wikipedia.org/wiki/Image:Feistel.png Feistel.png} to get a general - * idea of what this function does. - * - * @see self::encryptBlock() - * @see self::decryptBlock() - * @param string $block - * @param int $mode - * @return string - */ - private function processBlock($block, $mode) - { - static $sbox1, $sbox2, $sbox3, $sbox4, $sbox5, $sbox6, $sbox7, $sbox8, $shuffleip, $shuffleinvip; - if (!$sbox1) { - $sbox1 = array_map('intval', self::$sbox1); - $sbox2 = array_map('intval', self::$sbox2); - $sbox3 = array_map('intval', self::$sbox3); - $sbox4 = array_map('intval', self::$sbox4); - $sbox5 = array_map('intval', self::$sbox5); - $sbox6 = array_map('intval', self::$sbox6); - $sbox7 = array_map('intval', self::$sbox7); - $sbox8 = array_map('intval', self::$sbox8); - /* Merge $shuffle with $[inv]ipmap */ - for ($i = 0; $i < 256; ++$i) { - $shuffleip[] = self::$shuffle[self::$ipmap[$i]]; - $shuffleinvip[] = self::$shuffle[self::$invipmap[$i]]; - } - } - - $keys = $this->keys[$mode]; - $ki = -1; - - // Do the initial IP permutation. - $t = unpack('Nl/Nr', $block); - list($l, $r) = [$t['l'], $t['r']]; - $block = ($shuffleip[ $r & 0xFF] & "\x80\x80\x80\x80\x80\x80\x80\x80") | - ($shuffleip[($r >> 8) & 0xFF] & "\x40\x40\x40\x40\x40\x40\x40\x40") | - ($shuffleip[($r >> 16) & 0xFF] & "\x20\x20\x20\x20\x20\x20\x20\x20") | - ($shuffleip[($r >> 24) & 0xFF] & "\x10\x10\x10\x10\x10\x10\x10\x10") | - ($shuffleip[ $l & 0xFF] & "\x08\x08\x08\x08\x08\x08\x08\x08") | - ($shuffleip[($l >> 8) & 0xFF] & "\x04\x04\x04\x04\x04\x04\x04\x04") | - ($shuffleip[($l >> 16) & 0xFF] & "\x02\x02\x02\x02\x02\x02\x02\x02") | - ($shuffleip[($l >> 24) & 0xFF] & "\x01\x01\x01\x01\x01\x01\x01\x01"); - - // Extract L0 and R0. - $t = unpack('Nl/Nr', $block); - list($l, $r) = [$t['l'], $t['r']]; - - for ($des_round = 0; $des_round < $this->des_rounds; ++$des_round) { - // Perform the 16 steps. - for ($i = 0; $i < 16; $i++) { - // start of "the Feistel (F) function" - see the following URL: - // http://en.wikipedia.org/wiki/Image:Data_Encryption_Standard_InfoBox_Diagram.png - // Merge key schedule. - $b1 = (($r >> 3) & 0x1FFFFFFF) ^ ($r << 29) ^ $keys[++$ki]; - $b2 = (($r >> 31) & 0x00000001) ^ ($r << 1) ^ $keys[++$ki]; - - // S-box indexing. - $t = $sbox1[($b1 >> 24) & 0x3F] ^ $sbox2[($b2 >> 24) & 0x3F] ^ - $sbox3[($b1 >> 16) & 0x3F] ^ $sbox4[($b2 >> 16) & 0x3F] ^ - $sbox5[($b1 >> 8) & 0x3F] ^ $sbox6[($b2 >> 8) & 0x3F] ^ - $sbox7[ $b1 & 0x3F] ^ $sbox8[ $b2 & 0x3F] ^ $l; - // end of "the Feistel (F) function" - - $l = $r; - $r = $t; - } - - // Last step should not permute L & R. - $t = $l; - $l = $r; - $r = $t; - } - - // Perform the inverse IP permutation. - return ($shuffleinvip[($r >> 24) & 0xFF] & "\x80\x80\x80\x80\x80\x80\x80\x80") | - ($shuffleinvip[($l >> 24) & 0xFF] & "\x40\x40\x40\x40\x40\x40\x40\x40") | - ($shuffleinvip[($r >> 16) & 0xFF] & "\x20\x20\x20\x20\x20\x20\x20\x20") | - ($shuffleinvip[($l >> 16) & 0xFF] & "\x10\x10\x10\x10\x10\x10\x10\x10") | - ($shuffleinvip[($r >> 8) & 0xFF] & "\x08\x08\x08\x08\x08\x08\x08\x08") | - ($shuffleinvip[($l >> 8) & 0xFF] & "\x04\x04\x04\x04\x04\x04\x04\x04") | - ($shuffleinvip[ $r & 0xFF] & "\x02\x02\x02\x02\x02\x02\x02\x02") | - ($shuffleinvip[ $l & 0xFF] & "\x01\x01\x01\x01\x01\x01\x01\x01"); - } - - /** - * Creates the key schedule - * - * @see Common\SymmetricKey::setupKey() - */ - protected function setupKey() - { - if (isset($this->kl['key']) && $this->key === $this->kl['key'] && $this->des_rounds === $this->kl['des_rounds']) { - // already expanded - return; - } - $this->kl = ['key' => $this->key, 'des_rounds' => $this->des_rounds]; - - static $shifts = [ // number of key bits shifted per round - 1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1 - ]; - - static $pc1map = [ - 0x00, 0x00, 0x08, 0x08, 0x04, 0x04, 0x0C, 0x0C, - 0x02, 0x02, 0x0A, 0x0A, 0x06, 0x06, 0x0E, 0x0E, - 0x10, 0x10, 0x18, 0x18, 0x14, 0x14, 0x1C, 0x1C, - 0x12, 0x12, 0x1A, 0x1A, 0x16, 0x16, 0x1E, 0x1E, - 0x20, 0x20, 0x28, 0x28, 0x24, 0x24, 0x2C, 0x2C, - 0x22, 0x22, 0x2A, 0x2A, 0x26, 0x26, 0x2E, 0x2E, - 0x30, 0x30, 0x38, 0x38, 0x34, 0x34, 0x3C, 0x3C, - 0x32, 0x32, 0x3A, 0x3A, 0x36, 0x36, 0x3E, 0x3E, - 0x40, 0x40, 0x48, 0x48, 0x44, 0x44, 0x4C, 0x4C, - 0x42, 0x42, 0x4A, 0x4A, 0x46, 0x46, 0x4E, 0x4E, - 0x50, 0x50, 0x58, 0x58, 0x54, 0x54, 0x5C, 0x5C, - 0x52, 0x52, 0x5A, 0x5A, 0x56, 0x56, 0x5E, 0x5E, - 0x60, 0x60, 0x68, 0x68, 0x64, 0x64, 0x6C, 0x6C, - 0x62, 0x62, 0x6A, 0x6A, 0x66, 0x66, 0x6E, 0x6E, - 0x70, 0x70, 0x78, 0x78, 0x74, 0x74, 0x7C, 0x7C, - 0x72, 0x72, 0x7A, 0x7A, 0x76, 0x76, 0x7E, 0x7E, - 0x80, 0x80, 0x88, 0x88, 0x84, 0x84, 0x8C, 0x8C, - 0x82, 0x82, 0x8A, 0x8A, 0x86, 0x86, 0x8E, 0x8E, - 0x90, 0x90, 0x98, 0x98, 0x94, 0x94, 0x9C, 0x9C, - 0x92, 0x92, 0x9A, 0x9A, 0x96, 0x96, 0x9E, 0x9E, - 0xA0, 0xA0, 0xA8, 0xA8, 0xA4, 0xA4, 0xAC, 0xAC, - 0xA2, 0xA2, 0xAA, 0xAA, 0xA6, 0xA6, 0xAE, 0xAE, - 0xB0, 0xB0, 0xB8, 0xB8, 0xB4, 0xB4, 0xBC, 0xBC, - 0xB2, 0xB2, 0xBA, 0xBA, 0xB6, 0xB6, 0xBE, 0xBE, - 0xC0, 0xC0, 0xC8, 0xC8, 0xC4, 0xC4, 0xCC, 0xCC, - 0xC2, 0xC2, 0xCA, 0xCA, 0xC6, 0xC6, 0xCE, 0xCE, - 0xD0, 0xD0, 0xD8, 0xD8, 0xD4, 0xD4, 0xDC, 0xDC, - 0xD2, 0xD2, 0xDA, 0xDA, 0xD6, 0xD6, 0xDE, 0xDE, - 0xE0, 0xE0, 0xE8, 0xE8, 0xE4, 0xE4, 0xEC, 0xEC, - 0xE2, 0xE2, 0xEA, 0xEA, 0xE6, 0xE6, 0xEE, 0xEE, - 0xF0, 0xF0, 0xF8, 0xF8, 0xF4, 0xF4, 0xFC, 0xFC, - 0xF2, 0xF2, 0xFA, 0xFA, 0xF6, 0xF6, 0xFE, 0xFE - ]; - - // Mapping tables for the PC-2 transformation. - static $pc2mapc1 = [ - 0x00000000, 0x00000400, 0x00200000, 0x00200400, - 0x00000001, 0x00000401, 0x00200001, 0x00200401, - 0x02000000, 0x02000400, 0x02200000, 0x02200400, - 0x02000001, 0x02000401, 0x02200001, 0x02200401 - ]; - static $pc2mapc2 = [ - 0x00000000, 0x00000800, 0x08000000, 0x08000800, - 0x00010000, 0x00010800, 0x08010000, 0x08010800, - 0x00000000, 0x00000800, 0x08000000, 0x08000800, - 0x00010000, 0x00010800, 0x08010000, 0x08010800, - 0x00000100, 0x00000900, 0x08000100, 0x08000900, - 0x00010100, 0x00010900, 0x08010100, 0x08010900, - 0x00000100, 0x00000900, 0x08000100, 0x08000900, - 0x00010100, 0x00010900, 0x08010100, 0x08010900, - 0x00000010, 0x00000810, 0x08000010, 0x08000810, - 0x00010010, 0x00010810, 0x08010010, 0x08010810, - 0x00000010, 0x00000810, 0x08000010, 0x08000810, - 0x00010010, 0x00010810, 0x08010010, 0x08010810, - 0x00000110, 0x00000910, 0x08000110, 0x08000910, - 0x00010110, 0x00010910, 0x08010110, 0x08010910, - 0x00000110, 0x00000910, 0x08000110, 0x08000910, - 0x00010110, 0x00010910, 0x08010110, 0x08010910, - 0x00040000, 0x00040800, 0x08040000, 0x08040800, - 0x00050000, 0x00050800, 0x08050000, 0x08050800, - 0x00040000, 0x00040800, 0x08040000, 0x08040800, - 0x00050000, 0x00050800, 0x08050000, 0x08050800, - 0x00040100, 0x00040900, 0x08040100, 0x08040900, - 0x00050100, 0x00050900, 0x08050100, 0x08050900, - 0x00040100, 0x00040900, 0x08040100, 0x08040900, - 0x00050100, 0x00050900, 0x08050100, 0x08050900, - 0x00040010, 0x00040810, 0x08040010, 0x08040810, - 0x00050010, 0x00050810, 0x08050010, 0x08050810, - 0x00040010, 0x00040810, 0x08040010, 0x08040810, - 0x00050010, 0x00050810, 0x08050010, 0x08050810, - 0x00040110, 0x00040910, 0x08040110, 0x08040910, - 0x00050110, 0x00050910, 0x08050110, 0x08050910, - 0x00040110, 0x00040910, 0x08040110, 0x08040910, - 0x00050110, 0x00050910, 0x08050110, 0x08050910, - 0x01000000, 0x01000800, 0x09000000, 0x09000800, - 0x01010000, 0x01010800, 0x09010000, 0x09010800, - 0x01000000, 0x01000800, 0x09000000, 0x09000800, - 0x01010000, 0x01010800, 0x09010000, 0x09010800, - 0x01000100, 0x01000900, 0x09000100, 0x09000900, - 0x01010100, 0x01010900, 0x09010100, 0x09010900, - 0x01000100, 0x01000900, 0x09000100, 0x09000900, - 0x01010100, 0x01010900, 0x09010100, 0x09010900, - 0x01000010, 0x01000810, 0x09000010, 0x09000810, - 0x01010010, 0x01010810, 0x09010010, 0x09010810, - 0x01000010, 0x01000810, 0x09000010, 0x09000810, - 0x01010010, 0x01010810, 0x09010010, 0x09010810, - 0x01000110, 0x01000910, 0x09000110, 0x09000910, - 0x01010110, 0x01010910, 0x09010110, 0x09010910, - 0x01000110, 0x01000910, 0x09000110, 0x09000910, - 0x01010110, 0x01010910, 0x09010110, 0x09010910, - 0x01040000, 0x01040800, 0x09040000, 0x09040800, - 0x01050000, 0x01050800, 0x09050000, 0x09050800, - 0x01040000, 0x01040800, 0x09040000, 0x09040800, - 0x01050000, 0x01050800, 0x09050000, 0x09050800, - 0x01040100, 0x01040900, 0x09040100, 0x09040900, - 0x01050100, 0x01050900, 0x09050100, 0x09050900, - 0x01040100, 0x01040900, 0x09040100, 0x09040900, - 0x01050100, 0x01050900, 0x09050100, 0x09050900, - 0x01040010, 0x01040810, 0x09040010, 0x09040810, - 0x01050010, 0x01050810, 0x09050010, 0x09050810, - 0x01040010, 0x01040810, 0x09040010, 0x09040810, - 0x01050010, 0x01050810, 0x09050010, 0x09050810, - 0x01040110, 0x01040910, 0x09040110, 0x09040910, - 0x01050110, 0x01050910, 0x09050110, 0x09050910, - 0x01040110, 0x01040910, 0x09040110, 0x09040910, - 0x01050110, 0x01050910, 0x09050110, 0x09050910 - ]; - static $pc2mapc3 = [ - 0x00000000, 0x00000004, 0x00001000, 0x00001004, - 0x00000000, 0x00000004, 0x00001000, 0x00001004, - 0x10000000, 0x10000004, 0x10001000, 0x10001004, - 0x10000000, 0x10000004, 0x10001000, 0x10001004, - 0x00000020, 0x00000024, 0x00001020, 0x00001024, - 0x00000020, 0x00000024, 0x00001020, 0x00001024, - 0x10000020, 0x10000024, 0x10001020, 0x10001024, - 0x10000020, 0x10000024, 0x10001020, 0x10001024, - 0x00080000, 0x00080004, 0x00081000, 0x00081004, - 0x00080000, 0x00080004, 0x00081000, 0x00081004, - 0x10080000, 0x10080004, 0x10081000, 0x10081004, - 0x10080000, 0x10080004, 0x10081000, 0x10081004, - 0x00080020, 0x00080024, 0x00081020, 0x00081024, - 0x00080020, 0x00080024, 0x00081020, 0x00081024, - 0x10080020, 0x10080024, 0x10081020, 0x10081024, - 0x10080020, 0x10080024, 0x10081020, 0x10081024, - 0x20000000, 0x20000004, 0x20001000, 0x20001004, - 0x20000000, 0x20000004, 0x20001000, 0x20001004, - 0x30000000, 0x30000004, 0x30001000, 0x30001004, - 0x30000000, 0x30000004, 0x30001000, 0x30001004, - 0x20000020, 0x20000024, 0x20001020, 0x20001024, - 0x20000020, 0x20000024, 0x20001020, 0x20001024, - 0x30000020, 0x30000024, 0x30001020, 0x30001024, - 0x30000020, 0x30000024, 0x30001020, 0x30001024, - 0x20080000, 0x20080004, 0x20081000, 0x20081004, - 0x20080000, 0x20080004, 0x20081000, 0x20081004, - 0x30080000, 0x30080004, 0x30081000, 0x30081004, - 0x30080000, 0x30080004, 0x30081000, 0x30081004, - 0x20080020, 0x20080024, 0x20081020, 0x20081024, - 0x20080020, 0x20080024, 0x20081020, 0x20081024, - 0x30080020, 0x30080024, 0x30081020, 0x30081024, - 0x30080020, 0x30080024, 0x30081020, 0x30081024, - 0x00000002, 0x00000006, 0x00001002, 0x00001006, - 0x00000002, 0x00000006, 0x00001002, 0x00001006, - 0x10000002, 0x10000006, 0x10001002, 0x10001006, - 0x10000002, 0x10000006, 0x10001002, 0x10001006, - 0x00000022, 0x00000026, 0x00001022, 0x00001026, - 0x00000022, 0x00000026, 0x00001022, 0x00001026, - 0x10000022, 0x10000026, 0x10001022, 0x10001026, - 0x10000022, 0x10000026, 0x10001022, 0x10001026, - 0x00080002, 0x00080006, 0x00081002, 0x00081006, - 0x00080002, 0x00080006, 0x00081002, 0x00081006, - 0x10080002, 0x10080006, 0x10081002, 0x10081006, - 0x10080002, 0x10080006, 0x10081002, 0x10081006, - 0x00080022, 0x00080026, 0x00081022, 0x00081026, - 0x00080022, 0x00080026, 0x00081022, 0x00081026, - 0x10080022, 0x10080026, 0x10081022, 0x10081026, - 0x10080022, 0x10080026, 0x10081022, 0x10081026, - 0x20000002, 0x20000006, 0x20001002, 0x20001006, - 0x20000002, 0x20000006, 0x20001002, 0x20001006, - 0x30000002, 0x30000006, 0x30001002, 0x30001006, - 0x30000002, 0x30000006, 0x30001002, 0x30001006, - 0x20000022, 0x20000026, 0x20001022, 0x20001026, - 0x20000022, 0x20000026, 0x20001022, 0x20001026, - 0x30000022, 0x30000026, 0x30001022, 0x30001026, - 0x30000022, 0x30000026, 0x30001022, 0x30001026, - 0x20080002, 0x20080006, 0x20081002, 0x20081006, - 0x20080002, 0x20080006, 0x20081002, 0x20081006, - 0x30080002, 0x30080006, 0x30081002, 0x30081006, - 0x30080002, 0x30080006, 0x30081002, 0x30081006, - 0x20080022, 0x20080026, 0x20081022, 0x20081026, - 0x20080022, 0x20080026, 0x20081022, 0x20081026, - 0x30080022, 0x30080026, 0x30081022, 0x30081026, - 0x30080022, 0x30080026, 0x30081022, 0x30081026 - ]; - static $pc2mapc4 = [ - 0x00000000, 0x00100000, 0x00000008, 0x00100008, - 0x00000200, 0x00100200, 0x00000208, 0x00100208, - 0x00000000, 0x00100000, 0x00000008, 0x00100008, - 0x00000200, 0x00100200, 0x00000208, 0x00100208, - 0x04000000, 0x04100000, 0x04000008, 0x04100008, - 0x04000200, 0x04100200, 0x04000208, 0x04100208, - 0x04000000, 0x04100000, 0x04000008, 0x04100008, - 0x04000200, 0x04100200, 0x04000208, 0x04100208, - 0x00002000, 0x00102000, 0x00002008, 0x00102008, - 0x00002200, 0x00102200, 0x00002208, 0x00102208, - 0x00002000, 0x00102000, 0x00002008, 0x00102008, - 0x00002200, 0x00102200, 0x00002208, 0x00102208, - 0x04002000, 0x04102000, 0x04002008, 0x04102008, - 0x04002200, 0x04102200, 0x04002208, 0x04102208, - 0x04002000, 0x04102000, 0x04002008, 0x04102008, - 0x04002200, 0x04102200, 0x04002208, 0x04102208, - 0x00000000, 0x00100000, 0x00000008, 0x00100008, - 0x00000200, 0x00100200, 0x00000208, 0x00100208, - 0x00000000, 0x00100000, 0x00000008, 0x00100008, - 0x00000200, 0x00100200, 0x00000208, 0x00100208, - 0x04000000, 0x04100000, 0x04000008, 0x04100008, - 0x04000200, 0x04100200, 0x04000208, 0x04100208, - 0x04000000, 0x04100000, 0x04000008, 0x04100008, - 0x04000200, 0x04100200, 0x04000208, 0x04100208, - 0x00002000, 0x00102000, 0x00002008, 0x00102008, - 0x00002200, 0x00102200, 0x00002208, 0x00102208, - 0x00002000, 0x00102000, 0x00002008, 0x00102008, - 0x00002200, 0x00102200, 0x00002208, 0x00102208, - 0x04002000, 0x04102000, 0x04002008, 0x04102008, - 0x04002200, 0x04102200, 0x04002208, 0x04102208, - 0x04002000, 0x04102000, 0x04002008, 0x04102008, - 0x04002200, 0x04102200, 0x04002208, 0x04102208, - 0x00020000, 0x00120000, 0x00020008, 0x00120008, - 0x00020200, 0x00120200, 0x00020208, 0x00120208, - 0x00020000, 0x00120000, 0x00020008, 0x00120008, - 0x00020200, 0x00120200, 0x00020208, 0x00120208, - 0x04020000, 0x04120000, 0x04020008, 0x04120008, - 0x04020200, 0x04120200, 0x04020208, 0x04120208, - 0x04020000, 0x04120000, 0x04020008, 0x04120008, - 0x04020200, 0x04120200, 0x04020208, 0x04120208, - 0x00022000, 0x00122000, 0x00022008, 0x00122008, - 0x00022200, 0x00122200, 0x00022208, 0x00122208, - 0x00022000, 0x00122000, 0x00022008, 0x00122008, - 0x00022200, 0x00122200, 0x00022208, 0x00122208, - 0x04022000, 0x04122000, 0x04022008, 0x04122008, - 0x04022200, 0x04122200, 0x04022208, 0x04122208, - 0x04022000, 0x04122000, 0x04022008, 0x04122008, - 0x04022200, 0x04122200, 0x04022208, 0x04122208, - 0x00020000, 0x00120000, 0x00020008, 0x00120008, - 0x00020200, 0x00120200, 0x00020208, 0x00120208, - 0x00020000, 0x00120000, 0x00020008, 0x00120008, - 0x00020200, 0x00120200, 0x00020208, 0x00120208, - 0x04020000, 0x04120000, 0x04020008, 0x04120008, - 0x04020200, 0x04120200, 0x04020208, 0x04120208, - 0x04020000, 0x04120000, 0x04020008, 0x04120008, - 0x04020200, 0x04120200, 0x04020208, 0x04120208, - 0x00022000, 0x00122000, 0x00022008, 0x00122008, - 0x00022200, 0x00122200, 0x00022208, 0x00122208, - 0x00022000, 0x00122000, 0x00022008, 0x00122008, - 0x00022200, 0x00122200, 0x00022208, 0x00122208, - 0x04022000, 0x04122000, 0x04022008, 0x04122008, - 0x04022200, 0x04122200, 0x04022208, 0x04122208, - 0x04022000, 0x04122000, 0x04022008, 0x04122008, - 0x04022200, 0x04122200, 0x04022208, 0x04122208 - ]; - static $pc2mapd1 = [ - 0x00000000, 0x00000001, 0x08000000, 0x08000001, - 0x00200000, 0x00200001, 0x08200000, 0x08200001, - 0x00000002, 0x00000003, 0x08000002, 0x08000003, - 0x00200002, 0x00200003, 0x08200002, 0x08200003 - ]; - static $pc2mapd2 = [ - 0x00000000, 0x00100000, 0x00000800, 0x00100800, - 0x00000000, 0x00100000, 0x00000800, 0x00100800, - 0x04000000, 0x04100000, 0x04000800, 0x04100800, - 0x04000000, 0x04100000, 0x04000800, 0x04100800, - 0x00000004, 0x00100004, 0x00000804, 0x00100804, - 0x00000004, 0x00100004, 0x00000804, 0x00100804, - 0x04000004, 0x04100004, 0x04000804, 0x04100804, - 0x04000004, 0x04100004, 0x04000804, 0x04100804, - 0x00000000, 0x00100000, 0x00000800, 0x00100800, - 0x00000000, 0x00100000, 0x00000800, 0x00100800, - 0x04000000, 0x04100000, 0x04000800, 0x04100800, - 0x04000000, 0x04100000, 0x04000800, 0x04100800, - 0x00000004, 0x00100004, 0x00000804, 0x00100804, - 0x00000004, 0x00100004, 0x00000804, 0x00100804, - 0x04000004, 0x04100004, 0x04000804, 0x04100804, - 0x04000004, 0x04100004, 0x04000804, 0x04100804, - 0x00000200, 0x00100200, 0x00000A00, 0x00100A00, - 0x00000200, 0x00100200, 0x00000A00, 0x00100A00, - 0x04000200, 0x04100200, 0x04000A00, 0x04100A00, - 0x04000200, 0x04100200, 0x04000A00, 0x04100A00, - 0x00000204, 0x00100204, 0x00000A04, 0x00100A04, - 0x00000204, 0x00100204, 0x00000A04, 0x00100A04, - 0x04000204, 0x04100204, 0x04000A04, 0x04100A04, - 0x04000204, 0x04100204, 0x04000A04, 0x04100A04, - 0x00000200, 0x00100200, 0x00000A00, 0x00100A00, - 0x00000200, 0x00100200, 0x00000A00, 0x00100A00, - 0x04000200, 0x04100200, 0x04000A00, 0x04100A00, - 0x04000200, 0x04100200, 0x04000A00, 0x04100A00, - 0x00000204, 0x00100204, 0x00000A04, 0x00100A04, - 0x00000204, 0x00100204, 0x00000A04, 0x00100A04, - 0x04000204, 0x04100204, 0x04000A04, 0x04100A04, - 0x04000204, 0x04100204, 0x04000A04, 0x04100A04, - 0x00020000, 0x00120000, 0x00020800, 0x00120800, - 0x00020000, 0x00120000, 0x00020800, 0x00120800, - 0x04020000, 0x04120000, 0x04020800, 0x04120800, - 0x04020000, 0x04120000, 0x04020800, 0x04120800, - 0x00020004, 0x00120004, 0x00020804, 0x00120804, - 0x00020004, 0x00120004, 0x00020804, 0x00120804, - 0x04020004, 0x04120004, 0x04020804, 0x04120804, - 0x04020004, 0x04120004, 0x04020804, 0x04120804, - 0x00020000, 0x00120000, 0x00020800, 0x00120800, - 0x00020000, 0x00120000, 0x00020800, 0x00120800, - 0x04020000, 0x04120000, 0x04020800, 0x04120800, - 0x04020000, 0x04120000, 0x04020800, 0x04120800, - 0x00020004, 0x00120004, 0x00020804, 0x00120804, - 0x00020004, 0x00120004, 0x00020804, 0x00120804, - 0x04020004, 0x04120004, 0x04020804, 0x04120804, - 0x04020004, 0x04120004, 0x04020804, 0x04120804, - 0x00020200, 0x00120200, 0x00020A00, 0x00120A00, - 0x00020200, 0x00120200, 0x00020A00, 0x00120A00, - 0x04020200, 0x04120200, 0x04020A00, 0x04120A00, - 0x04020200, 0x04120200, 0x04020A00, 0x04120A00, - 0x00020204, 0x00120204, 0x00020A04, 0x00120A04, - 0x00020204, 0x00120204, 0x00020A04, 0x00120A04, - 0x04020204, 0x04120204, 0x04020A04, 0x04120A04, - 0x04020204, 0x04120204, 0x04020A04, 0x04120A04, - 0x00020200, 0x00120200, 0x00020A00, 0x00120A00, - 0x00020200, 0x00120200, 0x00020A00, 0x00120A00, - 0x04020200, 0x04120200, 0x04020A00, 0x04120A00, - 0x04020200, 0x04120200, 0x04020A00, 0x04120A00, - 0x00020204, 0x00120204, 0x00020A04, 0x00120A04, - 0x00020204, 0x00120204, 0x00020A04, 0x00120A04, - 0x04020204, 0x04120204, 0x04020A04, 0x04120A04, - 0x04020204, 0x04120204, 0x04020A04, 0x04120A04 - ]; - static $pc2mapd3 = [ - 0x00000000, 0x00010000, 0x02000000, 0x02010000, - 0x00000020, 0x00010020, 0x02000020, 0x02010020, - 0x00040000, 0x00050000, 0x02040000, 0x02050000, - 0x00040020, 0x00050020, 0x02040020, 0x02050020, - 0x00002000, 0x00012000, 0x02002000, 0x02012000, - 0x00002020, 0x00012020, 0x02002020, 0x02012020, - 0x00042000, 0x00052000, 0x02042000, 0x02052000, - 0x00042020, 0x00052020, 0x02042020, 0x02052020, - 0x00000000, 0x00010000, 0x02000000, 0x02010000, - 0x00000020, 0x00010020, 0x02000020, 0x02010020, - 0x00040000, 0x00050000, 0x02040000, 0x02050000, - 0x00040020, 0x00050020, 0x02040020, 0x02050020, - 0x00002000, 0x00012000, 0x02002000, 0x02012000, - 0x00002020, 0x00012020, 0x02002020, 0x02012020, - 0x00042000, 0x00052000, 0x02042000, 0x02052000, - 0x00042020, 0x00052020, 0x02042020, 0x02052020, - 0x00000010, 0x00010010, 0x02000010, 0x02010010, - 0x00000030, 0x00010030, 0x02000030, 0x02010030, - 0x00040010, 0x00050010, 0x02040010, 0x02050010, - 0x00040030, 0x00050030, 0x02040030, 0x02050030, - 0x00002010, 0x00012010, 0x02002010, 0x02012010, - 0x00002030, 0x00012030, 0x02002030, 0x02012030, - 0x00042010, 0x00052010, 0x02042010, 0x02052010, - 0x00042030, 0x00052030, 0x02042030, 0x02052030, - 0x00000010, 0x00010010, 0x02000010, 0x02010010, - 0x00000030, 0x00010030, 0x02000030, 0x02010030, - 0x00040010, 0x00050010, 0x02040010, 0x02050010, - 0x00040030, 0x00050030, 0x02040030, 0x02050030, - 0x00002010, 0x00012010, 0x02002010, 0x02012010, - 0x00002030, 0x00012030, 0x02002030, 0x02012030, - 0x00042010, 0x00052010, 0x02042010, 0x02052010, - 0x00042030, 0x00052030, 0x02042030, 0x02052030, - 0x20000000, 0x20010000, 0x22000000, 0x22010000, - 0x20000020, 0x20010020, 0x22000020, 0x22010020, - 0x20040000, 0x20050000, 0x22040000, 0x22050000, - 0x20040020, 0x20050020, 0x22040020, 0x22050020, - 0x20002000, 0x20012000, 0x22002000, 0x22012000, - 0x20002020, 0x20012020, 0x22002020, 0x22012020, - 0x20042000, 0x20052000, 0x22042000, 0x22052000, - 0x20042020, 0x20052020, 0x22042020, 0x22052020, - 0x20000000, 0x20010000, 0x22000000, 0x22010000, - 0x20000020, 0x20010020, 0x22000020, 0x22010020, - 0x20040000, 0x20050000, 0x22040000, 0x22050000, - 0x20040020, 0x20050020, 0x22040020, 0x22050020, - 0x20002000, 0x20012000, 0x22002000, 0x22012000, - 0x20002020, 0x20012020, 0x22002020, 0x22012020, - 0x20042000, 0x20052000, 0x22042000, 0x22052000, - 0x20042020, 0x20052020, 0x22042020, 0x22052020, - 0x20000010, 0x20010010, 0x22000010, 0x22010010, - 0x20000030, 0x20010030, 0x22000030, 0x22010030, - 0x20040010, 0x20050010, 0x22040010, 0x22050010, - 0x20040030, 0x20050030, 0x22040030, 0x22050030, - 0x20002010, 0x20012010, 0x22002010, 0x22012010, - 0x20002030, 0x20012030, 0x22002030, 0x22012030, - 0x20042010, 0x20052010, 0x22042010, 0x22052010, - 0x20042030, 0x20052030, 0x22042030, 0x22052030, - 0x20000010, 0x20010010, 0x22000010, 0x22010010, - 0x20000030, 0x20010030, 0x22000030, 0x22010030, - 0x20040010, 0x20050010, 0x22040010, 0x22050010, - 0x20040030, 0x20050030, 0x22040030, 0x22050030, - 0x20002010, 0x20012010, 0x22002010, 0x22012010, - 0x20002030, 0x20012030, 0x22002030, 0x22012030, - 0x20042010, 0x20052010, 0x22042010, 0x22052010, - 0x20042030, 0x20052030, 0x22042030, 0x22052030 - ]; - static $pc2mapd4 = [ - 0x00000000, 0x00000400, 0x01000000, 0x01000400, - 0x00000000, 0x00000400, 0x01000000, 0x01000400, - 0x00000100, 0x00000500, 0x01000100, 0x01000500, - 0x00000100, 0x00000500, 0x01000100, 0x01000500, - 0x10000000, 0x10000400, 0x11000000, 0x11000400, - 0x10000000, 0x10000400, 0x11000000, 0x11000400, - 0x10000100, 0x10000500, 0x11000100, 0x11000500, - 0x10000100, 0x10000500, 0x11000100, 0x11000500, - 0x00080000, 0x00080400, 0x01080000, 0x01080400, - 0x00080000, 0x00080400, 0x01080000, 0x01080400, - 0x00080100, 0x00080500, 0x01080100, 0x01080500, - 0x00080100, 0x00080500, 0x01080100, 0x01080500, - 0x10080000, 0x10080400, 0x11080000, 0x11080400, - 0x10080000, 0x10080400, 0x11080000, 0x11080400, - 0x10080100, 0x10080500, 0x11080100, 0x11080500, - 0x10080100, 0x10080500, 0x11080100, 0x11080500, - 0x00000008, 0x00000408, 0x01000008, 0x01000408, - 0x00000008, 0x00000408, 0x01000008, 0x01000408, - 0x00000108, 0x00000508, 0x01000108, 0x01000508, - 0x00000108, 0x00000508, 0x01000108, 0x01000508, - 0x10000008, 0x10000408, 0x11000008, 0x11000408, - 0x10000008, 0x10000408, 0x11000008, 0x11000408, - 0x10000108, 0x10000508, 0x11000108, 0x11000508, - 0x10000108, 0x10000508, 0x11000108, 0x11000508, - 0x00080008, 0x00080408, 0x01080008, 0x01080408, - 0x00080008, 0x00080408, 0x01080008, 0x01080408, - 0x00080108, 0x00080508, 0x01080108, 0x01080508, - 0x00080108, 0x00080508, 0x01080108, 0x01080508, - 0x10080008, 0x10080408, 0x11080008, 0x11080408, - 0x10080008, 0x10080408, 0x11080008, 0x11080408, - 0x10080108, 0x10080508, 0x11080108, 0x11080508, - 0x10080108, 0x10080508, 0x11080108, 0x11080508, - 0x00001000, 0x00001400, 0x01001000, 0x01001400, - 0x00001000, 0x00001400, 0x01001000, 0x01001400, - 0x00001100, 0x00001500, 0x01001100, 0x01001500, - 0x00001100, 0x00001500, 0x01001100, 0x01001500, - 0x10001000, 0x10001400, 0x11001000, 0x11001400, - 0x10001000, 0x10001400, 0x11001000, 0x11001400, - 0x10001100, 0x10001500, 0x11001100, 0x11001500, - 0x10001100, 0x10001500, 0x11001100, 0x11001500, - 0x00081000, 0x00081400, 0x01081000, 0x01081400, - 0x00081000, 0x00081400, 0x01081000, 0x01081400, - 0x00081100, 0x00081500, 0x01081100, 0x01081500, - 0x00081100, 0x00081500, 0x01081100, 0x01081500, - 0x10081000, 0x10081400, 0x11081000, 0x11081400, - 0x10081000, 0x10081400, 0x11081000, 0x11081400, - 0x10081100, 0x10081500, 0x11081100, 0x11081500, - 0x10081100, 0x10081500, 0x11081100, 0x11081500, - 0x00001008, 0x00001408, 0x01001008, 0x01001408, - 0x00001008, 0x00001408, 0x01001008, 0x01001408, - 0x00001108, 0x00001508, 0x01001108, 0x01001508, - 0x00001108, 0x00001508, 0x01001108, 0x01001508, - 0x10001008, 0x10001408, 0x11001008, 0x11001408, - 0x10001008, 0x10001408, 0x11001008, 0x11001408, - 0x10001108, 0x10001508, 0x11001108, 0x11001508, - 0x10001108, 0x10001508, 0x11001108, 0x11001508, - 0x00081008, 0x00081408, 0x01081008, 0x01081408, - 0x00081008, 0x00081408, 0x01081008, 0x01081408, - 0x00081108, 0x00081508, 0x01081108, 0x01081508, - 0x00081108, 0x00081508, 0x01081108, 0x01081508, - 0x10081008, 0x10081408, 0x11081008, 0x11081408, - 0x10081008, 0x10081408, 0x11081008, 0x11081408, - 0x10081108, 0x10081508, 0x11081108, 0x11081508, - 0x10081108, 0x10081508, 0x11081108, 0x11081508 - ]; - - $keys = []; - for ($des_round = 0; $des_round < $this->des_rounds; ++$des_round) { - // pad the key and remove extra characters as appropriate. - $key = str_pad(substr($this->key, $des_round * 8, 8), 8, "\0"); - - // Perform the PC/1 transformation and compute C and D. - $t = unpack('Nl/Nr', $key); - list($l, $r) = [$t['l'], $t['r']]; - $key = (self::$shuffle[$pc1map[ $r & 0xFF]] & "\x80\x80\x80\x80\x80\x80\x80\x00") | - (self::$shuffle[$pc1map[($r >> 8) & 0xFF]] & "\x40\x40\x40\x40\x40\x40\x40\x00") | - (self::$shuffle[$pc1map[($r >> 16) & 0xFF]] & "\x20\x20\x20\x20\x20\x20\x20\x00") | - (self::$shuffle[$pc1map[($r >> 24) & 0xFF]] & "\x10\x10\x10\x10\x10\x10\x10\x00") | - (self::$shuffle[$pc1map[ $l & 0xFF]] & "\x08\x08\x08\x08\x08\x08\x08\x00") | - (self::$shuffle[$pc1map[($l >> 8) & 0xFF]] & "\x04\x04\x04\x04\x04\x04\x04\x00") | - (self::$shuffle[$pc1map[($l >> 16) & 0xFF]] & "\x02\x02\x02\x02\x02\x02\x02\x00") | - (self::$shuffle[$pc1map[($l >> 24) & 0xFF]] & "\x01\x01\x01\x01\x01\x01\x01\x00"); - $key = unpack('Nc/Nd', $key); - $c = ( $key['c'] >> 4) & 0x0FFFFFFF; - $d = (($key['d'] >> 4) & 0x0FFFFFF0) | ($key['c'] & 0x0F); - - $keys[$des_round] = [ - self::ENCRYPT => [], - self::DECRYPT => array_fill(0, 32, 0) - ]; - for ($i = 0, $ki = 31; $i < 16; ++$i, $ki -= 2) { - $c <<= $shifts[$i]; - $c = ($c | ($c >> 28)) & 0x0FFFFFFF; - $d <<= $shifts[$i]; - $d = ($d | ($d >> 28)) & 0x0FFFFFFF; - - // Perform the PC-2 transformation. - $cp = $pc2mapc1[ $c >> 24 ] | $pc2mapc2[($c >> 16) & 0xFF] | - $pc2mapc3[($c >> 8) & 0xFF] | $pc2mapc4[ $c & 0xFF]; - $dp = $pc2mapd1[ $d >> 24 ] | $pc2mapd2[($d >> 16) & 0xFF] | - $pc2mapd3[($d >> 8) & 0xFF] | $pc2mapd4[ $d & 0xFF]; - - // Reorder: odd bytes/even bytes. Push the result in key schedule. - $val1 = ( $cp & intval(0xFF000000)) | (($cp << 8) & 0x00FF0000) | - (($dp >> 16) & 0x0000FF00) | (($dp >> 8) & 0x000000FF); - $val2 = (($cp << 8) & intval(0xFF000000)) | (($cp << 16) & 0x00FF0000) | - (($dp >> 8) & 0x0000FF00) | ( $dp & 0x000000FF); - $keys[$des_round][self::ENCRYPT][ ] = $val1; - $keys[$des_round][self::DECRYPT][$ki - 1] = $val1; - $keys[$des_round][self::ENCRYPT][ ] = $val2; - $keys[$des_round][self::DECRYPT][$ki ] = $val2; - } - } - - switch ($this->des_rounds) { - case 3: // 3DES keys - $this->keys = [ - self::ENCRYPT => array_merge( - $keys[0][self::ENCRYPT], - $keys[1][self::DECRYPT], - $keys[2][self::ENCRYPT] - ), - self::DECRYPT => array_merge( - $keys[2][self::DECRYPT], - $keys[1][self::ENCRYPT], - $keys[0][self::DECRYPT] - ) - ]; - break; - // case 1: // DES keys - default: - $this->keys = [ - self::ENCRYPT => $keys[0][self::ENCRYPT], - self::DECRYPT => $keys[0][self::DECRYPT] - ]; - } - } - - /** - * Setup the performance-optimized function for de/encrypt() - * - * @see Common\SymmetricKey::setupInlineCrypt() - */ - protected function setupInlineCrypt() - { - // Engine configuration for: - // - DES ($des_rounds == 1) or - // - 3DES ($des_rounds == 3) - $des_rounds = $this->des_rounds; - - $init_crypt = 'static $sbox1, $sbox2, $sbox3, $sbox4, $sbox5, $sbox6, $sbox7, $sbox8, $shuffleip, $shuffleinvip; - if (!$sbox1) { - $sbox1 = array_map("intval", self::$sbox1); - $sbox2 = array_map("intval", self::$sbox2); - $sbox3 = array_map("intval", self::$sbox3); - $sbox4 = array_map("intval", self::$sbox4); - $sbox5 = array_map("intval", self::$sbox5); - $sbox6 = array_map("intval", self::$sbox6); - $sbox7 = array_map("intval", self::$sbox7); - $sbox8 = array_map("intval", self::$sbox8);' - /* Merge $shuffle with $[inv]ipmap */ . ' - for ($i = 0; $i < 256; ++$i) { - $shuffleip[] = self::$shuffle[self::$ipmap[$i]]; - $shuffleinvip[] = self::$shuffle[self::$invipmap[$i]]; - } - } - '; - - $k = [ - self::ENCRYPT => $this->keys[self::ENCRYPT], - self::DECRYPT => $this->keys[self::DECRYPT] - ]; - $init_encrypt = ''; - $init_decrypt = ''; - - // Creating code for en- and decryption. - $crypt_block = []; - foreach ([self::ENCRYPT, self::DECRYPT] as $c) { - /* Do the initial IP permutation. */ - $crypt_block[$c] = ' - $in = unpack("N*", $in); - $l = $in[1]; - $r = $in[2]; - $in = unpack("N*", - ($shuffleip[ $r & 0xFF] & "\x80\x80\x80\x80\x80\x80\x80\x80") | - ($shuffleip[($r >> 8) & 0xFF] & "\x40\x40\x40\x40\x40\x40\x40\x40") | - ($shuffleip[($r >> 16) & 0xFF] & "\x20\x20\x20\x20\x20\x20\x20\x20") | - ($shuffleip[($r >> 24) & 0xFF] & "\x10\x10\x10\x10\x10\x10\x10\x10") | - ($shuffleip[ $l & 0xFF] & "\x08\x08\x08\x08\x08\x08\x08\x08") | - ($shuffleip[($l >> 8) & 0xFF] & "\x04\x04\x04\x04\x04\x04\x04\x04") | - ($shuffleip[($l >> 16) & 0xFF] & "\x02\x02\x02\x02\x02\x02\x02\x02") | - ($shuffleip[($l >> 24) & 0xFF] & "\x01\x01\x01\x01\x01\x01\x01\x01") - ); - ' . /* Extract L0 and R0 */ ' - $l = $in[1]; - $r = $in[2]; - '; - - $l = '$l'; - $r = '$r'; - - // Perform DES or 3DES. - for ($ki = -1, $des_round = 0; $des_round < $des_rounds; ++$des_round) { - // Perform the 16 steps. - for ($i = 0; $i < 16; ++$i) { - // start of "the Feistel (F) function" - see the following URL: - // http://en.wikipedia.org/wiki/Image:Data_Encryption_Standard_InfoBox_Diagram.png - // Merge key schedule. - $crypt_block[$c] .= ' - $b1 = ((' . $r . ' >> 3) & 0x1FFFFFFF) ^ (' . $r . ' << 29) ^ ' . $k[$c][++$ki] . '; - $b2 = ((' . $r . ' >> 31) & 0x00000001) ^ (' . $r . ' << 1) ^ ' . $k[$c][++$ki] . ';' . - /* S-box indexing. */ - $l . ' = $sbox1[($b1 >> 24) & 0x3F] ^ $sbox2[($b2 >> 24) & 0x3F] ^ - $sbox3[($b1 >> 16) & 0x3F] ^ $sbox4[($b2 >> 16) & 0x3F] ^ - $sbox5[($b1 >> 8) & 0x3F] ^ $sbox6[($b2 >> 8) & 0x3F] ^ - $sbox7[ $b1 & 0x3F] ^ $sbox8[ $b2 & 0x3F] ^ ' . $l . '; - '; - // end of "the Feistel (F) function" - - // swap L & R - list($l, $r) = [$r, $l]; - } - list($l, $r) = [$r, $l]; - } - - // Perform the inverse IP permutation. - $crypt_block[$c] .= '$in = - ($shuffleinvip[($l >> 24) & 0xFF] & "\x80\x80\x80\x80\x80\x80\x80\x80") | - ($shuffleinvip[($r >> 24) & 0xFF] & "\x40\x40\x40\x40\x40\x40\x40\x40") | - ($shuffleinvip[($l >> 16) & 0xFF] & "\x20\x20\x20\x20\x20\x20\x20\x20") | - ($shuffleinvip[($r >> 16) & 0xFF] & "\x10\x10\x10\x10\x10\x10\x10\x10") | - ($shuffleinvip[($l >> 8) & 0xFF] & "\x08\x08\x08\x08\x08\x08\x08\x08") | - ($shuffleinvip[($r >> 8) & 0xFF] & "\x04\x04\x04\x04\x04\x04\x04\x04") | - ($shuffleinvip[ $l & 0xFF] & "\x02\x02\x02\x02\x02\x02\x02\x02") | - ($shuffleinvip[ $r & 0xFF] & "\x01\x01\x01\x01\x01\x01\x01\x01"); - '; - } - - // Creates the inline-crypt function - $this->inline_crypt = $this->createInlineCryptFunction( - [ - 'init_crypt' => $init_crypt, - 'init_encrypt' => $init_encrypt, - 'init_decrypt' => $init_decrypt, - 'encrypt_block' => $crypt_block[self::ENCRYPT], - 'decrypt_block' => $crypt_block[self::DECRYPT] - ] - ); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/DH.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/DH.php deleted file mode 100644 index f1bde41..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/DH.php +++ /dev/null @@ -1,405 +0,0 @@ - - * - * - * - * @author Jim Wigginton - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\AsymmetricKey; -use OCA\Libresign\Vendor\phpseclib3\Crypt\DH\Parameters; -use OCA\Libresign\Vendor\phpseclib3\Crypt\DH\PrivateKey; -use OCA\Libresign\Vendor\phpseclib3\Crypt\DH\PublicKey; -use OCA\Libresign\Vendor\phpseclib3\Exception\NoKeyLoadedException; -use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedOperationException; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * Pure-PHP (EC)DH implementation - * - * @author Jim Wigginton - */ -abstract class DH extends AsymmetricKey -{ - /** - * Algorithm Name - * - * @var string - */ - const ALGORITHM = 'DH'; - - /** - * DH prime - * - * @var BigInteger - */ - protected $prime; - - /** - * DH Base - * - * Prime divisor of p-1 - * - * @var BigInteger - */ - protected $base; - - /** - * Public Key - * - * @var BigInteger - */ - protected $publicKey; - - /** - * Create DH parameters - * - * This method is a bit polymorphic. It can take any of the following: - * - two BigInteger's (prime and base) - * - an integer representing the size of the prime in bits (the base is assumed to be 2) - * - a string (eg. diffie-hellman-group14-sha1) - * - * @return Parameters - */ - public static function createParameters(...$args) - { - $class = new \ReflectionClass(static::class); - if ($class->isFinal()) { - throw new \RuntimeException('createParameters() should not be called from final classes (' . static::class . ')'); - } - - $params = new Parameters(); - if (count($args) == 2 && $args[0] instanceof BigInteger && $args[1] instanceof BigInteger) { - //if (!$args[0]->isPrime()) { - // throw new \InvalidArgumentException('The first parameter should be a prime number'); - //} - $params->prime = $args[0]; - $params->base = $args[1]; - return $params; - } elseif (count($args) == 1 && is_numeric($args[0])) { - $params->prime = BigInteger::randomPrime($args[0]); - $params->base = new BigInteger(2); - return $params; - } elseif (count($args) != 1 || !is_string($args[0])) { - throw new \InvalidArgumentException('Valid parameters are either: two BigInteger\'s (prime and base), a single integer (the length of the prime; base is assumed to be 2) or a string'); - } - switch ($args[0]) { - // see http://tools.ietf.org/html/rfc2409#section-6.2 and - // http://tools.ietf.org/html/rfc2412, appendex E - case 'diffie-hellman-group1-sha1': - $prime = 'FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74' . - '020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437' . - '4FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED' . - 'EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE65381FFFFFFFFFFFFFFFF'; - break; - // see http://tools.ietf.org/html/rfc3526#section-3 - case 'diffie-hellman-group14-sha1': // 2048-bit MODP Group - case 'diffie-hellman-group14-sha256': - $prime = 'FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74' . - '020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437' . - '4FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED' . - 'EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF05' . - '98DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB' . - '9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B' . - 'E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718' . - '3995497CEA956AE515D2261898FA051015728E5A8AACAA68FFFFFFFFFFFFFFFF'; - break; - // see https://tools.ietf.org/html/rfc3526#section-4 - case 'diffie-hellman-group15-sha512': // 3072-bit MODP Group - $prime = 'FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74' . - '020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437' . - '4FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED' . - 'EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF05' . - '98DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB' . - '9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B' . - 'E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718' . - '3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D04507A33' . - 'A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7' . - 'ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6BF12FFA06D98A0864' . - 'D87602733EC86A64521F2B18177B200CBBE117577A615D6C770988C0BAD946E2' . - '08E24FA074E5AB3143DB5BFCE0FD108E4B82D120A93AD2CAFFFFFFFFFFFFFFFF'; - break; - // see https://tools.ietf.org/html/rfc3526#section-5 - case 'diffie-hellman-group16-sha512': // 4096-bit MODP Group - $prime = 'FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74' . - '020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437' . - '4FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED' . - 'EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF05' . - '98DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB' . - '9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B' . - 'E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718' . - '3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D04507A33' . - 'A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7' . - 'ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6BF12FFA06D98A0864' . - 'D87602733EC86A64521F2B18177B200CBBE117577A615D6C770988C0BAD946E2' . - '08E24FA074E5AB3143DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D7' . - '88719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8' . - 'DBBBC2DB04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2' . - '233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA9' . - '93B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934063199FFFFFFFFFFFFFFFF'; - break; - // see https://tools.ietf.org/html/rfc3526#section-6 - case 'diffie-hellman-group17-sha512': // 6144-bit MODP Group - $prime = 'FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74' . - '020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437' . - '4FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED' . - 'EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF05' . - '98DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB' . - '9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B' . - 'E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718' . - '3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D04507A33' . - 'A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7' . - 'ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6BF12FFA06D98A0864' . - 'D87602733EC86A64521F2B18177B200CBBE117577A615D6C770988C0BAD946E2' . - '08E24FA074E5AB3143DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D7' . - '88719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8' . - 'DBBBC2DB04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2' . - '233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA9' . - '93B4EA988D8FDDC186FFB7DC90A6C08F4DF435C93402849236C3FAB4D27C7026' . - 'C1D4DCB2602646DEC9751E763DBA37BDF8FF9406AD9E530EE5DB382F413001AE' . - 'B06A53ED9027D831179727B0865A8918DA3EDBEBCF9B14ED44CE6CBACED4BB1B' . - 'DB7F1447E6CC254B332051512BD7AF426FB8F401378CD2BF5983CA01C64B92EC' . - 'F032EA15D1721D03F482D7CE6E74FEF6D55E702F46980C82B5A84031900B1C9E' . - '59E7C97FBEC7E8F323A97A7E36CC88BE0F1D45B7FF585AC54BD407B22B4154AA' . - 'CC8F6D7EBF48E1D814CC5ED20F8037E0A79715EEF29BE32806A1D58BB7C5DA76' . - 'F550AA3D8A1FBFF0EB19CCB1A313D55CDA56C9EC2EF29632387FE8D76E3C0468' . - '043E8F663F4860EE12BF2D5B0B7474D6E694F91E6DCC4024FFFFFFFFFFFFFFFF'; - break; - // see https://tools.ietf.org/html/rfc3526#section-7 - case 'diffie-hellman-group18-sha512': // 8192-bit MODP Group - $prime = 'FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E088A67CC74' . - '020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B302B0A6DF25F1437' . - '4FE1356D6D51C245E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED' . - 'EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3DC2007CB8A163BF05' . - '98DA48361C55D39A69163FA8FD24CF5F83655D23DCA3AD961C62F356208552BB' . - '9ED529077096966D670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B' . - 'E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9DE2BCBF695581718' . - '3995497CEA956AE515D2261898FA051015728E5A8AAAC42DAD33170D04507A33' . - 'A85521ABDF1CBA64ECFB850458DBEF0A8AEA71575D060C7DB3970F85A6E1E4C7' . - 'ABF5AE8CDB0933D71E8C94E04A25619DCEE3D2261AD2EE6BF12FFA06D98A0864' . - 'D87602733EC86A64521F2B18177B200CBBE117577A615D6C770988C0BAD946E2' . - '08E24FA074E5AB3143DB5BFCE0FD108E4B82D120A92108011A723C12A787E6D7' . - '88719A10BDBA5B2699C327186AF4E23C1A946834B6150BDA2583E9CA2AD44CE8' . - 'DBBBC2DB04DE8EF92E8EFC141FBECAA6287C59474E6BC05D99B2964FA090C3A2' . - '233BA186515BE7ED1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA9' . - '93B4EA988D8FDDC186FFB7DC90A6C08F4DF435C93402849236C3FAB4D27C7026' . - 'C1D4DCB2602646DEC9751E763DBA37BDF8FF9406AD9E530EE5DB382F413001AE' . - 'B06A53ED9027D831179727B0865A8918DA3EDBEBCF9B14ED44CE6CBACED4BB1B' . - 'DB7F1447E6CC254B332051512BD7AF426FB8F401378CD2BF5983CA01C64B92EC' . - 'F032EA15D1721D03F482D7CE6E74FEF6D55E702F46980C82B5A84031900B1C9E' . - '59E7C97FBEC7E8F323A97A7E36CC88BE0F1D45B7FF585AC54BD407B22B4154AA' . - 'CC8F6D7EBF48E1D814CC5ED20F8037E0A79715EEF29BE32806A1D58BB7C5DA76' . - 'F550AA3D8A1FBFF0EB19CCB1A313D55CDA56C9EC2EF29632387FE8D76E3C0468' . - '043E8F663F4860EE12BF2D5B0B7474D6E694F91E6DBE115974A3926F12FEE5E4' . - '38777CB6A932DF8CD8BEC4D073B931BA3BC832B68D9DD300741FA7BF8AFC47ED' . - '2576F6936BA424663AAB639C5AE4F5683423B4742BF1C978238F16CBE39D652D' . - 'E3FDB8BEFC848AD922222E04A4037C0713EB57A81A23F0C73473FC646CEA306B' . - '4BCBC8862F8385DDFA9D4B7FA2C087E879683303ED5BDD3A062B3CF5B3A278A6' . - '6D2A13F83F44F82DDF310EE074AB6A364597E899A0255DC164F31CC50846851D' . - 'F9AB48195DED7EA1B1D510BD7EE74D73FAF36BC31ECFA268359046F4EB879F92' . - '4009438B481C6CD7889A002ED5EE382BC9190DA6FC026E479558E4475677E9AA' . - '9E3050E2765694DFC81F56E880B96E7160C980DD98EDD3DFFFFFFFFFFFFFFFFF'; - break; - default: - throw new \InvalidArgumentException('Invalid named prime provided'); - } - - $params->prime = new BigInteger($prime, 16); - $params->base = new BigInteger(2); - - return $params; - } - - /** - * Create public / private key pair. - * - * The rationale for the second parameter is described in http://tools.ietf.org/html/rfc4419#section-6.2 : - * - * "To increase the speed of the key exchange, both client and server may - * reduce the size of their private exponents. It should be at least - * twice as long as the key material that is generated from the shared - * secret. For more details, see the paper by van Oorschot and Wiener - * [VAN-OORSCHOT]." - * - * $length is in bits - * - * @param Parameters $params - * @param int $length optional - * @return PrivateKey - */ - public static function createKey(Parameters $params, $length = 0) - { - $class = new \ReflectionClass(static::class); - if ($class->isFinal()) { - throw new \RuntimeException('createKey() should not be called from final classes (' . static::class . ')'); - } - - $one = new BigInteger(1); - if ($length) { - $max = $one->bitwise_leftShift($length); - $max = $max->subtract($one); - } else { - $max = $params->prime->subtract($one); - } - - $key = new PrivateKey(); - $key->prime = $params->prime; - $key->base = $params->base; - $key->privateKey = BigInteger::randomRange($one, $max); - $key->publicKey = $key->base->powMod($key->privateKey, $key->prime); - return $key; - } - - /** - * Compute Shared Secret - * - * @param PrivateKey|EC $private - * @param PublicKey|BigInteger|string $public - * @return mixed - */ - public static function computeSecret($private, $public) - { - if ($private instanceof PrivateKey) { // DH\PrivateKey - switch (true) { - case $public instanceof PublicKey: - if (!$private->prime->equals($public->prime) || !$private->base->equals($public->base)) { - throw new \InvalidArgumentException('The public and private key do not share the same prime and / or base numbers'); - } - return $public->publicKey->powMod($private->privateKey, $private->prime)->toBytes(true); - case is_string($public): - $public = new BigInteger($public, -256); - // fall-through - case $public instanceof BigInteger: - return $public->powMod($private->privateKey, $private->prime)->toBytes(true); - default: - throw new \InvalidArgumentException('$public needs to be an instance of DH\PublicKey, a BigInteger or a string'); - } - } - - if ($private instanceof EC\PrivateKey) { - switch (true) { - case $public instanceof EC\PublicKey: - $public = $public->getEncodedCoordinates(); - // fall-through - case is_string($public): - $point = $private->multiply($public); - switch ($private->getCurve()) { - case 'Curve25519': - case 'Curve448': - $secret = $point; - break; - default: - // according to https://www.secg.org/sec1-v2.pdf#page=33 only X is returned - $secret = substr($point, 1, (strlen($point) - 1) >> 1); - } - /* - if (($secret[0] & "\x80") === "\x80") { - $secret = "\0$secret"; - } - */ - return $secret; - default: - throw new \InvalidArgumentException('$public needs to be an instance of EC\PublicKey or a string (an encoded coordinate)'); - } - } - } - - /** - * Load the key - * - * @param string $key - * @param string $password optional - * @return AsymmetricKey - */ - public static function load($key, $password = false) - { - try { - return EC::load($key, $password); - } catch (NoKeyLoadedException $e) { - } - - return parent::load($key, $password); - } - - /** - * OnLoad Handler - * - * @return bool - */ - protected static function onLoad(array $components) - { - if (!isset($components['privateKey']) && !isset($components['publicKey'])) { - $new = new Parameters(); - } else { - $new = isset($components['privateKey']) ? - new PrivateKey() : - new PublicKey(); - } - - $new->prime = $components['prime']; - $new->base = $components['base']; - - if (isset($components['privateKey'])) { - $new->privateKey = $components['privateKey']; - } - if (isset($components['publicKey'])) { - $new->publicKey = $components['publicKey']; - } - - return $new; - } - - /** - * Determines which hashing function should be used - * - * @param string $hash - */ - public function withHash($hash) - { - throw new UnsupportedOperationException('DH does not use a hash algorithm'); - } - - /** - * Returns the hash algorithm currently being used - * - */ - public function getHash() - { - throw new UnsupportedOperationException('DH does not use a hash algorithm'); - } - - /** - * Returns the parameters - * - * A public / private key is only returned if the currently loaded "key" contains an x or y - * value. - * - * @see self::getPublicKey() - * @return mixed - */ - public function getParameters() - { - $type = DH::validatePlugin('Keys', 'PKCS1', 'saveParameters'); - - $key = $type::saveParameters($this->prime, $this->base); - return DH::load($key, 'PKCS1'); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/DH/Formats/Keys/PKCS1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/DH/Formats/Keys/PKCS1.php deleted file mode 100644 index 49e1ecf..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/DH/Formats/Keys/PKCS1.php +++ /dev/null @@ -1,77 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\DH\Formats\Keys; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Keys\PKCS1 as Progenitor; -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; -use OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * "PKCS1" Formatted DH Key Handler - * - * @author Jim Wigginton - */ -abstract class PKCS1 extends Progenitor -{ - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - $key = parent::load($key, $password); - - $decoded = ASN1::decodeBER($key); - if (!$decoded) { - throw new \RuntimeException('Unable to decode BER'); - } - - $components = ASN1::asn1map($decoded[0], Maps\DHParameter::MAP); - if (!is_array($components)) { - throw new \RuntimeException('Unable to perform ASN1 mapping on parameters'); - } - - return $components; - } - - /** - * Convert EC parameters to the appropriate format - * - * @return string - */ - public static function saveParameters(BigInteger $prime, BigInteger $base, array $options = []) - { - $params = [ - 'prime' => $prime, - 'base' => $base - ]; - $params = ASN1::encodeDER($params, Maps\DHParameter::MAP); - - return "-----BEGIN DH PARAMETERS-----\r\n" . - chunk_split(base64_encode($params), 64) . - "-----END DH PARAMETERS-----\r\n"; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/DH/Formats/Keys/PKCS8.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/DH/Formats/Keys/PKCS8.php deleted file mode 100644 index df981c3..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/DH/Formats/Keys/PKCS8.php +++ /dev/null @@ -1,132 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\DH\Formats\Keys; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Keys\PKCS8 as Progenitor; -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; -use OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * PKCS#8 Formatted DH Key Handler - * - * @author Jim Wigginton - */ -abstract class PKCS8 extends Progenitor -{ - /** - * OID Name - * - * @var string - */ - const OID_NAME = 'dhKeyAgreement'; - - /** - * OID Value - * - * @var string - */ - const OID_VALUE = '1.2.840.113549.1.3.1'; - - /** - * Child OIDs loaded - * - * @var bool - */ - protected static $childOIDsLoaded = false; - - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - $key = parent::load($key, $password); - - $type = isset($key['privateKey']) ? 'privateKey' : 'publicKey'; - - $decoded = ASN1::decodeBER($key[$type . 'Algorithm']['parameters']->element); - if (empty($decoded)) { - throw new \RuntimeException('Unable to decode BER of parameters'); - } - $components = ASN1::asn1map($decoded[0], Maps\DHParameter::MAP); - if (!is_array($components)) { - throw new \RuntimeException('Unable to perform ASN1 mapping on parameters'); - } - - $decoded = ASN1::decodeBER($key[$type]); - switch (true) { - case !isset($decoded): - case !isset($decoded[0]['content']): - case !$decoded[0]['content'] instanceof BigInteger: - throw new \RuntimeException('Unable to decode BER of parameters'); - } - $components[$type] = $decoded[0]['content']; - - return $components; - } - - /** - * Convert a private key to the appropriate format. - * - * @param BigInteger $prime - * @param BigInteger $base - * @param BigInteger $privateKey - * @param BigInteger $publicKey - * @param string $password optional - * @param array $options optional - * @return string - */ - public static function savePrivateKey(BigInteger $prime, BigInteger $base, BigInteger $privateKey, BigInteger $publicKey, $password = '', array $options = []) - { - $params = [ - 'prime' => $prime, - 'base' => $base - ]; - $params = ASN1::encodeDER($params, Maps\DHParameter::MAP); - $params = new ASN1\Element($params); - $key = ASN1::encodeDER($privateKey, ['type' => ASN1::TYPE_INTEGER]); - return self::wrapPrivateKey($key, [], $params, $password, null, '', $options); - } - - /** - * Convert a public key to the appropriate format - * - * @param BigInteger $prime - * @param BigInteger $base - * @param BigInteger $publicKey - * @param array $options optional - * @return string - */ - public static function savePublicKey(BigInteger $prime, BigInteger $base, BigInteger $publicKey, array $options = []) - { - $params = [ - 'prime' => $prime, - 'base' => $base - ]; - $params = ASN1::encodeDER($params, Maps\DHParameter::MAP); - $params = new ASN1\Element($params); - $key = ASN1::encodeDER($publicKey, ['type' => ASN1::TYPE_INTEGER]); - return self::wrapPublicKey($key, $params, null, $options); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/DH/Parameters.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/DH/Parameters.php deleted file mode 100644 index d26ef5f..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/DH/Parameters.php +++ /dev/null @@ -1,36 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\DH; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\DH; - -/** - * DH Parameters - * - * @author Jim Wigginton - */ -final class Parameters extends DH -{ - /** - * Returns the parameters - * - * @param string $type - * @param array $options optional - * @return string - */ - public function toString($type = 'PKCS1', array $options = []) - { - $type = self::validatePlugin('Keys', 'PKCS1', 'saveParameters'); - - return $type::saveParameters($this->prime, $this->base, $options); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/DH/PrivateKey.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/DH/PrivateKey.php deleted file mode 100644 index 3f40093..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/DH/PrivateKey.php +++ /dev/null @@ -1,75 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\DH; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common; -use OCA\Libresign\Vendor\phpseclib3\Crypt\DH; - -/** - * DH Private Key - * - * @author Jim Wigginton - */ -final class PrivateKey extends DH -{ - use Common\Traits\PasswordProtected; - - /** - * Private Key - * - * @var \phpseclib3\Math\BigInteger - */ - protected $privateKey; - - /** - * Public Key - * - * @var \phpseclib3\Math\BigInteger - */ - protected $publicKey; - - /** - * Returns the public key - * - * @return PublicKey - */ - public function getPublicKey() - { - $type = self::validatePlugin('Keys', 'PKCS8', 'savePublicKey'); - - if (!isset($this->publicKey)) { - $this->publicKey = $this->base->powMod($this->privateKey, $this->prime); - } - - $key = $type::savePublicKey($this->prime, $this->base, $this->publicKey); - - return DH::loadFormat('PKCS8', $key); - } - - /** - * Returns the private key - * - * @param string $type - * @param array $options optional - * @return string - */ - public function toString($type, array $options = []) - { - $type = self::validatePlugin('Keys', $type, 'savePrivateKey'); - - if (!isset($this->publicKey)) { - $this->publicKey = $this->base->powMod($this->privateKey, $this->prime); - } - - return $type::savePrivateKey($this->prime, $this->base, $this->privateKey, $this->publicKey, $this->password, $options); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/DH/PublicKey.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/DH/PublicKey.php deleted file mode 100644 index bd81000..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/DH/PublicKey.php +++ /dev/null @@ -1,49 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\DH; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common; -use OCA\Libresign\Vendor\phpseclib3\Crypt\DH; - -/** - * DH Public Key - * - * @author Jim Wigginton - */ -final class PublicKey extends DH -{ - use Common\Traits\Fingerprint; - - /** - * Returns the public key - * - * @param string $type - * @param array $options optional - * @return string - */ - public function toString($type, array $options = []) - { - $type = self::validatePlugin('Keys', $type, 'savePublicKey'); - - return $type::savePublicKey($this->prime, $this->base, $this->publicKey, $options); - } - - /** - * Returns the public key as a BigInteger - * - * @return \phpseclib3\Math\BigInteger - */ - public function toBigInteger() - { - return $this->publicKey; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA.php deleted file mode 100644 index c1ed9a9..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA.php +++ /dev/null @@ -1,337 +0,0 @@ - - * getPublicKey(); - * - * $plaintext = 'terrafrost'; - * - * $signature = $private->sign($plaintext); - * - * echo $public->verify($plaintext, $signature) ? 'verified' : 'unverified'; - * ?> - * - * - * @author Jim Wigginton - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\AsymmetricKey; -use OCA\Libresign\Vendor\phpseclib3\Crypt\DSA\Parameters; -use OCA\Libresign\Vendor\phpseclib3\Crypt\DSA\PrivateKey; -use OCA\Libresign\Vendor\phpseclib3\Crypt\DSA\PublicKey; -use OCA\Libresign\Vendor\phpseclib3\Exception\InsufficientSetupException; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * Pure-PHP FIPS 186-4 compliant implementation of DSA. - * - * @author Jim Wigginton - */ -abstract class DSA extends AsymmetricKey -{ - /** - * Algorithm Name - * - * @var string - */ - const ALGORITHM = 'DSA'; - - /** - * DSA Prime P - * - * @var BigInteger - */ - protected $p; - - /** - * DSA Group Order q - * - * Prime divisor of p-1 - * - * @var BigInteger - */ - protected $q; - - /** - * DSA Group Generator G - * - * @var BigInteger - */ - protected $g; - - /** - * DSA public key value y - * - * @var BigInteger - */ - protected $y; - - /** - * Signature Format - * - * @var string - */ - protected $sigFormat; - - /** - * Signature Format (Short) - * - * @var string - */ - protected $shortFormat; - - /** - * Create DSA parameters - * - * @param int $L - * @param int $N - * @return DSA|bool - */ - public static function createParameters($L = 2048, $N = 224) - { - self::initialize_static_variables(); - - $class = new \ReflectionClass(static::class); - if ($class->isFinal()) { - throw new \RuntimeException('createParameters() should not be called from final classes (' . static::class . ')'); - } - - if (!isset(self::$engines['PHP'])) { - self::useBestEngine(); - } - - switch (true) { - case $N == 160: - /* - in FIPS 186-1 and 186-2 N was fixed at 160 whereas K had an upper bound of 1024. - RFC 4253 (SSH Transport Layer Protocol) references FIPS 186-2 and as such most - SSH DSA implementations only support keys with an N of 160. - puttygen let's you set the size of L (but not the size of N) and uses 2048 as the - default L value. that's not really compliant with any of the FIPS standards, however, - for the purposes of maintaining compatibility with puttygen, we'll support it - */ - //case ($L >= 512 || $L <= 1024) && (($L & 0x3F) == 0) && $N == 160: - // FIPS 186-3 changed this as follows: - //case $L == 1024 && $N == 160: - case $L == 2048 && $N == 224: - case $L == 2048 && $N == 256: - case $L == 3072 && $N == 256: - break; - default: - throw new \InvalidArgumentException('Invalid values for N and L'); - } - - $two = new BigInteger(2); - - $q = BigInteger::randomPrime($N); - $divisor = $q->multiply($two); - - do { - $x = BigInteger::random($L); - list(, $c) = $x->divide($divisor); - $p = $x->subtract($c->subtract(self::$one)); - } while ($p->getLength() != $L || !$p->isPrime()); - - $p_1 = $p->subtract(self::$one); - list($e) = $p_1->divide($q); - - // quoting http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf#page=50 , - // "h could be obtained from a random number generator or from a counter that - // changes after each use". PuTTY (sshdssg.c) starts h off at 1 and increments - // it on each loop. wikipedia says "commonly h = 2 is used" so we'll just do that - $h = clone $two; - while (true) { - $g = $h->powMod($e, $p); - if (!$g->equals(self::$one)) { - break; - } - $h = $h->add(self::$one); - } - - $dsa = new Parameters(); - $dsa->p = $p; - $dsa->q = $q; - $dsa->g = $g; - - return $dsa; - } - - /** - * Create public / private key pair. - * - * This method is a bit polymorphic. It can take a DSA/Parameters object, L / N as two distinct parameters or - * no parameters (at which point L and N will be generated with this method) - * - * Returns the private key, from which the publickey can be extracted - * - * @param int[] ...$args - * @return PrivateKey - */ - public static function createKey(...$args) - { - self::initialize_static_variables(); - - $class = new \ReflectionClass(static::class); - if ($class->isFinal()) { - throw new \RuntimeException('createKey() should not be called from final classes (' . static::class . ')'); - } - - if (!isset(self::$engines['PHP'])) { - self::useBestEngine(); - } - - if (count($args) == 2 && is_int($args[0]) && is_int($args[1])) { - $params = self::createParameters($args[0], $args[1]); - } elseif (count($args) == 1 && $args[0] instanceof Parameters) { - $params = $args[0]; - } elseif (!count($args)) { - $params = self::createParameters(); - } else { - throw new InsufficientSetupException('Valid parameters are either two integers (L and N), a single DSA object or no parameters at all.'); - } - - $private = new PrivateKey(); - $private->p = $params->p; - $private->q = $params->q; - $private->g = $params->g; - - $private->x = BigInteger::randomRange(self::$one, $private->q->subtract(self::$one)); - $private->y = $private->g->powMod($private->x, $private->p); - - //$public = clone $private; - //unset($public->x); - - return $private - ->withHash($params->hash->getHash()) - ->withSignatureFormat($params->shortFormat); - } - - /** - * OnLoad Handler - * - * @return bool - */ - protected static function onLoad(array $components) - { - if (!isset(self::$engines['PHP'])) { - self::useBestEngine(); - } - - if (!isset($components['x']) && !isset($components['y'])) { - $new = new Parameters(); - } elseif (isset($components['x'])) { - $new = new PrivateKey(); - $new->x = $components['x']; - } else { - $new = new PublicKey(); - } - - $new->p = $components['p']; - $new->q = $components['q']; - $new->g = $components['g']; - - if (isset($components['y'])) { - $new->y = $components['y']; - } - - return $new; - } - - /** - * Constructor - * - * PublicKey and PrivateKey objects can only be created from abstract RSA class - */ - protected function __construct() - { - $this->sigFormat = self::validatePlugin('Signature', 'ASN1'); - $this->shortFormat = 'ASN1'; - - parent::__construct(); - } - - /** - * Returns the key size - * - * More specifically, this L (the length of DSA Prime P) and N (the length of DSA Group Order q) - * - * @return array - */ - public function getLength() - { - return ['L' => $this->p->getLength(), 'N' => $this->q->getLength()]; - } - - /** - * Returns the current engine being used - * - * @see self::useInternalEngine() - * @see self::useBestEngine() - * @return string - */ - public function getEngine() - { - if (!isset(self::$engines['PHP'])) { - self::useBestEngine(); - } - return self::$engines['OpenSSL'] && in_array($this->hash->getHash(), openssl_get_md_methods()) ? - 'OpenSSL' : 'PHP'; - } - - /** - * Returns the parameters - * - * A public / private key is only returned if the currently loaded "key" contains an x or y - * value. - * - * @see self::getPublicKey() - * @return mixed - */ - public function getParameters() - { - $type = self::validatePlugin('Keys', 'PKCS1', 'saveParameters'); - - $key = $type::saveParameters($this->p, $this->q, $this->g); - return DSA::load($key, 'PKCS1') - ->withHash($this->hash->getHash()) - ->withSignatureFormat($this->shortFormat); - } - - /** - * Determines the signature padding mode - * - * Valid values are: ASN1, SSH2, Raw - * - * @param string $format - */ - public function withSignatureFormat($format) - { - $new = clone $this; - $new->shortFormat = $format; - $new->sigFormat = self::validatePlugin('Signature', $format); - return $new; - } - - /** - * Returns the signature format currently being used - * - */ - public function getSignatureFormat() - { - return $this->shortFormat; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/OpenSSH.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/OpenSSH.php deleted file mode 100644 index 090d7ac..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/OpenSSH.php +++ /dev/null @@ -1,118 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\DSA\Formats\Keys; - -use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Keys\OpenSSH as Progenitor; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * OpenSSH Formatted DSA Key Handler - * - * @author Jim Wigginton - */ -abstract class OpenSSH extends Progenitor -{ - /** - * Supported Key Types - * - * @var array - */ - protected static $types = ['ssh-dss']; - - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - $parsed = parent::load($key, $password); - - if (isset($parsed['paddedKey'])) { - list($type) = Strings::unpackSSH2('s', $parsed['paddedKey']); - if ($type != $parsed['type']) { - throw new \RuntimeException("The public and private keys are not of the same type ($type vs $parsed[type])"); - } - - list($p, $q, $g, $y, $x, $comment) = Strings::unpackSSH2('i5s', $parsed['paddedKey']); - - return compact('p', 'q', 'g', 'y', 'x', 'comment'); - } - - list($p, $q, $g, $y) = Strings::unpackSSH2('iiii', $parsed['publicKey']); - - $comment = $parsed['comment']; - - return compact('p', 'q', 'g', 'y', 'comment'); - } - - /** - * Convert a public key to the appropriate format - * - * @param BigInteger $p - * @param BigInteger $q - * @param BigInteger $g - * @param BigInteger $y - * @param array $options optional - * @return string - */ - public static function savePublicKey(BigInteger $p, BigInteger $q, BigInteger $g, BigInteger $y, array $options = []) - { - if ($q->getLength() != 160) { - throw new \InvalidArgumentException('SSH only supports keys with an N (length of Group Order q) of 160'); - } - - // from : - // string "ssh-dss" - // mpint p - // mpint q - // mpint g - // mpint y - $DSAPublicKey = Strings::packSSH2('siiii', 'ssh-dss', $p, $q, $g, $y); - - if (isset($options['binary']) ? $options['binary'] : self::$binary) { - return $DSAPublicKey; - } - - $comment = isset($options['comment']) ? $options['comment'] : self::$comment; - $DSAPublicKey = 'ssh-dss ' . base64_encode($DSAPublicKey) . ' ' . $comment; - - return $DSAPublicKey; - } - - /** - * Convert a private key to the appropriate format. - * - * @param BigInteger $p - * @param BigInteger $q - * @param BigInteger $g - * @param BigInteger $y - * @param BigInteger $x - * @param string $password optional - * @param array $options optional - * @return string - */ - public static function savePrivateKey(BigInteger $p, BigInteger $q, BigInteger $g, BigInteger $y, BigInteger $x, $password = '', array $options = []) - { - $publicKey = self::savePublicKey($p, $q, $g, $y, ['binary' => true]); - $privateKey = Strings::packSSH2('si5', 'ssh-dss', $p, $q, $g, $y, $x); - - return self::wrapPrivateKey($publicKey, $privateKey, $password, $options); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PKCS1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PKCS1.php deleted file mode 100644 index 043cd3c..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PKCS1.php +++ /dev/null @@ -1,143 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\DSA\Formats\Keys; - -use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Keys\PKCS1 as Progenitor; -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; -use OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * PKCS#1 Formatted DSA Key Handler - * - * @author Jim Wigginton - */ -abstract class PKCS1 extends Progenitor -{ - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - $key = parent::load($key, $password); - - $decoded = ASN1::decodeBER($key); - if (!$decoded) { - throw new \RuntimeException('Unable to decode BER'); - } - - $key = ASN1::asn1map($decoded[0], Maps\DSAParams::MAP); - if (is_array($key)) { - return $key; - } - - $key = ASN1::asn1map($decoded[0], Maps\DSAPrivateKey::MAP); - if (is_array($key)) { - return $key; - } - - $key = ASN1::asn1map($decoded[0], Maps\DSAPublicKey::MAP); - if (is_array($key)) { - return $key; - } - - throw new \RuntimeException('Unable to perform ASN1 mapping'); - } - - /** - * Convert DSA parameters to the appropriate format - * - * @param BigInteger $p - * @param BigInteger $q - * @param BigInteger $g - * @return string - */ - public static function saveParameters(BigInteger $p, BigInteger $q, BigInteger $g) - { - $key = [ - 'p' => $p, - 'q' => $q, - 'g' => $g - ]; - - $key = ASN1::encodeDER($key, Maps\DSAParams::MAP); - - return "-----BEGIN DSA PARAMETERS-----\r\n" . - chunk_split(Strings::base64_encode($key), 64) . - "-----END DSA PARAMETERS-----\r\n"; - } - - /** - * Convert a private key to the appropriate format. - * - * @param BigInteger $p - * @param BigInteger $q - * @param BigInteger $g - * @param BigInteger $y - * @param BigInteger $x - * @param string $password optional - * @param array $options optional - * @return string - */ - public static function savePrivateKey(BigInteger $p, BigInteger $q, BigInteger $g, BigInteger $y, BigInteger $x, $password = '', array $options = []) - { - $key = [ - 'version' => 0, - 'p' => $p, - 'q' => $q, - 'g' => $g, - 'y' => $y, - 'x' => $x - ]; - - $key = ASN1::encodeDER($key, Maps\DSAPrivateKey::MAP); - - return self::wrapPrivateKey($key, 'DSA', $password, $options); - } - - /** - * Convert a public key to the appropriate format - * - * @param BigInteger $p - * @param BigInteger $q - * @param BigInteger $g - * @param BigInteger $y - * @return string - */ - public static function savePublicKey(BigInteger $p, BigInteger $q, BigInteger $g, BigInteger $y) - { - $key = ASN1::encodeDER($y, Maps\DSAPublicKey::MAP); - - return self::wrapPublicKey($key, 'DSA'); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PKCS8.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PKCS8.php deleted file mode 100644 index a810dea..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PKCS8.php +++ /dev/null @@ -1,146 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\DSA\Formats\Keys; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Keys\PKCS8 as Progenitor; -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; -use OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * PKCS#8 Formatted DSA Key Handler - * - * @author Jim Wigginton - */ -abstract class PKCS8 extends Progenitor -{ - /** - * OID Name - * - * @var string - */ - const OID_NAME = 'id-dsa'; - - /** - * OID Value - * - * @var string - */ - const OID_VALUE = '1.2.840.10040.4.1'; - - /** - * Child OIDs loaded - * - * @var bool - */ - protected static $childOIDsLoaded = false; - - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - $key = parent::load($key, $password); - - $type = isset($key['privateKey']) ? 'privateKey' : 'publicKey'; - - $decoded = ASN1::decodeBER($key[$type . 'Algorithm']['parameters']->element); - if (!$decoded) { - throw new \RuntimeException('Unable to decode BER of parameters'); - } - $components = ASN1::asn1map($decoded[0], Maps\DSAParams::MAP); - if (!is_array($components)) { - throw new \RuntimeException('Unable to perform ASN1 mapping on parameters'); - } - - $decoded = ASN1::decodeBER($key[$type]); - if (empty($decoded)) { - throw new \RuntimeException('Unable to decode BER'); - } - - $var = $type == 'privateKey' ? 'x' : 'y'; - $components[$var] = ASN1::asn1map($decoded[0], Maps\DSAPublicKey::MAP); - if (!$components[$var] instanceof BigInteger) { - throw new \RuntimeException('Unable to perform ASN1 mapping'); - } - - if (isset($key['meta'])) { - $components['meta'] = $key['meta']; - } - - return $components; - } - - /** - * Convert a private key to the appropriate format. - * - * @param BigInteger $p - * @param BigInteger $q - * @param BigInteger $g - * @param BigInteger $y - * @param BigInteger $x - * @param string $password optional - * @param array $options optional - * @return string - */ - public static function savePrivateKey(BigInteger $p, BigInteger $q, BigInteger $g, BigInteger $y, BigInteger $x, $password = '', array $options = []) - { - $params = [ - 'p' => $p, - 'q' => $q, - 'g' => $g - ]; - $params = ASN1::encodeDER($params, Maps\DSAParams::MAP); - $params = new ASN1\Element($params); - $key = ASN1::encodeDER($x, Maps\DSAPublicKey::MAP); - return self::wrapPrivateKey($key, [], $params, $password, null, '', $options); - } - - /** - * Convert a public key to the appropriate format - * - * @param BigInteger $p - * @param BigInteger $q - * @param BigInteger $g - * @param BigInteger $y - * @param array $options optional - * @return string - */ - public static function savePublicKey(BigInteger $p, BigInteger $q, BigInteger $g, BigInteger $y, array $options = []) - { - $params = [ - 'p' => $p, - 'q' => $q, - 'g' => $g - ]; - $params = ASN1::encodeDER($params, Maps\DSAParams::MAP); - $params = new ASN1\Element($params); - $key = ASN1::encodeDER($y, Maps\DSAPublicKey::MAP); - return self::wrapPublicKey($key, $params, null, $options); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PuTTY.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PuTTY.php deleted file mode 100644 index e9bb817..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/PuTTY.php +++ /dev/null @@ -1,112 +0,0 @@ - 160 kinda useless, hence this handlers not supporting such keys. - * - * PHP version 5 - * - * @author Jim Wigginton - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\DSA\Formats\Keys; - -use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Keys\PuTTY as Progenitor; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * PuTTY Formatted DSA Key Handler - * - * @author Jim Wigginton - */ -abstract class PuTTY extends Progenitor -{ - /** - * Public Handler - * - * @var string - */ - const PUBLIC_HANDLER = '\OCA\Libresign\Vendor\phpseclib3\Crypt\DSA\Formats\Keys\OpenSSH'; - - /** - * Algorithm Identifier - * - * @var array - */ - protected static $types = ['ssh-dss']; - - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - $components = parent::load($key, $password); - if (!isset($components['private'])) { - return $components; - } - $type = $components['type']; - $comment = $components['comment']; - $public = $components['public']; - $private = $components['private']; - unset($components['public'], $components['private']); - - list($p, $q, $g, $y) = Strings::unpackSSH2('iiii', $public); - list($x) = Strings::unpackSSH2('i', $private); - - return compact('p', 'q', 'g', 'y', 'x', 'comment'); - } - - /** - * Convert a private key to the appropriate format. - * - * @param BigInteger $p - * @param BigInteger $q - * @param BigInteger $g - * @param BigInteger $y - * @param BigInteger $x - * @param string $password optional - * @param array $options optional - * @return string - */ - public static function savePrivateKey(BigInteger $p, BigInteger $q, BigInteger $g, BigInteger $y, BigInteger $x, $password = false, array $options = []) - { - if ($q->getLength() != 160) { - throw new \InvalidArgumentException('SSH only supports keys with an N (length of Group Order q) of 160'); - } - - $public = Strings::packSSH2('iiii', $p, $q, $g, $y); - $private = Strings::packSSH2('i', $x); - - return self::wrapPrivateKey($public, $private, 'ssh-dss', $password, $options); - } - - /** - * Convert a public key to the appropriate format - * - * @param BigInteger $p - * @param BigInteger $q - * @param BigInteger $g - * @param BigInteger $y - * @return string - */ - public static function savePublicKey(BigInteger $p, BigInteger $q, BigInteger $g, BigInteger $y) - { - if ($q->getLength() != 160) { - throw new \InvalidArgumentException('SSH only supports keys with an N (length of Group Order q) of 160'); - } - - return self::wrapPublicKey(Strings::packSSH2('iiii', $p, $q, $g, $y), 'ssh-dss'); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/Raw.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/Raw.php deleted file mode 100644 index 1570930..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/Raw.php +++ /dev/null @@ -1,85 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\DSA\Formats\Keys; - -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * Raw DSA Key Handler - * - * @author Jim Wigginton - */ -abstract class Raw -{ - /** - * Break a public or private key down into its constituent components - * - * @param array $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - if (!is_array($key)) { - throw new \UnexpectedValueException('Key should be a array - not a ' . gettype($key)); - } - - switch (true) { - case !isset($key['p']) || !isset($key['q']) || !isset($key['g']): - case !$key['p'] instanceof BigInteger: - case !$key['q'] instanceof BigInteger: - case !$key['g'] instanceof BigInteger: - case !isset($key['x']) && !isset($key['y']): - case isset($key['x']) && !$key['x'] instanceof BigInteger: - case isset($key['y']) && !$key['y'] instanceof BigInteger: - throw new \UnexpectedValueException('Key appears to be malformed'); - } - - $options = ['p' => 1, 'q' => 1, 'g' => 1, 'x' => 1, 'y' => 1]; - - return array_intersect_key($key, $options); - } - - /** - * Convert a private key to the appropriate format. - * - * @param BigInteger $p - * @param BigInteger $q - * @param BigInteger $g - * @param BigInteger $y - * @param BigInteger $x - * @param string $password optional - * @return string - */ - public static function savePrivateKey(BigInteger $p, BigInteger $q, BigInteger $g, BigInteger $y, BigInteger $x, $password = '') - { - return compact('p', 'q', 'g', 'y', 'x'); - } - - /** - * Convert a public key to the appropriate format - * - * @param BigInteger $p - * @param BigInteger $q - * @param BigInteger $g - * @param BigInteger $y - * @return string - */ - public static function savePublicKey(BigInteger $p, BigInteger $q, BigInteger $g, BigInteger $y) - { - return compact('p', 'q', 'g', 'y'); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/XML.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/XML.php deleted file mode 100644 index 7679030..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Keys/XML.php +++ /dev/null @@ -1,132 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\DSA\Formats\Keys; - -use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; -use OCA\Libresign\Vendor\phpseclib3\Exception\BadConfigurationException; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * XML Formatted DSA Key Handler - * - * @author Jim Wigginton - */ -abstract class XML -{ - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - if (!Strings::is_stringable($key)) { - throw new \UnexpectedValueException('Key should be a string - not a ' . gettype($key)); - } - - if (!class_exists('DOMDocument')) { - throw new BadConfigurationException('The dom extension is not setup correctly on this system'); - } - - $use_errors = libxml_use_internal_errors(true); - - $dom = new \DOMDocument(); - if (substr($key, 0, 5) != '' . $key . ''; - } - if (!$dom->loadXML($key)) { - libxml_use_internal_errors($use_errors); - throw new \UnexpectedValueException('Key does not appear to contain XML'); - } - $xpath = new \DOMXPath($dom); - $keys = ['p', 'q', 'g', 'y', 'j', 'seed', 'pgencounter']; - foreach ($keys as $key) { - // $dom->getElementsByTagName($key) is case-sensitive - $temp = $xpath->query("//*[translate(local-name(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')='$key']"); - if (!$temp->length) { - continue; - } - $value = new BigInteger(Strings::base64_decode($temp->item(0)->nodeValue), 256); - switch ($key) { - case 'p': // a prime modulus meeting the [DSS] requirements - // Parameters P, Q, and G can be public and common to a group of users. They might be known - // from application context. As such, they are optional but P and Q must either both appear - // or both be absent - $components['p'] = $value; - break; - case 'q': // an integer in the range 2**159 < Q < 2**160 which is a prime divisor of P-1 - $components['q'] = $value; - break; - case 'g': // an integer with certain properties with respect to P and Q - $components['g'] = $value; - break; - case 'y': // G**X mod P (where X is part of the private key and not made public) - $components['y'] = $value; - // the remaining options do not do anything - case 'j': // (P - 1) / Q - // Parameter J is available for inclusion solely for efficiency as it is calculatable from - // P and Q - case 'seed': // a DSA prime generation seed - // Parameters seed and pgenCounter are used in the DSA prime number generation algorithm - // specified in [DSS]. As such, they are optional but must either both be present or both - // be absent - case 'pgencounter': // a DSA prime generation counter - } - } - - libxml_use_internal_errors($use_errors); - - if (!isset($components['y'])) { - throw new \UnexpectedValueException('Key is missing y component'); - } - - switch (true) { - case !isset($components['p']): - case !isset($components['q']): - case !isset($components['g']): - return ['y' => $components['y']]; - } - - return $components; - } - - /** - * Convert a public key to the appropriate format - * - * See https://www.w3.org/TR/xmldsig-core/#sec-DSAKeyValue - * - * @param BigInteger $p - * @param BigInteger $q - * @param BigInteger $g - * @param BigInteger $y - * @return string - */ - public static function savePublicKey(BigInteger $p, BigInteger $q, BigInteger $g, BigInteger $y) - { - return "\r\n" . - '

' . Strings::base64_encode($p->toBytes()) . "

\r\n" . - ' ' . Strings::base64_encode($q->toBytes()) . "\r\n" . - ' ' . Strings::base64_encode($g->toBytes()) . "\r\n" . - ' ' . Strings::base64_encode($y->toBytes()) . "\r\n" . - '
'; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/ASN1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/ASN1.php deleted file mode 100644 index e6fcc73..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/ASN1.php +++ /dev/null @@ -1,62 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\DSA\Formats\Signature; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1 as Encoder; -use OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * ASN1 Signature Handler - * - * @author Jim Wigginton - */ -abstract class ASN1 -{ - /** - * Loads a signature - * - * @param string $sig - * @return array|bool - */ - public static function load($sig) - { - if (!is_string($sig)) { - return false; - } - - $decoded = Encoder::decodeBER($sig); - if (empty($decoded)) { - return false; - } - $components = Encoder::asn1map($decoded[0], Maps\DssSigValue::MAP); - - return $components; - } - - /** - * Returns a signature in the appropriate format - * - * @param BigInteger $r - * @param BigInteger $s - * @return string - */ - public static function save(BigInteger $r, BigInteger $s) - { - return Encoder::encodeDER(compact('r', 's'), Maps\DssSigValue::MAP); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/Raw.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/Raw.php deleted file mode 100644 index 50cead5..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/Raw.php +++ /dev/null @@ -1,25 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\DSA\Formats\Signature; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Signature\Raw as Progenitor; - -/** - * Raw DSA Signature Handler - * - * @author Jim Wigginton - */ -abstract class Raw extends Progenitor -{ -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/SSH2.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/SSH2.php deleted file mode 100644 index 17f61de..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Formats/Signature/SSH2.php +++ /dev/null @@ -1,74 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\DSA\Formats\Signature; - -use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * SSH2 Signature Handler - * - * @author Jim Wigginton - */ -abstract class SSH2 -{ - /** - * Loads a signature - * - * @param string $sig - * @return mixed - */ - public static function load($sig) - { - if (!is_string($sig)) { - return false; - } - - $result = Strings::unpackSSH2('ss', $sig); - if ($result === false) { - return false; - } - list($type, $blob) = $result; - if ($type != 'ssh-dss' || strlen($blob) != 40) { - return false; - } - - return [ - 'r' => new BigInteger(substr($blob, 0, 20), 256), - 's' => new BigInteger(substr($blob, 20), 256) - ]; - } - - /** - * Returns a signature in the appropriate format - * - * @param BigInteger $r - * @param BigInteger $s - * @return string - */ - public static function save(BigInteger $r, BigInteger $s) - { - if ($r->getLength() > 160 || $s->getLength() > 160) { - return false; - } - return Strings::packSSH2( - 'ss', - 'ssh-dss', - str_pad($r->toBytes(), 20, "\0", STR_PAD_LEFT) . - str_pad($s->toBytes(), 20, "\0", STR_PAD_LEFT) - ); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Parameters.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Parameters.php deleted file mode 100644 index aa13e04..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/Parameters.php +++ /dev/null @@ -1,36 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\DSA; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\DSA; - -/** - * DSA Parameters - * - * @author Jim Wigginton - */ -final class Parameters extends DSA -{ - /** - * Returns the parameters - * - * @param string $type - * @param array $options optional - * @return string - */ - public function toString($type = 'PKCS1', array $options = []) - { - $type = self::validatePlugin('Keys', 'PKCS1', 'saveParameters'); - - return $type::saveParameters($this->p, $this->q, $this->g, $options); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/PrivateKey.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/PrivateKey.php deleted file mode 100644 index 75aadec..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/PrivateKey.php +++ /dev/null @@ -1,154 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\DSA; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common; -use OCA\Libresign\Vendor\phpseclib3\Crypt\DSA; -use OCA\Libresign\Vendor\phpseclib3\Crypt\DSA\Formats\Signature\ASN1 as ASN1Signature; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * DSA Private Key - * - * @author Jim Wigginton - */ -final class PrivateKey extends DSA implements Common\PrivateKey -{ - use Common\Traits\PasswordProtected; - - /** - * DSA secret exponent x - * - * @var BigInteger - */ - protected $x; - - /** - * Returns the public key - * - * If you do "openssl rsa -in private.rsa -pubout -outform PEM" you get a PKCS8 formatted key - * that contains a publicKeyAlgorithm AlgorithmIdentifier and a publicKey BIT STRING. - * An AlgorithmIdentifier contains an OID and a parameters field. With RSA public keys this - * parameters field is NULL. With DSA PKCS8 public keys it is not - it contains the p, q and g - * variables. The publicKey BIT STRING contains, simply, the y variable. This can be verified - * by getting a DSA PKCS8 public key: - * - * "openssl dsa -in private.dsa -pubout -outform PEM" - * - * ie. just swap out rsa with dsa in the rsa command above. - * - * A PKCS1 public key corresponds to the publicKey portion of the PKCS8 key. In the case of RSA - * the publicKey portion /is/ the key. In the case of DSA it is not. You cannot verify a signature - * without the parameters and the PKCS1 DSA public key format does not include the parameters. - * - * @see self::getPrivateKey() - * @return mixed - */ - public function getPublicKey() - { - $type = self::validatePlugin('Keys', 'PKCS8', 'savePublicKey'); - - if (!isset($this->y)) { - $this->y = $this->g->powMod($this->x, $this->p); - } - - $key = $type::savePublicKey($this->p, $this->q, $this->g, $this->y); - - return DSA::loadFormat('PKCS8', $key) - ->withHash($this->hash->getHash()) - ->withSignatureFormat($this->shortFormat); - } - - /** - * Create a signature - * - * @see self::verify() - * @param string $message - * @return mixed - */ - public function sign($message) - { - $format = $this->sigFormat; - - if (self::$engines['OpenSSL'] && in_array($this->hash->getHash(), openssl_get_md_methods())) { - $signature = ''; - $result = openssl_sign($message, $signature, $this->toString('PKCS8'), $this->hash->getHash()); - - if ($result) { - if ($this->shortFormat == 'ASN1') { - return $signature; - } - - $loaded = ASN1Signature::load($signature); - $r = $loaded['r']; - $s = $loaded['s']; - - return $format::save($r, $s); - } - } - - $h = $this->hash->hash($message); - $h = $this->bits2int($h); - - while (true) { - $k = BigInteger::randomRange(self::$one, $this->q->subtract(self::$one)); - $r = $this->g->powMod($k, $this->p); - list(, $r) = $r->divide($this->q); - if ($r->equals(self::$zero)) { - continue; - } - $kinv = $k->modInverse($this->q); - $temp = $h->add($this->x->multiply($r)); - $temp = $kinv->multiply($temp); - list(, $s) = $temp->divide($this->q); - if (!$s->equals(self::$zero)) { - break; - } - } - - // the following is an RFC6979 compliant implementation of deterministic DSA - // it's unused because it's mainly intended for use when a good CSPRNG isn't - // available. if phpseclib's CSPRNG isn't good then even key generation is - // suspect - /* - $h1 = $this->hash->hash($message); - $k = $this->computek($h1); - $r = $this->g->powMod($k, $this->p); - list(, $r) = $r->divide($this->q); - $kinv = $k->modInverse($this->q); - $h1 = $this->bits2int($h1); - $temp = $h1->add($this->x->multiply($r)); - $temp = $kinv->multiply($temp); - list(, $s) = $temp->divide($this->q); - */ - - return $format::save($r, $s); - } - - /** - * Returns the private key - * - * @param string $type - * @param array $options optional - * @return string - */ - public function toString($type, array $options = []) - { - $type = self::validatePlugin('Keys', $type, 'savePrivateKey'); - - if (!isset($this->y)) { - $this->y = $this->g->powMod($this->x, $this->p); - } - - return $type::savePrivateKey($this->p, $this->q, $this->g, $this->y, $this->x, $this->password, $options); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/PublicKey.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/PublicKey.php deleted file mode 100644 index 43c06bb..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/DSA/PublicKey.php +++ /dev/null @@ -1,87 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\DSA; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common; -use OCA\Libresign\Vendor\phpseclib3\Crypt\DSA; -use OCA\Libresign\Vendor\phpseclib3\Crypt\DSA\Formats\Signature\ASN1 as ASN1Signature; - -/** - * DSA Public Key - * - * @author Jim Wigginton - */ -final class PublicKey extends DSA implements Common\PublicKey -{ - use Common\Traits\Fingerprint; - - /** - * Verify a signature - * - * @see self::verify() - * @param string $message - * @param string $signature - * @return mixed - */ - public function verify($message, $signature) - { - $format = $this->sigFormat; - - $params = $format::load($signature); - if ($params === false || count($params) != 2) { - return false; - } - $r = $params['r']; - $s = $params['s']; - - if (self::$engines['OpenSSL'] && in_array($this->hash->getHash(), openssl_get_md_methods())) { - $sig = $format != 'ASN1' ? ASN1Signature::save($r, $s) : $signature; - - $result = openssl_verify($message, $sig, $this->toString('PKCS8'), $this->hash->getHash()); - - if ($result != -1) { - return (bool) $result; - } - } - - $q_1 = $this->q->subtract(self::$one); - if (!$r->between(self::$one, $q_1) || !$s->between(self::$one, $q_1)) { - return false; - } - - $w = $s->modInverse($this->q); - $h = $this->hash->hash($message); - $h = $this->bits2int($h); - list(, $u1) = $h->multiply($w)->divide($this->q); - list(, $u2) = $r->multiply($w)->divide($this->q); - $v1 = $this->g->powMod($u1, $this->p); - $v2 = $this->y->powMod($u2, $this->p); - list(, $v) = $v1->multiply($v2)->divide($this->p); - list(, $v) = $v->divide($this->q); - - return $v->equals($r); - } - - /** - * Returns the public key - * - * @param string $type - * @param array $options optional - * @return string - */ - public function toString($type, array $options = []) - { - $type = self::validatePlugin('Keys', $type, 'savePublicKey'); - - return $type::savePublicKey($this->p, $this->q, $this->g, $this->y, $options); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC.php deleted file mode 100644 index ab93243..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC.php +++ /dev/null @@ -1,480 +0,0 @@ - - * getPublicKey(); - * - * $plaintext = 'terrafrost'; - * - * $signature = $private->sign($plaintext); - * - * echo $public->verify($plaintext, $signature) ? 'verified' : 'unverified'; - * ?> - * - * - * @author Jim Wigginton - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\AsymmetricKey; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Montgomery as MontgomeryCurve; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\TwistedEdwards as TwistedEdwardsCurve; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves\Curve25519; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves\Ed25519; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves\Ed448; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Formats\Keys\PKCS1; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Parameters; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\PrivateKey; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\PublicKey; -use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedAlgorithmException; -use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedCurveException; -use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedOperationException; -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; -use OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps\ECParameters; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * Pure-PHP implementation of EC. - * - * @author Jim Wigginton - */ -abstract class EC extends AsymmetricKey -{ - /** - * Algorithm Name - * - * @var string - */ - const ALGORITHM = 'EC'; - - /** - * Public Key QA - * - * @var object[] - */ - protected $QA; - - /** - * Curve - * - * @var EC\BaseCurves\Base - */ - protected $curve; - - /** - * Signature Format - * - * @var string - */ - protected $format; - - /** - * Signature Format (Short) - * - * @var string - */ - protected $shortFormat; - - /** - * Curve Name - * - * @var string - */ - private $curveName; - - /** - * Curve Order - * - * Used for deterministic ECDSA - * - * @var BigInteger - */ - protected $q; - - /** - * Alias for the private key - * - * Used for deterministic ECDSA. AsymmetricKey expects $x. I don't like x because - * with x you have x * the base point yielding an (x, y)-coordinate that is the - * public key. But the x is different depending on which side of the equal sign - * you're on. It's less ambiguous if you do dA * base point = (x, y)-coordinate. - * - * @var BigInteger - */ - protected $x; - - /** - * Context - * - * @var string - */ - protected $context; - - /** - * Signature Format - * - * @var string - */ - protected $sigFormat; - - /** - * Create public / private key pair. - * - * @param string $curve - * @return PrivateKey - */ - public static function createKey($curve) - { - self::initialize_static_variables(); - - $class = new \ReflectionClass(static::class); - if ($class->isFinal()) { - throw new \RuntimeException('createKey() should not be called from final classes (' . static::class . ')'); - } - - if (!isset(self::$engines['PHP'])) { - self::useBestEngine(); - } - - $curve = strtolower($curve); - if (self::$engines['libsodium'] && $curve == 'ed25519' && function_exists('sodium_crypto_sign_keypair')) { - $kp = sodium_crypto_sign_keypair(); - - $privatekey = EC::loadFormat('libsodium', sodium_crypto_sign_secretkey($kp)); - //$publickey = EC::loadFormat('libsodium', sodium_crypto_sign_publickey($kp)); - - $privatekey->curveName = 'Ed25519'; - //$publickey->curveName = $curve; - - return $privatekey; - } - - $privatekey = new PrivateKey(); - - $curveName = $curve; - if (preg_match('#(?:^curve|^ed)\d+$#', $curveName)) { - $curveName = ucfirst($curveName); - } elseif (substr($curveName, 0, 10) == 'brainpoolp') { - $curveName = 'brainpoolP' . substr($curveName, 10); - } - $curve = '\phpseclib3\Crypt\EC\Curves\\' . $curveName; - - if (!class_exists($curve)) { - throw new UnsupportedCurveException('Named Curve of ' . $curveName . ' is not supported'); - } - - $reflect = new \ReflectionClass($curve); - $curveName = $reflect->isFinal() ? - $reflect->getParentClass()->getShortName() : - $reflect->getShortName(); - - $curve = new $curve(); - if ($curve instanceof TwistedEdwardsCurve) { - $arr = $curve->extractSecret(Random::string($curve instanceof Ed448 ? 57 : 32)); - $privatekey->dA = $dA = $arr['dA']; - $privatekey->secret = $arr['secret']; - } else { - $privatekey->dA = $dA = $curve->createRandomMultiplier(); - } - if ($curve instanceof Curve25519 && self::$engines['libsodium']) { - //$r = pack('H*', '0900000000000000000000000000000000000000000000000000000000000000'); - //$QA = sodium_crypto_scalarmult($dA->toBytes(), $r); - $QA = sodium_crypto_box_publickey_from_secretkey($dA->toBytes()); - $privatekey->QA = [$curve->convertInteger(new BigInteger(strrev($QA), 256))]; - } else { - $privatekey->QA = $curve->multiplyPoint($curve->getBasePoint(), $dA); - } - $privatekey->curve = $curve; - - //$publickey = clone $privatekey; - //unset($publickey->dA); - //unset($publickey->x); - - $privatekey->curveName = $curveName; - //$publickey->curveName = $curveName; - - if ($privatekey->curve instanceof TwistedEdwardsCurve) { - return $privatekey->withHash($curve::HASH); - } - - return $privatekey; - } - - /** - * OnLoad Handler - * - * @return bool - */ - protected static function onLoad(array $components) - { - if (!isset(self::$engines['PHP'])) { - self::useBestEngine(); - } - - if (!isset($components['dA']) && !isset($components['QA'])) { - $new = new Parameters(); - $new->curve = $components['curve']; - return $new; - } - - $new = isset($components['dA']) ? - new PrivateKey() : - new PublicKey(); - $new->curve = $components['curve']; - $new->QA = $components['QA']; - - if (isset($components['dA'])) { - $new->dA = $components['dA']; - $new->secret = $components['secret']; - } - - if ($new->curve instanceof TwistedEdwardsCurve) { - return $new->withHash($components['curve']::HASH); - } - - return $new; - } - - /** - * Constructor - * - * PublicKey and PrivateKey objects can only be created from abstract RSA class - */ - protected function __construct() - { - $this->sigFormat = self::validatePlugin('Signature', 'ASN1'); - $this->shortFormat = 'ASN1'; - - parent::__construct(); - } - - /** - * Returns the curve - * - * Returns a string if it's a named curve, an array if not - * - * @return string|array - */ - public function getCurve() - { - if ($this->curveName) { - return $this->curveName; - } - - if ($this->curve instanceof MontgomeryCurve) { - $this->curveName = $this->curve instanceof Curve25519 ? 'Curve25519' : 'Curve448'; - return $this->curveName; - } - - if ($this->curve instanceof TwistedEdwardsCurve) { - $this->curveName = $this->curve instanceof Ed25519 ? 'Ed25519' : 'Ed448'; - return $this->curveName; - } - - $params = $this->getParameters()->toString('PKCS8', ['namedCurve' => true]); - $decoded = ASN1::extractBER($params); - $decoded = ASN1::decodeBER($decoded); - $decoded = ASN1::asn1map($decoded[0], ECParameters::MAP); - if (isset($decoded['namedCurve'])) { - $this->curveName = $decoded['namedCurve']; - return $decoded['namedCurve']; - } - - if (!$namedCurves) { - PKCS1::useSpecifiedCurve(); - } - - return $decoded; - } - - /** - * Returns the key size - * - * Quoting https://tools.ietf.org/html/rfc5656#section-2, - * - * "The size of a set of elliptic curve domain parameters on a prime - * curve is defined as the number of bits in the binary representation - * of the field order, commonly denoted by p. Size on a - * characteristic-2 curve is defined as the number of bits in the binary - * representation of the field, commonly denoted by m. A set of - * elliptic curve domain parameters defines a group of order n generated - * by a base point P" - * - * @return int - */ - public function getLength() - { - return $this->curve->getLength(); - } - - /** - * Returns the current engine being used - * - * @see self::useInternalEngine() - * @see self::useBestEngine() - * @return string - */ - public function getEngine() - { - if (!isset(self::$engines['PHP'])) { - self::useBestEngine(); - } - if ($this->curve instanceof TwistedEdwardsCurve) { - return $this->curve instanceof Ed25519 && self::$engines['libsodium'] && !isset($this->context) ? - 'libsodium' : 'PHP'; - } - - return self::$engines['OpenSSL'] && in_array($this->hash->getHash(), openssl_get_md_methods()) ? - 'OpenSSL' : 'PHP'; - } - - /** - * Returns the public key coordinates as a string - * - * Used by ECDH - * - * @return string - */ - public function getEncodedCoordinates() - { - if ($this->curve instanceof MontgomeryCurve) { - return strrev($this->QA[0]->toBytes(true)); - } - if ($this->curve instanceof TwistedEdwardsCurve) { - return $this->curve->encodePoint($this->QA); - } - return "\4" . $this->QA[0]->toBytes(true) . $this->QA[1]->toBytes(true); - } - - /** - * Returns the parameters - * - * @see self::getPublicKey() - * @param string $type optional - * @return mixed - */ - public function getParameters($type = 'PKCS1') - { - $type = self::validatePlugin('Keys', $type, 'saveParameters'); - - $key = $type::saveParameters($this->curve); - - return EC::load($key, 'PKCS1') - ->withHash($this->hash->getHash()) - ->withSignatureFormat($this->shortFormat); - } - - /** - * Determines the signature padding mode - * - * Valid values are: ASN1, SSH2, Raw - * - * @param string $format - */ - public function withSignatureFormat($format) - { - if ($this->curve instanceof MontgomeryCurve) { - throw new UnsupportedOperationException('Montgomery Curves cannot be used to create signatures'); - } - - $new = clone $this; - $new->shortFormat = $format; - $new->sigFormat = self::validatePlugin('Signature', $format); - return $new; - } - - /** - * Returns the signature format currently being used - * - */ - public function getSignatureFormat() - { - return $this->shortFormat; - } - - /** - * Sets the context - * - * Used by Ed25519 / Ed448. - * - * @see self::sign() - * @see self::verify() - * @param string $context optional - */ - public function withContext($context = null) - { - if (!$this->curve instanceof TwistedEdwardsCurve) { - throw new UnsupportedCurveException('Only Ed25519 and Ed448 support contexts'); - } - - $new = clone $this; - if (!isset($context)) { - $new->context = null; - return $new; - } - if (!is_string($context)) { - throw new \InvalidArgumentException('setContext expects a string'); - } - if (strlen($context) > 255) { - throw new \LengthException('The context is supposed to be, at most, 255 bytes long'); - } - $new->context = $context; - return $new; - } - - /** - * Returns the signature format currently being used - * - */ - public function getContext() - { - return $this->context; - } - - /** - * Determines which hashing function should be used - * - * @param string $hash - */ - public function withHash($hash) - { - if ($this->curve instanceof MontgomeryCurve) { - throw new UnsupportedOperationException('Montgomery Curves cannot be used to create signatures'); - } - if ($this->curve instanceof Ed25519 && $hash != 'sha512') { - throw new UnsupportedAlgorithmException('Ed25519 only supports sha512 as a hash'); - } - if ($this->curve instanceof Ed448 && $hash != 'shake256-912') { - throw new UnsupportedAlgorithmException('Ed448 only supports shake256 with a length of 114 bytes'); - } - - return parent::withHash($hash); - } - - /** - * __toString() magic method - * - * @return string - */ - public function __toString() - { - if ($this->curve instanceof MontgomeryCurve) { - return ''; - } - - return parent::__toString(); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Base.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Base.php deleted file mode 100644 index e35e142..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Base.php +++ /dev/null @@ -1,218 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves; - -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * Base - * - * @author Jim Wigginton - */ -abstract class Base -{ - /** - * The Order - * - * @var BigInteger - */ - protected $order; - - /** - * Finite Field Integer factory - * - * @var FiniteField\Integer - */ - protected $factory; - - /** - * Returns a random integer - * - * @return object - */ - public function randomInteger() - { - return $this->factory->randomInteger(); - } - - /** - * Converts a BigInteger to a FiniteField\Integer integer - * - * @return object - */ - public function convertInteger(BigInteger $x) - { - return $this->factory->newInteger($x); - } - - /** - * Returns the length, in bytes, of the modulo - * - * @return integer - */ - public function getLengthInBytes() - { - return $this->factory->getLengthInBytes(); - } - - /** - * Returns the length, in bits, of the modulo - * - * @return integer - */ - public function getLength() - { - return $this->factory->getLength(); - } - - /** - * Multiply a point on the curve by a scalar - * - * Uses the montgomery ladder technique as described here: - * - * https://en.wikipedia.org/wiki/Elliptic_curve_point_multiplication#Montgomery_ladder - * https://github.com/phpecc/phpecc/issues/16#issuecomment-59176772 - * - * @return array - */ - public function multiplyPoint(array $p, BigInteger $d) - { - $alreadyInternal = isset($p[2]); - $r = $alreadyInternal ? - [[], $p] : - [[], $this->convertToInternal($p)]; - - $d = $d->toBits(); - for ($i = 0; $i < strlen($d); $i++) { - $d_i = (int) $d[$i]; - $r[1 - $d_i] = $this->addPoint($r[0], $r[1]); - $r[$d_i] = $this->doublePoint($r[$d_i]); - } - - return $alreadyInternal ? $r[0] : $this->convertToAffine($r[0]); - } - - /** - * Creates a random scalar multiplier - * - * @return BigInteger - */ - public function createRandomMultiplier() - { - static $one; - if (!isset($one)) { - $one = new BigInteger(1); - } - - return BigInteger::randomRange($one, $this->order->subtract($one)); - } - - /** - * Performs range check - */ - public function rangeCheck(BigInteger $x) - { - static $zero; - if (!isset($zero)) { - $zero = new BigInteger(); - } - - if (!isset($this->order)) { - throw new \RuntimeException('setOrder needs to be called before this method'); - } - if ($x->compare($this->order) > 0 || $x->compare($zero) <= 0) { - throw new \RangeException('x must be between 1 and the order of the curve'); - } - } - - /** - * Sets the Order - */ - public function setOrder(BigInteger $order) - { - $this->order = $order; - } - - /** - * Returns the Order - * - * @return BigInteger - */ - public function getOrder() - { - return $this->order; - } - - /** - * Use a custom defined modular reduction function - * - * @return object - */ - public function setReduction(callable $func) - { - $this->factory->setReduction($func); - } - - /** - * Returns the affine point - * - * @return object[] - */ - public function convertToAffine(array $p) - { - return $p; - } - - /** - * Converts an affine point to a jacobian coordinate - * - * @return object[] - */ - public function convertToInternal(array $p) - { - return $p; - } - - /** - * Negates a point - * - * @return object[] - */ - public function negatePoint(array $p) - { - $temp = [ - $p[0], - $p[1]->negate() - ]; - if (isset($p[2])) { - $temp[] = $p[2]; - } - return $temp; - } - - /** - * Multiply and Add Points - * - * @return int[] - */ - public function multiplyAddPoints(array $points, array $scalars) - { - $p1 = $this->convertToInternal($points[0]); - $p2 = $this->convertToInternal($points[1]); - $p1 = $this->multiplyPoint($p1, $scalars[0]); - $p2 = $this->multiplyPoint($p2, $scalars[1]); - $r = $this->addPoint($p1, $p2); - return $this->convertToAffine($r); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Binary.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Binary.php deleted file mode 100644 index df099db..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Binary.php +++ /dev/null @@ -1,373 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves; - -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -use OCA\Libresign\Vendor\phpseclib3\Math\BinaryField; -use OCA\Libresign\Vendor\phpseclib3\Math\BinaryField\Integer as BinaryInteger; - -/** - * Curves over y^2 + x*y = x^3 + a*x^2 + b - * - * @author Jim Wigginton - */ -class Binary extends Base -{ - /** - * Binary Field Integer factory - * - * @var BinaryField - */ - protected $factory; - - /** - * Cofficient for x^1 - * - * @var object - */ - protected $a; - - /** - * Cofficient for x^0 - * - * @var object - */ - protected $b; - - /** - * Base Point - * - * @var object - */ - protected $p; - - /** - * The number one over the specified finite field - * - * @var object - */ - protected $one; - - /** - * The modulo - * - * @var BigInteger - */ - protected $modulo; - - /** - * The Order - * - * @var BigInteger - */ - protected $order; - - /** - * Sets the modulo - */ - public function setModulo(...$modulo) - { - $this->modulo = $modulo; - $this->factory = new BinaryField(...$modulo); - - $this->one = $this->factory->newInteger("\1"); - } - - /** - * Set coefficients a and b - * - * @param string $a - * @param string $b - */ - public function setCoefficients($a, $b) - { - if (!isset($this->factory)) { - throw new \RuntimeException('setModulo needs to be called before this method'); - } - $this->a = $this->factory->newInteger(pack('H*', $a)); - $this->b = $this->factory->newInteger(pack('H*', $b)); - } - - /** - * Set x and y coordinates for the base point - * - * @param string|BinaryInteger $x - * @param string|BinaryInteger $y - */ - public function setBasePoint($x, $y) - { - switch (true) { - case !is_string($x) && !$x instanceof BinaryInteger: - throw new \UnexpectedValueException('Argument 1 passed to Binary::setBasePoint() must be a string or an instance of BinaryField\Integer'); - case !is_string($y) && !$y instanceof BinaryInteger: - throw new \UnexpectedValueException('Argument 2 passed to Binary::setBasePoint() must be a string or an instance of BinaryField\Integer'); - } - if (!isset($this->factory)) { - throw new \RuntimeException('setModulo needs to be called before this method'); - } - $this->p = [ - is_string($x) ? $this->factory->newInteger(pack('H*', $x)) : $x, - is_string($y) ? $this->factory->newInteger(pack('H*', $y)) : $y - ]; - } - - /** - * Retrieve the base point as an array - * - * @return array - */ - public function getBasePoint() - { - if (!isset($this->factory)) { - throw new \RuntimeException('setModulo needs to be called before this method'); - } - /* - if (!isset($this->p)) { - throw new \RuntimeException('setBasePoint needs to be called before this method'); - } - */ - return $this->p; - } - - /** - * Adds two points on the curve - * - * @return FiniteField[] - */ - public function addPoint(array $p, array $q) - { - if (!isset($this->factory)) { - throw new \RuntimeException('setModulo needs to be called before this method'); - } - - if (!count($p) || !count($q)) { - if (count($q)) { - return $q; - } - if (count($p)) { - return $p; - } - return []; - } - - if (!isset($p[2]) || !isset($q[2])) { - throw new \RuntimeException('Affine coordinates need to be manually converted to "Jacobi" coordinates or vice versa'); - } - - if ($p[0]->equals($q[0])) { - return !$p[1]->equals($q[1]) ? [] : $this->doublePoint($p); - } - - // formulas from http://hyperelliptic.org/EFD/g12o/auto-shortw-jacobian.html - - list($x1, $y1, $z1) = $p; - list($x2, $y2, $z2) = $q; - - $o1 = $z1->multiply($z1); - $b = $x2->multiply($o1); - - if ($z2->equals($this->one)) { - $d = $y2->multiply($o1)->multiply($z1); - $e = $x1->add($b); - $f = $y1->add($d); - $z3 = $e->multiply($z1); - $h = $f->multiply($x2)->add($z3->multiply($y2)); - $i = $f->add($z3); - $g = $z3->multiply($z3); - $p1 = $this->a->multiply($g); - $p2 = $f->multiply($i); - $p3 = $e->multiply($e)->multiply($e); - $x3 = $p1->add($p2)->add($p3); - $y3 = $i->multiply($x3)->add($g->multiply($h)); - - return [$x3, $y3, $z3]; - } - - $o2 = $z2->multiply($z2); - $a = $x1->multiply($o2); - $c = $y1->multiply($o2)->multiply($z2); - $d = $y2->multiply($o1)->multiply($z1); - $e = $a->add($b); - $f = $c->add($d); - $g = $e->multiply($z1); - $h = $f->multiply($x2)->add($g->multiply($y2)); - $z3 = $g->multiply($z2); - $i = $f->add($z3); - $p1 = $this->a->multiply($z3->multiply($z3)); - $p2 = $f->multiply($i); - $p3 = $e->multiply($e)->multiply($e); - $x3 = $p1->add($p2)->add($p3); - $y3 = $i->multiply($x3)->add($g->multiply($g)->multiply($h)); - - return [$x3, $y3, $z3]; - } - - /** - * Doubles a point on a curve - * - * @return FiniteField[] - */ - public function doublePoint(array $p) - { - if (!isset($this->factory)) { - throw new \RuntimeException('setModulo needs to be called before this method'); - } - - if (!count($p)) { - return []; - } - - if (!isset($p[2])) { - throw new \RuntimeException('Affine coordinates need to be manually converted to "Jacobi" coordinates or vice versa'); - } - - // formulas from http://hyperelliptic.org/EFD/g12o/auto-shortw-jacobian.html - - list($x1, $y1, $z1) = $p; - - $a = $x1->multiply($x1); - $b = $a->multiply($a); - - if ($z1->equals($this->one)) { - $x3 = $b->add($this->b); - $z3 = clone $x1; - $p1 = $a->add($y1)->add($z3)->multiply($this->b); - $p2 = $a->add($y1)->multiply($b); - $y3 = $p1->add($p2); - - return [$x3, $y3, $z3]; - } - - $c = $z1->multiply($z1); - $d = $c->multiply($c); - $x3 = $b->add($this->b->multiply($d->multiply($d))); - $z3 = $x1->multiply($c); - $p1 = $b->multiply($z3); - $p2 = $a->add($y1->multiply($z1))->add($z3)->multiply($x3); - $y3 = $p1->add($p2); - - return [$x3, $y3, $z3]; - } - - /** - * Returns the X coordinate and the derived Y coordinate - * - * Not supported because it is covered by patents. - * Quoting https://www.openssl.org/docs/man1.1.0/apps/ecparam.html , - * - * "Due to patent issues the compressed option is disabled by default for binary curves - * and can be enabled by defining the preprocessor macro OPENSSL_EC_BIN_PT_COMP at - * compile time." - * - * @return array - */ - public function derivePoint($m) - { - throw new \RuntimeException('Point compression on binary finite field elliptic curves is not supported'); - } - - /** - * Tests whether or not the x / y values satisfy the equation - * - * @return boolean - */ - public function verifyPoint(array $p) - { - list($x, $y) = $p; - $lhs = $y->multiply($y); - $lhs = $lhs->add($x->multiply($y)); - $x2 = $x->multiply($x); - $x3 = $x2->multiply($x); - $rhs = $x3->add($this->a->multiply($x2))->add($this->b); - - return $lhs->equals($rhs); - } - - /** - * Returns the modulo - * - * @return BigInteger - */ - public function getModulo() - { - return $this->modulo; - } - - /** - * Returns the a coefficient - * - * @return \phpseclib3\Math\PrimeField\Integer - */ - public function getA() - { - return $this->a; - } - - /** - * Returns the a coefficient - * - * @return \phpseclib3\Math\PrimeField\Integer - */ - public function getB() - { - return $this->b; - } - - /** - * Returns the affine point - * - * A Jacobian Coordinate is of the form (x, y, z). - * To convert a Jacobian Coordinate to an Affine Point - * you do (x / z^2, y / z^3) - * - * @return \phpseclib3\Math\PrimeField\Integer[] - */ - public function convertToAffine(array $p) - { - if (!isset($p[2])) { - return $p; - } - list($x, $y, $z) = $p; - $z = $this->one->divide($z); - $z2 = $z->multiply($z); - return [ - $x->multiply($z2), - $y->multiply($z2)->multiply($z) - ]; - } - - /** - * Converts an affine point to a jacobian coordinate - * - * @return \phpseclib3\Math\PrimeField\Integer[] - */ - public function convertToInternal(array $p) - { - if (isset($p[2])) { - return $p; - } - - $p[2] = clone $this->one; - $p['fresh'] = true; - return $p; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/KoblitzPrime.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/KoblitzPrime.php deleted file mode 100644 index e6550bf..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/KoblitzPrime.php +++ /dev/null @@ -1,335 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves; - -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -use OCA\Libresign\Vendor\phpseclib3\Math\PrimeField; - -/** - * Curves over y^2 = x^3 + b - * - * @author Jim Wigginton - */ -class KoblitzPrime extends Prime -{ - /** - * Basis - * - * @var list - */ - protected $basis; - - /** - * Beta - * - * @var PrimeField\Integer - */ - protected $beta; - - // don't overwrite setCoefficients() with one that only accepts one parameter so that - // one might be able to switch between KoblitzPrime and Prime more easily (for benchmarking - // purposes). - - /** - * Multiply and Add Points - * - * Uses a efficiently computable endomorphism to achieve a slight speedup - * - * Adapted from: - * https://github.com/indutny/elliptic/blob/725bd91/lib/elliptic/curve/short.js#L219 - * - * @return int[] - */ - public function multiplyAddPoints(array $points, array $scalars) - { - static $zero, $one, $two; - if (!isset($two)) { - $two = new BigInteger(2); - $one = new BigInteger(1); - } - - if (!isset($this->beta)) { - // get roots - $inv = $this->one->divide($this->two)->negate(); - $s = $this->three->negate()->squareRoot()->multiply($inv); - $betas = [ - $inv->add($s), - $inv->subtract($s) - ]; - $this->beta = $betas[0]->compare($betas[1]) < 0 ? $betas[0] : $betas[1]; - //echo strtoupper($this->beta->toHex(true)) . "\n"; exit; - } - - if (!isset($this->basis)) { - $factory = new PrimeField($this->order); - $tempOne = $factory->newInteger($one); - $tempTwo = $factory->newInteger($two); - $tempThree = $factory->newInteger(new BigInteger(3)); - - $inv = $tempOne->divide($tempTwo)->negate(); - $s = $tempThree->negate()->squareRoot()->multiply($inv); - - $lambdas = [ - $inv->add($s), - $inv->subtract($s) - ]; - - $lhs = $this->multiplyPoint($this->p, $lambdas[0])[0]; - $rhs = $this->p[0]->multiply($this->beta); - $lambda = $lhs->equals($rhs) ? $lambdas[0] : $lambdas[1]; - - $this->basis = static::extendedGCD($lambda->toBigInteger(), $this->order); - ///* - foreach ($this->basis as $basis) { - echo strtoupper($basis['a']->toHex(true)) . "\n"; - echo strtoupper($basis['b']->toHex(true)) . "\n\n"; - } - exit; - //*/ - } - - $npoints = $nscalars = []; - for ($i = 0; $i < count($points); $i++) { - $p = $points[$i]; - $k = $scalars[$i]->toBigInteger(); - - // begin split - list($v1, $v2) = $this->basis; - - $c1 = $v2['b']->multiply($k); - list($c1, $r) = $c1->divide($this->order); - if ($this->order->compare($r->multiply($two)) <= 0) { - $c1 = $c1->add($one); - } - - $c2 = $v1['b']->negate()->multiply($k); - list($c2, $r) = $c2->divide($this->order); - if ($this->order->compare($r->multiply($two)) <= 0) { - $c2 = $c2->add($one); - } - - $p1 = $c1->multiply($v1['a']); - $p2 = $c2->multiply($v2['a']); - $q1 = $c1->multiply($v1['b']); - $q2 = $c2->multiply($v2['b']); - - $k1 = $k->subtract($p1)->subtract($p2); - $k2 = $q1->add($q2)->negate(); - // end split - - $beta = [ - $p[0]->multiply($this->beta), - $p[1], - clone $this->one - ]; - - if (isset($p['naf'])) { - $beta['naf'] = array_map(function ($p) { - return [ - $p[0]->multiply($this->beta), - $p[1], - clone $this->one - ]; - }, $p['naf']); - $beta['nafwidth'] = $p['nafwidth']; - } - - if ($k1->isNegative()) { - $k1 = $k1->negate(); - $p = $this->negatePoint($p); - } - - if ($k2->isNegative()) { - $k2 = $k2->negate(); - $beta = $this->negatePoint($beta); - } - - $pos = 2 * $i; - $npoints[$pos] = $p; - $nscalars[$pos] = $this->factory->newInteger($k1); - - $pos++; - $npoints[$pos] = $beta; - $nscalars[$pos] = $this->factory->newInteger($k2); - } - - return parent::multiplyAddPoints($npoints, $nscalars); - } - - /** - * Returns the numerator and denominator of the slope - * - * @return FiniteField[] - */ - protected function doublePointHelper(array $p) - { - $numerator = $this->three->multiply($p[0])->multiply($p[0]); - $denominator = $this->two->multiply($p[1]); - return [$numerator, $denominator]; - } - - /** - * Doubles a jacobian coordinate on the curve - * - * See http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#doubling-dbl-2009-l - * - * @return FiniteField[] - */ - protected function jacobianDoublePoint(array $p) - { - list($x1, $y1, $z1) = $p; - $a = $x1->multiply($x1); - $b = $y1->multiply($y1); - $c = $b->multiply($b); - $d = $x1->add($b); - $d = $d->multiply($d)->subtract($a)->subtract($c)->multiply($this->two); - $e = $this->three->multiply($a); - $f = $e->multiply($e); - $x3 = $f->subtract($this->two->multiply($d)); - $y3 = $e->multiply($d->subtract($x3))->subtract( - $this->eight->multiply($c) - ); - $z3 = $this->two->multiply($y1)->multiply($z1); - return [$x3, $y3, $z3]; - } - - /** - * Doubles a "fresh" jacobian coordinate on the curve - * - * See http://hyperelliptic.org/EFD/g1p/auto-shortw-jacobian-0.html#doubling-mdbl-2007-bl - * - * @return FiniteField[] - */ - protected function jacobianDoublePointMixed(array $p) - { - list($x1, $y1) = $p; - $xx = $x1->multiply($x1); - $yy = $y1->multiply($y1); - $yyyy = $yy->multiply($yy); - $s = $x1->add($yy); - $s = $s->multiply($s)->subtract($xx)->subtract($yyyy)->multiply($this->two); - $m = $this->three->multiply($xx); - $t = $m->multiply($m)->subtract($this->two->multiply($s)); - $x3 = $t; - $y3 = $s->subtract($t); - $y3 = $m->multiply($y3)->subtract($this->eight->multiply($yyyy)); - $z3 = $this->two->multiply($y1); - return [$x3, $y3, $z3]; - } - - /** - * Tests whether or not the x / y values satisfy the equation - * - * @return boolean - */ - public function verifyPoint(array $p) - { - list($x, $y) = $p; - $lhs = $y->multiply($y); - $temp = $x->multiply($x)->multiply($x); - $rhs = $temp->add($this->b); - - return $lhs->equals($rhs); - } - - /** - * Calculates the parameters needed from the Euclidean algorithm as discussed at - * http://diamond.boisestate.edu/~liljanab/MATH308/GuideToECC.pdf#page=148 - * - * @param BigInteger $u - * @param BigInteger $v - * @return BigInteger[] - */ - protected static function extendedGCD(BigInteger $u, BigInteger $v) - { - $one = new BigInteger(1); - $zero = new BigInteger(); - - $a = clone $one; - $b = clone $zero; - $c = clone $zero; - $d = clone $one; - - $stop = $v->bitwise_rightShift($v->getLength() >> 1); - - $a1 = clone $zero; - $b1 = clone $zero; - $a2 = clone $zero; - $b2 = clone $zero; - - $postGreatestIndex = 0; - - while (!$v->equals($zero)) { - list($q) = $u->divide($v); - - $temp = $u; - $u = $v; - $v = $temp->subtract($v->multiply($q)); - - $temp = $a; - $a = $c; - $c = $temp->subtract($a->multiply($q)); - - $temp = $b; - $b = $d; - $d = $temp->subtract($b->multiply($q)); - - if ($v->compare($stop) > 0) { - $a0 = $v; - $b0 = $c; - } else { - $postGreatestIndex++; - } - - if ($postGreatestIndex == 1) { - $a1 = $v; - $b1 = $c->negate(); - } - - if ($postGreatestIndex == 2) { - $rhs = $a0->multiply($a0)->add($b0->multiply($b0)); - $lhs = $v->multiply($v)->add($b->multiply($b)); - if ($lhs->compare($rhs) <= 0) { - $a2 = $a0; - $b2 = $b0->negate(); - } else { - $a2 = $v; - $b2 = $c->negate(); - } - - break; - } - } - - return [ - ['a' => $a1, 'b' => $b1], - ['a' => $a2, 'b' => $b2] - ]; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Montgomery.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Montgomery.php deleted file mode 100644 index 7e6eba4..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Montgomery.php +++ /dev/null @@ -1,279 +0,0 @@ - - * @copyright 2019 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves\Curve25519; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -use OCA\Libresign\Vendor\phpseclib3\Math\PrimeField; -use OCA\Libresign\Vendor\phpseclib3\Math\PrimeField\Integer as PrimeInteger; - -/** - * Curves over y^2 = x^3 + a*x + x - * - * @author Jim Wigginton - */ -class Montgomery extends Base -{ - /** - * Prime Field Integer factory - * - * @var PrimeField - */ - protected $factory; - - /** - * Cofficient for x - * - * @var object - */ - protected $a; - - /** - * Constant used for point doubling - * - * @var object - */ - protected $a24; - - /** - * The Number Zero - * - * @var object - */ - protected $zero; - - /** - * The Number One - * - * @var object - */ - protected $one; - - /** - * Base Point - * - * @var object - */ - protected $p; - - /** - * The modulo - * - * @var BigInteger - */ - protected $modulo; - - /** - * The Order - * - * @var BigInteger - */ - protected $order; - - /** - * Sets the modulo - */ - public function setModulo(BigInteger $modulo) - { - $this->modulo = $modulo; - $this->factory = new PrimeField($modulo); - $this->zero = $this->factory->newInteger(new BigInteger()); - $this->one = $this->factory->newInteger(new BigInteger(1)); - } - - /** - * Set coefficients a - */ - public function setCoefficients(BigInteger $a) - { - if (!isset($this->factory)) { - throw new \RuntimeException('setModulo needs to be called before this method'); - } - $this->a = $this->factory->newInteger($a); - $two = $this->factory->newInteger(new BigInteger(2)); - $four = $this->factory->newInteger(new BigInteger(4)); - $this->a24 = $this->a->subtract($two)->divide($four); - } - - /** - * Set x and y coordinates for the base point - * - * @param BigInteger|PrimeInteger $x - * @param BigInteger|PrimeInteger $y - * @return PrimeInteger[] - */ - public function setBasePoint($x, $y) - { - switch (true) { - case !$x instanceof BigInteger && !$x instanceof PrimeInteger: - throw new \UnexpectedValueException('Argument 1 passed to Prime::setBasePoint() must be an instance of either BigInteger or PrimeField\Integer'); - case !$y instanceof BigInteger && !$y instanceof PrimeInteger: - throw new \UnexpectedValueException('Argument 2 passed to Prime::setBasePoint() must be an instance of either BigInteger or PrimeField\Integer'); - } - if (!isset($this->factory)) { - throw new \RuntimeException('setModulo needs to be called before this method'); - } - $this->p = [ - $x instanceof BigInteger ? $this->factory->newInteger($x) : $x, - $y instanceof BigInteger ? $this->factory->newInteger($y) : $y - ]; - } - - /** - * Retrieve the base point as an array - * - * @return array - */ - public function getBasePoint() - { - if (!isset($this->factory)) { - throw new \RuntimeException('setModulo needs to be called before this method'); - } - /* - if (!isset($this->p)) { - throw new \RuntimeException('setBasePoint needs to be called before this method'); - } - */ - return $this->p; - } - - /** - * Doubles and adds a point on a curve - * - * See https://tools.ietf.org/html/draft-ietf-tls-curve25519-01#appendix-A.1.3 - * - * @return FiniteField[][] - */ - private function doubleAndAddPoint(array $p, array $q, PrimeInteger $x1) - { - if (!isset($this->factory)) { - throw new \RuntimeException('setModulo needs to be called before this method'); - } - - if (!count($p) || !count($q)) { - return []; - } - - if (!isset($p[1])) { - throw new \RuntimeException('Affine coordinates need to be manually converted to XZ coordinates'); - } - - list($x2, $z2) = $p; - list($x3, $z3) = $q; - - $a = $x2->add($z2); - $aa = $a->multiply($a); - $b = $x2->subtract($z2); - $bb = $b->multiply($b); - $e = $aa->subtract($bb); - $c = $x3->add($z3); - $d = $x3->subtract($z3); - $da = $d->multiply($a); - $cb = $c->multiply($b); - $temp = $da->add($cb); - $x5 = $temp->multiply($temp); - $temp = $da->subtract($cb); - $z5 = $x1->multiply($temp->multiply($temp)); - $x4 = $aa->multiply($bb); - $temp = static::class == Curve25519::class ? $bb : $aa; - $z4 = $e->multiply($temp->add($this->a24->multiply($e))); - - return [ - [$x4, $z4], - [$x5, $z5] - ]; - } - - /** - * Multiply a point on the curve by a scalar - * - * Uses the montgomery ladder technique as described here: - * - * https://en.wikipedia.org/wiki/Elliptic_curve_point_multiplication#Montgomery_ladder - * https://github.com/phpecc/phpecc/issues/16#issuecomment-59176772 - * - * @return array - */ - public function multiplyPoint(array $p, BigInteger $d) - { - $p1 = [$this->one, $this->zero]; - $alreadyInternal = isset($p[1]); - $p2 = $this->convertToInternal($p); - $x = $p[0]; - - $b = $d->toBits(); - $b = str_pad($b, 256, '0', STR_PAD_LEFT); - for ($i = 0; $i < strlen($b); $i++) { - $b_i = (int) $b[$i]; - if ($b_i) { - list($p2, $p1) = $this->doubleAndAddPoint($p2, $p1, $x); - } else { - list($p1, $p2) = $this->doubleAndAddPoint($p1, $p2, $x); - } - } - - return $alreadyInternal ? $p1 : $this->convertToAffine($p1); - } - - /** - * Converts an affine point to an XZ coordinate - * - * From https://hyperelliptic.org/EFD/g1p/auto-montgom-xz.html - * - * XZ coordinates represent x y as X Z satsfying the following equations: - * - * x=X/Z - * - * @return PrimeInteger[] - */ - public function convertToInternal(array $p) - { - if (empty($p)) { - return [clone $this->zero, clone $this->one]; - } - - if (isset($p[1])) { - return $p; - } - - $p[1] = clone $this->one; - - return $p; - } - - /** - * Returns the affine point - * - * @return PrimeInteger[] - */ - public function convertToAffine(array $p) - { - if (!isset($p[1])) { - return $p; - } - list($x, $z) = $p; - return [$x->divide($z)]; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Prime.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Prime.php deleted file mode 100644 index b410dd28..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/Prime.php +++ /dev/null @@ -1,785 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves; - -use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -use OCA\Libresign\Vendor\phpseclib3\Math\Common\FiniteField\Integer; -use OCA\Libresign\Vendor\phpseclib3\Math\PrimeField; -use OCA\Libresign\Vendor\phpseclib3\Math\PrimeField\Integer as PrimeInteger; - -/** - * Curves over y^2 = x^3 + a*x + b - * - * @author Jim Wigginton - */ -class Prime extends Base -{ - /** - * Prime Field Integer factory - * - * @var \phpseclib3\Math\PrimeFields - */ - protected $factory; - - /** - * Cofficient for x^1 - * - * @var object - */ - protected $a; - - /** - * Cofficient for x^0 - * - * @var object - */ - protected $b; - - /** - * Base Point - * - * @var object - */ - protected $p; - - /** - * The number one over the specified finite field - * - * @var object - */ - protected $one; - - /** - * The number two over the specified finite field - * - * @var object - */ - protected $two; - - /** - * The number three over the specified finite field - * - * @var object - */ - protected $three; - - /** - * The number four over the specified finite field - * - * @var object - */ - protected $four; - - /** - * The number eight over the specified finite field - * - * @var object - */ - protected $eight; - - /** - * The modulo - * - * @var BigInteger - */ - protected $modulo; - - /** - * The Order - * - * @var BigInteger - */ - protected $order; - - /** - * Sets the modulo - */ - public function setModulo(BigInteger $modulo) - { - $this->modulo = $modulo; - $this->factory = new PrimeField($modulo); - $this->two = $this->factory->newInteger(new BigInteger(2)); - $this->three = $this->factory->newInteger(new BigInteger(3)); - // used by jacobian coordinates - $this->one = $this->factory->newInteger(new BigInteger(1)); - $this->four = $this->factory->newInteger(new BigInteger(4)); - $this->eight = $this->factory->newInteger(new BigInteger(8)); - } - - /** - * Set coefficients a and b - */ - public function setCoefficients(BigInteger $a, BigInteger $b) - { - if (!isset($this->factory)) { - throw new \RuntimeException('setModulo needs to be called before this method'); - } - $this->a = $this->factory->newInteger($a); - $this->b = $this->factory->newInteger($b); - } - - /** - * Set x and y coordinates for the base point - * - * @param BigInteger|PrimeInteger $x - * @param BigInteger|PrimeInteger $y - * @return PrimeInteger[] - */ - public function setBasePoint($x, $y) - { - switch (true) { - case !$x instanceof BigInteger && !$x instanceof PrimeInteger: - throw new \UnexpectedValueException('Argument 1 passed to Prime::setBasePoint() must be an instance of either BigInteger or PrimeField\Integer'); - case !$y instanceof BigInteger && !$y instanceof PrimeInteger: - throw new \UnexpectedValueException('Argument 2 passed to Prime::setBasePoint() must be an instance of either BigInteger or PrimeField\Integer'); - } - if (!isset($this->factory)) { - throw new \RuntimeException('setModulo needs to be called before this method'); - } - $this->p = [ - $x instanceof BigInteger ? $this->factory->newInteger($x) : $x, - $y instanceof BigInteger ? $this->factory->newInteger($y) : $y - ]; - } - - /** - * Retrieve the base point as an array - * - * @return array - */ - public function getBasePoint() - { - if (!isset($this->factory)) { - throw new \RuntimeException('setModulo needs to be called before this method'); - } - /* - if (!isset($this->p)) { - throw new \RuntimeException('setBasePoint needs to be called before this method'); - } - */ - return $this->p; - } - - /** - * Adds two "fresh" jacobian form on the curve - * - * @return FiniteField[] - */ - protected function jacobianAddPointMixedXY(array $p, array $q) - { - list($u1, $s1) = $p; - list($u2, $s2) = $q; - if ($u1->equals($u2)) { - if (!$s1->equals($s2)) { - return []; - } else { - return $this->doublePoint($p); - } - } - $h = $u2->subtract($u1); - $r = $s2->subtract($s1); - $h2 = $h->multiply($h); - $h3 = $h2->multiply($h); - $v = $u1->multiply($h2); - $x3 = $r->multiply($r)->subtract($h3)->subtract($v->multiply($this->two)); - $y3 = $r->multiply( - $v->subtract($x3) - )->subtract( - $s1->multiply($h3) - ); - return [$x3, $y3, $h]; - } - - /** - * Adds one "fresh" jacobian form on the curve - * - * The second parameter should be the "fresh" one - * - * @return FiniteField[] - */ - protected function jacobianAddPointMixedX(array $p, array $q) - { - list($u1, $s1, $z1) = $p; - list($x2, $y2) = $q; - - $z12 = $z1->multiply($z1); - - $u2 = $x2->multiply($z12); - $s2 = $y2->multiply($z12->multiply($z1)); - if ($u1->equals($u2)) { - if (!$s1->equals($s2)) { - return []; - } else { - return $this->doublePoint($p); - } - } - $h = $u2->subtract($u1); - $r = $s2->subtract($s1); - $h2 = $h->multiply($h); - $h3 = $h2->multiply($h); - $v = $u1->multiply($h2); - $x3 = $r->multiply($r)->subtract($h3)->subtract($v->multiply($this->two)); - $y3 = $r->multiply( - $v->subtract($x3) - )->subtract( - $s1->multiply($h3) - ); - $z3 = $h->multiply($z1); - return [$x3, $y3, $z3]; - } - - /** - * Adds two jacobian coordinates on the curve - * - * @return FiniteField[] - */ - protected function jacobianAddPoint(array $p, array $q) - { - list($x1, $y1, $z1) = $p; - list($x2, $y2, $z2) = $q; - - $z12 = $z1->multiply($z1); - $z22 = $z2->multiply($z2); - - $u1 = $x1->multiply($z22); - $u2 = $x2->multiply($z12); - $s1 = $y1->multiply($z22->multiply($z2)); - $s2 = $y2->multiply($z12->multiply($z1)); - if ($u1->equals($u2)) { - if (!$s1->equals($s2)) { - return []; - } else { - return $this->doublePoint($p); - } - } - $h = $u2->subtract($u1); - $r = $s2->subtract($s1); - $h2 = $h->multiply($h); - $h3 = $h2->multiply($h); - $v = $u1->multiply($h2); - $x3 = $r->multiply($r)->subtract($h3)->subtract($v->multiply($this->two)); - $y3 = $r->multiply( - $v->subtract($x3) - )->subtract( - $s1->multiply($h3) - ); - $z3 = $h->multiply($z1)->multiply($z2); - return [$x3, $y3, $z3]; - } - - /** - * Adds two points on the curve - * - * @return FiniteField[] - */ - public function addPoint(array $p, array $q) - { - if (!isset($this->factory)) { - throw new \RuntimeException('setModulo needs to be called before this method'); - } - - if (!count($p) || !count($q)) { - if (count($q)) { - return $q; - } - if (count($p)) { - return $p; - } - return []; - } - - // use jacobian coordinates - if (isset($p[2]) && isset($q[2])) { - if (isset($p['fresh']) && isset($q['fresh'])) { - return $this->jacobianAddPointMixedXY($p, $q); - } - if (isset($p['fresh'])) { - return $this->jacobianAddPointMixedX($q, $p); - } - if (isset($q['fresh'])) { - return $this->jacobianAddPointMixedX($p, $q); - } - return $this->jacobianAddPoint($p, $q); - } - - if (isset($p[2]) || isset($q[2])) { - throw new \RuntimeException('Affine coordinates need to be manually converted to Jacobi coordinates or vice versa'); - } - - if ($p[0]->equals($q[0])) { - if (!$p[1]->equals($q[1])) { - return []; - } else { // eg. doublePoint - list($numerator, $denominator) = $this->doublePointHelper($p); - } - } else { - $numerator = $q[1]->subtract($p[1]); - $denominator = $q[0]->subtract($p[0]); - } - $slope = $numerator->divide($denominator); - $x = $slope->multiply($slope)->subtract($p[0])->subtract($q[0]); - $y = $slope->multiply($p[0]->subtract($x))->subtract($p[1]); - - return [$x, $y]; - } - - /** - * Returns the numerator and denominator of the slope - * - * @return FiniteField[] - */ - protected function doublePointHelper(array $p) - { - $numerator = $this->three->multiply($p[0])->multiply($p[0])->add($this->a); - $denominator = $this->two->multiply($p[1]); - return [$numerator, $denominator]; - } - - /** - * Doubles a jacobian coordinate on the curve - * - * @return FiniteField[] - */ - protected function jacobianDoublePoint(array $p) - { - list($x, $y, $z) = $p; - $x2 = $x->multiply($x); - $y2 = $y->multiply($y); - $z2 = $z->multiply($z); - $s = $this->four->multiply($x)->multiply($y2); - $m1 = $this->three->multiply($x2); - $m2 = $this->a->multiply($z2->multiply($z2)); - $m = $m1->add($m2); - $x1 = $m->multiply($m)->subtract($this->two->multiply($s)); - $y1 = $m->multiply($s->subtract($x1))->subtract( - $this->eight->multiply($y2->multiply($y2)) - ); - $z1 = $this->two->multiply($y)->multiply($z); - return [$x1, $y1, $z1]; - } - - /** - * Doubles a "fresh" jacobian coordinate on the curve - * - * @return FiniteField[] - */ - protected function jacobianDoublePointMixed(array $p) - { - list($x, $y) = $p; - $x2 = $x->multiply($x); - $y2 = $y->multiply($y); - $s = $this->four->multiply($x)->multiply($y2); - $m1 = $this->three->multiply($x2); - $m = $m1->add($this->a); - $x1 = $m->multiply($m)->subtract($this->two->multiply($s)); - $y1 = $m->multiply($s->subtract($x1))->subtract( - $this->eight->multiply($y2->multiply($y2)) - ); - $z1 = $this->two->multiply($y); - return [$x1, $y1, $z1]; - } - - /** - * Doubles a point on a curve - * - * @return FiniteField[] - */ - public function doublePoint(array $p) - { - if (!isset($this->factory)) { - throw new \RuntimeException('setModulo needs to be called before this method'); - } - - if (!count($p)) { - return []; - } - - // use jacobian coordinates - if (isset($p[2])) { - if (isset($p['fresh'])) { - return $this->jacobianDoublePointMixed($p); - } - return $this->jacobianDoublePoint($p); - } - - list($numerator, $denominator) = $this->doublePointHelper($p); - - $slope = $numerator->divide($denominator); - - $x = $slope->multiply($slope)->subtract($p[0])->subtract($p[0]); - $y = $slope->multiply($p[0]->subtract($x))->subtract($p[1]); - - return [$x, $y]; - } - - /** - * Returns the X coordinate and the derived Y coordinate - * - * @return array - */ - public function derivePoint($m) - { - $y = ord(Strings::shift($m)); - $x = new BigInteger($m, 256); - $xp = $this->convertInteger($x); - switch ($y) { - case 2: - $ypn = false; - break; - case 3: - $ypn = true; - break; - default: - throw new \RuntimeException('Coordinate not in recognized format'); - } - $temp = $xp->multiply($this->a); - $temp = $xp->multiply($xp)->multiply($xp)->add($temp); - $temp = $temp->add($this->b); - $b = $temp->squareRoot(); - if (!$b) { - throw new \RuntimeException('Unable to derive Y coordinate'); - } - $bn = $b->isOdd(); - $yp = $ypn == $bn ? $b : $b->negate(); - return [$xp, $yp]; - } - - /** - * Tests whether or not the x / y values satisfy the equation - * - * @return boolean - */ - public function verifyPoint(array $p) - { - list($x, $y) = $p; - $lhs = $y->multiply($y); - $temp = $x->multiply($this->a); - $temp = $x->multiply($x)->multiply($x)->add($temp); - $rhs = $temp->add($this->b); - - return $lhs->equals($rhs); - } - - /** - * Returns the modulo - * - * @return BigInteger - */ - public function getModulo() - { - return $this->modulo; - } - - /** - * Returns the a coefficient - * - * @return PrimeInteger - */ - public function getA() - { - return $this->a; - } - - /** - * Returns the a coefficient - * - * @return PrimeInteger - */ - public function getB() - { - return $this->b; - } - - /** - * Multiply and Add Points - * - * Adapted from: - * https://github.com/indutny/elliptic/blob/725bd91/lib/elliptic/curve/base.js#L125 - * - * @return int[] - */ - public function multiplyAddPoints(array $points, array $scalars) - { - $length = count($points); - - foreach ($points as &$point) { - $point = $this->convertToInternal($point); - } - - $wnd = [$this->getNAFPoints($points[0], 7)]; - $wndWidth = [isset($points[0]['nafwidth']) ? $points[0]['nafwidth'] : 7]; - for ($i = 1; $i < $length; $i++) { - $wnd[] = $this->getNAFPoints($points[$i], 1); - $wndWidth[] = isset($points[$i]['nafwidth']) ? $points[$i]['nafwidth'] : 1; - } - - $naf = []; - - // comb all window NAFs - - $max = 0; - for ($i = $length - 1; $i >= 1; $i -= 2) { - $a = $i - 1; - $b = $i; - if ($wndWidth[$a] != 1 || $wndWidth[$b] != 1) { - $naf[$a] = $scalars[$a]->getNAF($wndWidth[$a]); - $naf[$b] = $scalars[$b]->getNAF($wndWidth[$b]); - $max = max(count($naf[$a]), count($naf[$b]), $max); - continue; - } - - $comb = [ - $points[$a], // 1 - null, // 3 - null, // 5 - $points[$b] // 7 - ]; - - $comb[1] = $this->addPoint($points[$a], $points[$b]); - $comb[2] = $this->addPoint($points[$a], $this->negatePoint($points[$b])); - - $index = [ - -3, /* -1 -1 */ - -1, /* -1 0 */ - -5, /* -1 1 */ - -7, /* 0 -1 */ - 0, /* 0 -1 */ - 7, /* 0 1 */ - 5, /* 1 -1 */ - 1, /* 1 0 */ - 3 /* 1 1 */ - ]; - - $jsf = self::getJSFPoints($scalars[$a], $scalars[$b]); - - $max = max(count($jsf[0]), $max); - if ($max > 0) { - $naf[$a] = array_fill(0, $max, 0); - $naf[$b] = array_fill(0, $max, 0); - } else { - $naf[$a] = []; - $naf[$b] = []; - } - - for ($j = 0; $j < $max; $j++) { - $ja = isset($jsf[0][$j]) ? $jsf[0][$j] : 0; - $jb = isset($jsf[1][$j]) ? $jsf[1][$j] : 0; - - $naf[$a][$j] = $index[3 * ($ja + 1) + $jb + 1]; - $naf[$b][$j] = 0; - $wnd[$a] = $comb; - } - } - - $acc = []; - $temp = [0, 0, 0, 0]; - for ($i = $max; $i >= 0; $i--) { - $k = 0; - while ($i >= 0) { - $zero = true; - for ($j = 0; $j < $length; $j++) { - $temp[$j] = isset($naf[$j][$i]) ? $naf[$j][$i] : 0; - if ($temp[$j] != 0) { - $zero = false; - } - } - if (!$zero) { - break; - } - $k++; - $i--; - } - - if ($i >= 0) { - $k++; - } - while ($k--) { - $acc = $this->doublePoint($acc); - } - - if ($i < 0) { - break; - } - - for ($j = 0; $j < $length; $j++) { - $z = $temp[$j]; - $p = null; - if ($z == 0) { - continue; - } - $p = $z > 0 ? - $wnd[$j][($z - 1) >> 1] : - $this->negatePoint($wnd[$j][(-$z - 1) >> 1]); - $acc = $this->addPoint($acc, $p); - } - } - - return $this->convertToAffine($acc); - } - - /** - * Precomputes NAF points - * - * Adapted from: - * https://github.com/indutny/elliptic/blob/725bd91/lib/elliptic/curve/base.js#L351 - * - * @return int[] - */ - private function getNAFPoints(array $point, $wnd) - { - if (isset($point['naf'])) { - return $point['naf']; - } - - $res = [$point]; - $max = (1 << $wnd) - 1; - $dbl = $max == 1 ? null : $this->doublePoint($point); - for ($i = 1; $i < $max; $i++) { - $res[] = $this->addPoint($res[$i - 1], $dbl); - } - - $point['naf'] = $res; - - /* - $str = ''; - foreach ($res as $re) { - $re[0] = bin2hex($re[0]->toBytes()); - $re[1] = bin2hex($re[1]->toBytes()); - $str.= " ['$re[0]', '$re[1]'],\r\n"; - } - file_put_contents('temp.txt', $str); - exit; - */ - - return $res; - } - - /** - * Precomputes points in Joint Sparse Form - * - * Adapted from: - * https://github.com/indutny/elliptic/blob/725bd91/lib/elliptic/utils.js#L96 - * - * @return int[] - */ - private static function getJSFPoints(Integer $k1, Integer $k2) - { - static $three; - if (!isset($three)) { - $three = new BigInteger(3); - } - - $jsf = [[], []]; - $k1 = $k1->toBigInteger(); - $k2 = $k2->toBigInteger(); - $d1 = 0; - $d2 = 0; - - while ($k1->compare(new BigInteger(-$d1)) > 0 || $k2->compare(new BigInteger(-$d2)) > 0) { - // first phase - $m14 = $k1->testBit(0) + 2 * $k1->testBit(1); - $m14 += $d1; - $m14 &= 3; - - $m24 = $k2->testBit(0) + 2 * $k2->testBit(1); - $m24 += $d2; - $m24 &= 3; - - if ($m14 == 3) { - $m14 = -1; - } - if ($m24 == 3) { - $m24 = -1; - } - - $u1 = 0; - if ($m14 & 1) { // if $m14 is odd - $m8 = $k1->testBit(0) + 2 * $k1->testBit(1) + 4 * $k1->testBit(2); - $m8 += $d1; - $m8 &= 7; - $u1 = ($m8 == 3 || $m8 == 5) && $m24 == 2 ? -$m14 : $m14; - } - $jsf[0][] = $u1; - - $u2 = 0; - if ($m24 & 1) { // if $m24 is odd - $m8 = $k2->testBit(0) + 2 * $k2->testBit(1) + 4 * $k2->testBit(2); - $m8 += $d2; - $m8 &= 7; - $u2 = ($m8 == 3 || $m8 == 5) && $m14 == 2 ? -$m24 : $m24; - } - $jsf[1][] = $u2; - - // second phase - if (2 * $d1 == $u1 + 1) { - $d1 = 1 - $d1; - } - if (2 * $d2 == $u2 + 1) { - $d2 = 1 - $d2; - } - $k1 = $k1->bitwise_rightShift(1); - $k2 = $k2->bitwise_rightShift(1); - } - - return $jsf; - } - - /** - * Returns the affine point - * - * A Jacobian Coordinate is of the form (x, y, z). - * To convert a Jacobian Coordinate to an Affine Point - * you do (x / z^2, y / z^3) - * - * @return PrimeInteger[] - */ - public function convertToAffine(array $p) - { - if (!isset($p[2])) { - return $p; - } - list($x, $y, $z) = $p; - $z = $this->one->divide($z); - $z2 = $z->multiply($z); - return [ - $x->multiply($z2), - $y->multiply($z2)->multiply($z) - ]; - } - - /** - * Converts an affine point to a jacobian coordinate - * - * @return PrimeInteger[] - */ - public function convertToInternal(array $p) - { - if (isset($p[2])) { - return $p; - } - - $p[2] = clone $this->one; - $p['fresh'] = true; - return $p; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/TwistedEdwards.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/TwistedEdwards.php deleted file mode 100644 index d0ed070..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/BaseCurves/TwistedEdwards.php +++ /dev/null @@ -1,215 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves; - -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -use OCA\Libresign\Vendor\phpseclib3\Math\PrimeField; -use OCA\Libresign\Vendor\phpseclib3\Math\PrimeField\Integer as PrimeInteger; - -/** - * Curves over a*x^2 + y^2 = 1 + d*x^2*y^2 - * - * @author Jim Wigginton - */ -class TwistedEdwards extends Base -{ - /** - * The modulo - * - * @var BigInteger - */ - protected $modulo; - - /** - * Cofficient for x^2 - * - * @var object - */ - protected $a; - - /** - * Cofficient for x^2*y^2 - * - * @var object - */ - protected $d; - - /** - * Base Point - * - * @var object[] - */ - protected $p; - - /** - * The number zero over the specified finite field - * - * @var object - */ - protected $zero; - - /** - * The number one over the specified finite field - * - * @var object - */ - protected $one; - - /** - * The number two over the specified finite field - * - * @var object - */ - protected $two; - - /** - * Sets the modulo - */ - public function setModulo(BigInteger $modulo) - { - $this->modulo = $modulo; - $this->factory = new PrimeField($modulo); - $this->zero = $this->factory->newInteger(new BigInteger(0)); - $this->one = $this->factory->newInteger(new BigInteger(1)); - $this->two = $this->factory->newInteger(new BigInteger(2)); - } - - /** - * Set coefficients a and b - */ - public function setCoefficients(BigInteger $a, BigInteger $d) - { - if (!isset($this->factory)) { - throw new \RuntimeException('setModulo needs to be called before this method'); - } - $this->a = $this->factory->newInteger($a); - $this->d = $this->factory->newInteger($d); - } - - /** - * Set x and y coordinates for the base point - */ - public function setBasePoint($x, $y) - { - switch (true) { - case !$x instanceof BigInteger && !$x instanceof PrimeInteger: - throw new \UnexpectedValueException('Argument 1 passed to Prime::setBasePoint() must be an instance of either BigInteger or PrimeField\Integer'); - case !$y instanceof BigInteger && !$y instanceof PrimeInteger: - throw new \UnexpectedValueException('Argument 2 passed to Prime::setBasePoint() must be an instance of either BigInteger or PrimeField\Integer'); - } - if (!isset($this->factory)) { - throw new \RuntimeException('setModulo needs to be called before this method'); - } - $this->p = [ - $x instanceof BigInteger ? $this->factory->newInteger($x) : $x, - $y instanceof BigInteger ? $this->factory->newInteger($y) : $y - ]; - } - - /** - * Returns the a coefficient - * - * @return PrimeInteger - */ - public function getA() - { - return $this->a; - } - - /** - * Returns the a coefficient - * - * @return PrimeInteger - */ - public function getD() - { - return $this->d; - } - - /** - * Retrieve the base point as an array - * - * @return array - */ - public function getBasePoint() - { - if (!isset($this->factory)) { - throw new \RuntimeException('setModulo needs to be called before this method'); - } - /* - if (!isset($this->p)) { - throw new \RuntimeException('setBasePoint needs to be called before this method'); - } - */ - return $this->p; - } - - /** - * Returns the affine point - * - * @return PrimeInteger[] - */ - public function convertToAffine(array $p) - { - if (!isset($p[2])) { - return $p; - } - list($x, $y, $z) = $p; - $z = $this->one->divide($z); - return [ - $x->multiply($z), - $y->multiply($z) - ]; - } - - /** - * Returns the modulo - * - * @return BigInteger - */ - public function getModulo() - { - return $this->modulo; - } - - /** - * Tests whether or not the x / y values satisfy the equation - * - * @return boolean - */ - public function verifyPoint(array $p) - { - list($x, $y) = $p; - $x2 = $x->multiply($x); - $y2 = $y->multiply($y); - - $lhs = $this->a->multiply($x2)->add($y2); - $rhs = $this->d->multiply($x2)->multiply($y2)->add($this->one); - - return $lhs->equals($rhs); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Curve25519.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Curve25519.php deleted file mode 100644 index 75699fb..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Curve25519.php +++ /dev/null @@ -1,81 +0,0 @@ - - * @copyright 2019 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Montgomery; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class Curve25519 extends Montgomery -{ - public function __construct() - { - // 2^255 - 19 - $this->setModulo(new BigInteger('7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED', 16)); - $this->a24 = $this->factory->newInteger(new BigInteger('121666')); - $this->p = [$this->factory->newInteger(new BigInteger(9))]; - // 2^252 + 0x14def9dea2f79cd65812631a5cf5d3ed - $this->setOrder(new BigInteger('1000000000000000000000000000000014DEF9DEA2F79CD65812631A5CF5D3ED', 16)); - - /* - $this->setCoefficients( - new BigInteger('486662'), // a - ); - $this->setBasePoint( - new BigInteger(9), - new BigInteger('14781619447589544791020593568409986887264606134616475288964881837755586237401') - ); - */ - } - - /** - * Multiply a point on the curve by a scalar - * - * Modifies the scalar as described at https://tools.ietf.org/html/rfc7748#page-8 - * - * @return array - */ - public function multiplyPoint(array $p, BigInteger $d) - { - //$r = strrev(sodium_crypto_scalarmult($d->toBytes(), strrev($p[0]->toBytes()))); - //return [$this->factory->newInteger(new BigInteger($r, 256))]; - - $d = $d->toBytes(); - $d &= "\xF8" . str_repeat("\xFF", 30) . "\x7F"; - $d = strrev($d); - $d |= "\x40"; - $d = new BigInteger($d, -256); - - return parent::multiplyPoint($p, $d); - } - - /** - * Creates a random scalar multiplier - * - * @return BigInteger - */ - public function createRandomMultiplier() - { - return BigInteger::random(256); - } - - /** - * Performs range check - */ - public function rangeCheck(BigInteger $x) - { - if ($x->getLength() > 256 || $x->isNegative()) { - throw new \RangeException('x must be a positive integer less than 256 bytes in length'); - } - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Curve448.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Curve448.php deleted file mode 100644 index 1da0448..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Curve448.php +++ /dev/null @@ -1,92 +0,0 @@ - - * @copyright 2019 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Montgomery; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class Curve448 extends Montgomery -{ - public function __construct() - { - // 2^448 - 2^224 - 1 - $this->setModulo(new BigInteger( - 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE' . - 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', - 16 - )); - $this->a24 = $this->factory->newInteger(new BigInteger('39081')); - $this->p = [$this->factory->newInteger(new BigInteger(5))]; - // 2^446 - 0x8335dc163bb124b65129c96fde933d8d723a70aadc873d6d54a7bb0d - $this->setOrder(new BigInteger( - '3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' . - '7CCA23E9C44EDB49AED63690216CC2728DC58F552378C292AB5844F3', - 16 - )); - - /* - $this->setCoefficients( - new BigInteger('156326'), // a - ); - $this->setBasePoint( - new BigInteger(5), - new BigInteger( - '355293926785568175264127502063783334808976399387714271831880898' . - '435169088786967410002932673765864550910142774147268105838985595290' . - '606362') - ); - */ - } - - /** - * Multiply a point on the curve by a scalar - * - * Modifies the scalar as described at https://tools.ietf.org/html/rfc7748#page-8 - * - * @return array - */ - public function multiplyPoint(array $p, BigInteger $d) - { - //$r = strrev(sodium_crypto_scalarmult($d->toBytes(), strrev($p[0]->toBytes()))); - //return [$this->factory->newInteger(new BigInteger($r, 256))]; - - $d = $d->toBytes(); - $d[0] = $d[0] & "\xFC"; - $d = strrev($d); - $d |= "\x80"; - $d = new BigInteger($d, 256); - - return parent::multiplyPoint($p, $d); - } - - /** - * Creates a random scalar multiplier - * - * @return BigInteger - */ - public function createRandomMultiplier() - { - return BigInteger::random(446); - } - - /** - * Performs range check - */ - public function rangeCheck(BigInteger $x) - { - if ($x->getLength() > 448 || $x->isNegative()) { - throw new \RangeException('x must be a positive integer less than 446 bytes in length'); - } - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Ed25519.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Ed25519.php deleted file mode 100644 index f91a230..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Ed25519.php +++ /dev/null @@ -1,333 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\TwistedEdwards; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Hash; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Random; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class Ed25519 extends TwistedEdwards -{ - const HASH = 'sha512'; - /* - Per https://tools.ietf.org/html/rfc8032#page-6 EdDSA has several parameters, one of which is b: - - 2. An integer b with 2^(b-1) > p. EdDSA public keys have exactly b - bits, and EdDSA signatures have exactly 2*b bits. b is - recommended to be a multiple of 8, so public key and signature - lengths are an integral number of octets. - - SIZE corresponds to b - */ - const SIZE = 32; - - public function __construct() - { - // 2^255 - 19 - $this->setModulo(new BigInteger('7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED', 16)); - $this->setCoefficients( - // -1 - new BigInteger('7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEC', 16), // a - // -121665/121666 - new BigInteger('52036CEE2B6FFE738CC740797779E89800700A4D4141D8AB75EB4DCA135978A3', 16) // d - ); - $this->setBasePoint( - new BigInteger('216936D3CD6E53FEC0A4E231FDD6DC5C692CC7609525A7B2C9562D608F25D51A', 16), - new BigInteger('6666666666666666666666666666666666666666666666666666666666666658', 16) - ); - $this->setOrder(new BigInteger('1000000000000000000000000000000014DEF9DEA2F79CD65812631A5CF5D3ED', 16)); - // algorithm 14.47 from http://cacr.uwaterloo.ca/hac/about/chap14.pdf#page=16 - /* - $this->setReduction(function($x) { - $parts = $x->bitwise_split(255); - $className = $this->className; - - if (count($parts) > 2) { - list(, $r) = $x->divide($className::$modulo); - return $r; - } - - $zero = new BigInteger(); - $c = new BigInteger(19); - - switch (count($parts)) { - case 2: - list($qi, $ri) = $parts; - break; - case 1: - $qi = $zero; - list($ri) = $parts; - break; - case 0: - return $zero; - } - $r = $ri; - - while ($qi->compare($zero) > 0) { - $temp = $qi->multiply($c)->bitwise_split(255); - if (count($temp) == 2) { - list($qi, $ri) = $temp; - } else { - $qi = $zero; - list($ri) = $temp; - } - $r = $r->add($ri); - } - - while ($r->compare($className::$modulo) > 0) { - $r = $r->subtract($className::$modulo); - } - return $r; - }); - */ - } - - /** - * Recover X from Y - * - * Implements steps 2-4 at https://tools.ietf.org/html/rfc8032#section-5.1.3 - * - * Used by EC\Keys\Common.php - * - * @param BigInteger $y - * @param boolean $sign - * @return object[] - */ - public function recoverX(BigInteger $y, $sign) - { - $y = $this->factory->newInteger($y); - - $y2 = $y->multiply($y); - $u = $y2->subtract($this->one); - $v = $this->d->multiply($y2)->add($this->one); - $x2 = $u->divide($v); - if ($x2->equals($this->zero)) { - if ($sign) { - throw new \RuntimeException('Unable to recover X coordinate (x2 = 0)'); - } - return clone $this->zero; - } - // find the square root - /* we don't do $x2->squareRoot() because, quoting from - https://tools.ietf.org/html/rfc8032#section-5.1.1: - - "For point decoding or "decompression", square roots modulo p are - needed. They can be computed using the Tonelli-Shanks algorithm or - the special case for p = 5 (mod 8). To find a square root of a, - first compute the candidate root x = a^((p+3)/8) (mod p)." - */ - $exp = $this->getModulo()->add(new BigInteger(3)); - $exp = $exp->bitwise_rightShift(3); - $x = $x2->pow($exp); - - // If v x^2 = -u (mod p), set x <-- x * 2^((p-1)/4), which is a square root. - if (!$x->multiply($x)->subtract($x2)->equals($this->zero)) { - $temp = $this->getModulo()->subtract(new BigInteger(1)); - $temp = $temp->bitwise_rightShift(2); - $temp = $this->two->pow($temp); - $x = $x->multiply($temp); - if (!$x->multiply($x)->subtract($x2)->equals($this->zero)) { - throw new \RuntimeException('Unable to recover X coordinate'); - } - } - if ($x->isOdd() != $sign) { - $x = $x->negate(); - } - - return [$x, $y]; - } - - /** - * Extract Secret Scalar - * - * Implements steps 1-3 at https://tools.ietf.org/html/rfc8032#section-5.1.5 - * - * Used by the various key handlers - * - * @param string $str - * @return array - */ - public function extractSecret($str) - { - if (strlen($str) != 32) { - throw new \LengthException('Private Key should be 32-bytes long'); - } - // 1. Hash the 32-byte private key using SHA-512, storing the digest in - // a 64-octet large buffer, denoted h. Only the lower 32 bytes are - // used for generating the public key. - $hash = new Hash('sha512'); - $h = $hash->hash($str); - $h = substr($h, 0, 32); - // 2. Prune the buffer: The lowest three bits of the first octet are - // cleared, the highest bit of the last octet is cleared, and the - // second highest bit of the last octet is set. - $h[0] = $h[0] & chr(0xF8); - $h = strrev($h); - $h[0] = ($h[0] & chr(0x3F)) | chr(0x40); - // 3. Interpret the buffer as the little-endian integer, forming a - // secret scalar s. - $dA = new BigInteger($h, 256); - - return [ - 'dA' => $dA, - 'secret' => $str - ]; - } - - /** - * Encode a point as a string - * - * @param array $point - * @return string - */ - public function encodePoint($point) - { - list($x, $y) = $point; - $y = $y->toBytes(); - $y[0] = $y[0] & chr(0x7F); - if ($x->isOdd()) { - $y[0] = $y[0] | chr(0x80); - } - $y = strrev($y); - - return $y; - } - - /** - * Creates a random scalar multiplier - * - * @return \phpseclib3\Math\PrimeField\Integer - */ - public function createRandomMultiplier() - { - return $this->extractSecret(Random::string(32))['dA']; - } - - /** - * Converts an affine point to an extended homogeneous coordinate - * - * From https://tools.ietf.org/html/rfc8032#section-5.1.4 : - * - * A point (x,y) is represented in extended homogeneous coordinates (X, Y, Z, T), - * with x = X/Z, y = Y/Z, x * y = T/Z. - * - * @return \phpseclib3\Math\PrimeField\Integer[] - */ - public function convertToInternal(array $p) - { - if (empty($p)) { - return [clone $this->zero, clone $this->one, clone $this->one, clone $this->zero]; - } - - if (isset($p[2])) { - return $p; - } - - $p[2] = clone $this->one; - $p[3] = $p[0]->multiply($p[1]); - - return $p; - } - - /** - * Doubles a point on a curve - * - * @return FiniteField[] - */ - public function doublePoint(array $p) - { - if (!isset($this->factory)) { - throw new \RuntimeException('setModulo needs to be called before this method'); - } - - if (!count($p)) { - return []; - } - - if (!isset($p[2])) { - throw new \RuntimeException('Affine coordinates need to be manually converted to "Jacobi" coordinates or vice versa'); - } - - // from https://tools.ietf.org/html/rfc8032#page-12 - - list($x1, $y1, $z1, $t1) = $p; - - $a = $x1->multiply($x1); - $b = $y1->multiply($y1); - $c = $this->two->multiply($z1)->multiply($z1); - $h = $a->add($b); - $temp = $x1->add($y1); - $e = $h->subtract($temp->multiply($temp)); - $g = $a->subtract($b); - $f = $c->add($g); - - $x3 = $e->multiply($f); - $y3 = $g->multiply($h); - $t3 = $e->multiply($h); - $z3 = $f->multiply($g); - - return [$x3, $y3, $z3, $t3]; - } - - /** - * Adds two points on the curve - * - * @return FiniteField[] - */ - public function addPoint(array $p, array $q) - { - if (!isset($this->factory)) { - throw new \RuntimeException('setModulo needs to be called before this method'); - } - - if (!count($p) || !count($q)) { - if (count($q)) { - return $q; - } - if (count($p)) { - return $p; - } - return []; - } - - if (!isset($p[2]) || !isset($q[2])) { - throw new \RuntimeException('Affine coordinates need to be manually converted to "Jacobi" coordinates or vice versa'); - } - - if ($p[0]->equals($q[0])) { - return !$p[1]->equals($q[1]) ? [] : $this->doublePoint($p); - } - - // from https://tools.ietf.org/html/rfc8032#page-12 - - list($x1, $y1, $z1, $t1) = $p; - list($x2, $y2, $z2, $t2) = $q; - - $a = $y1->subtract($x1)->multiply($y2->subtract($x2)); - $b = $y1->add($x1)->multiply($y2->add($x2)); - $c = $t1->multiply($this->two)->multiply($this->d)->multiply($t2); - $d = $z1->multiply($this->two)->multiply($z2); - $e = $b->subtract($a); - $f = $d->subtract($c); - $g = $d->add($c); - $h = $b->add($a); - - $x3 = $e->multiply($f); - $y3 = $g->multiply($h); - $t3 = $e->multiply($h); - $z3 = $f->multiply($g); - - return [$x3, $y3, $z3, $t3]; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Ed448.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Ed448.php deleted file mode 100644 index 5b75ded..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/Ed448.php +++ /dev/null @@ -1,273 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\TwistedEdwards; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Hash; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Random; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class Ed448 extends TwistedEdwards -{ - const HASH = 'shake256-912'; - const SIZE = 57; - - public function __construct() - { - // 2^448 - 2^224 - 1 - $this->setModulo(new BigInteger( - 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE' . - 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF', - 16 - )); - $this->setCoefficients( - new BigInteger(1), - // -39081 - new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE' . - 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF6756', 16) - ); - $this->setBasePoint( - new BigInteger('4F1970C66BED0DED221D15A622BF36DA9E146570470F1767EA6DE324' . - 'A3D3A46412AE1AF72AB66511433B80E18B00938E2626A82BC70CC05E', 16), - new BigInteger('693F46716EB6BC248876203756C9C7624BEA73736CA3984087789C1E' . - '05A0C2D73AD3FF1CE67C39C4FDBD132C4ED7C8AD9808795BF230FA14', 16) - ); - $this->setOrder(new BigInteger( - '3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' . - '7CCA23E9C44EDB49AED63690216CC2728DC58F552378C292AB5844F3', - 16 - )); - } - - /** - * Recover X from Y - * - * Implements steps 2-4 at https://tools.ietf.org/html/rfc8032#section-5.2.3 - * - * Used by EC\Keys\Common.php - * - * @param BigInteger $y - * @param boolean $sign - * @return object[] - */ - public function recoverX(BigInteger $y, $sign) - { - $y = $this->factory->newInteger($y); - - $y2 = $y->multiply($y); - $u = $y2->subtract($this->one); - $v = $this->d->multiply($y2)->subtract($this->one); - $x2 = $u->divide($v); - if ($x2->equals($this->zero)) { - if ($sign) { - throw new \RuntimeException('Unable to recover X coordinate (x2 = 0)'); - } - return clone $this->zero; - } - // find the square root - $exp = $this->getModulo()->add(new BigInteger(1)); - $exp = $exp->bitwise_rightShift(2); - $x = $x2->pow($exp); - - if (!$x->multiply($x)->subtract($x2)->equals($this->zero)) { - throw new \RuntimeException('Unable to recover X coordinate'); - } - if ($x->isOdd() != $sign) { - $x = $x->negate(); - } - - return [$x, $y]; - } - - /** - * Extract Secret Scalar - * - * Implements steps 1-3 at https://tools.ietf.org/html/rfc8032#section-5.2.5 - * - * Used by the various key handlers - * - * @param string $str - * @return array - */ - public function extractSecret($str) - { - if (strlen($str) != 57) { - throw new \LengthException('Private Key should be 57-bytes long'); - } - // 1. Hash the 57-byte private key using SHAKE256(x, 114), storing the - // digest in a 114-octet large buffer, denoted h. Only the lower 57 - // bytes are used for generating the public key. - $hash = new Hash('shake256-912'); - $h = $hash->hash($str); - $h = substr($h, 0, 57); - // 2. Prune the buffer: The two least significant bits of the first - // octet are cleared, all eight bits the last octet are cleared, and - // the highest bit of the second to last octet is set. - $h[0] = $h[0] & chr(0xFC); - $h = strrev($h); - $h[0] = "\0"; - $h[1] = $h[1] | chr(0x80); - // 3. Interpret the buffer as the little-endian integer, forming a - // secret scalar s. - $dA = new BigInteger($h, 256); - - return [ - 'dA' => $dA, - 'secret' => $str - ]; - - $dA->secret = $str; - return $dA; - } - - /** - * Encode a point as a string - * - * @param array $point - * @return string - */ - public function encodePoint($point) - { - list($x, $y) = $point; - $y = "\0" . $y->toBytes(); - if ($x->isOdd()) { - $y[0] = $y[0] | chr(0x80); - } - $y = strrev($y); - - return $y; - } - - /** - * Creates a random scalar multiplier - * - * @return \phpseclib3\Math\PrimeField\Integer - */ - public function createRandomMultiplier() - { - return $this->extractSecret(Random::string(57))['dA']; - } - - /** - * Converts an affine point to an extended homogeneous coordinate - * - * From https://tools.ietf.org/html/rfc8032#section-5.2.4 : - * - * A point (x,y) is represented in extended homogeneous coordinates (X, Y, Z, T), - * with x = X/Z, y = Y/Z, x * y = T/Z. - * - * @return \phpseclib3\Math\PrimeField\Integer[] - */ - public function convertToInternal(array $p) - { - if (empty($p)) { - return [clone $this->zero, clone $this->one, clone $this->one]; - } - - if (isset($p[2])) { - return $p; - } - - $p[2] = clone $this->one; - - return $p; - } - - /** - * Doubles a point on a curve - * - * @return FiniteField[] - */ - public function doublePoint(array $p) - { - if (!isset($this->factory)) { - throw new \RuntimeException('setModulo needs to be called before this method'); - } - - if (!count($p)) { - return []; - } - - if (!isset($p[2])) { - throw new \RuntimeException('Affine coordinates need to be manually converted to "Jacobi" coordinates or vice versa'); - } - - // from https://tools.ietf.org/html/rfc8032#page-18 - - list($x1, $y1, $z1) = $p; - - $b = $x1->add($y1); - $b = $b->multiply($b); - $c = $x1->multiply($x1); - $d = $y1->multiply($y1); - $e = $c->add($d); - $h = $z1->multiply($z1); - $j = $e->subtract($this->two->multiply($h)); - - $x3 = $b->subtract($e)->multiply($j); - $y3 = $c->subtract($d)->multiply($e); - $z3 = $e->multiply($j); - - return [$x3, $y3, $z3]; - } - - /** - * Adds two points on the curve - * - * @return FiniteField[] - */ - public function addPoint(array $p, array $q) - { - if (!isset($this->factory)) { - throw new \RuntimeException('setModulo needs to be called before this method'); - } - - if (!count($p) || !count($q)) { - if (count($q)) { - return $q; - } - if (count($p)) { - return $p; - } - return []; - } - - if (!isset($p[2]) || !isset($q[2])) { - throw new \RuntimeException('Affine coordinates need to be manually converted to "Jacobi" coordinates or vice versa'); - } - - if ($p[0]->equals($q[0])) { - return !$p[1]->equals($q[1]) ? [] : $this->doublePoint($p); - } - - // from https://tools.ietf.org/html/rfc8032#page-17 - - list($x1, $y1, $z1) = $p; - list($x2, $y2, $z2) = $q; - - $a = $z1->multiply($z2); - $b = $a->multiply($a); - $c = $x1->multiply($x2); - $d = $y1->multiply($y2); - $e = $this->d->multiply($c)->multiply($d); - $f = $b->subtract($e); - $g = $b->add($e); - $h = $x1->add($y1)->multiply($x2->add($y2)); - - $x3 = $a->multiply($f)->multiply($h->subtract($c)->subtract($d)); - $y3 = $a->multiply($g)->multiply($d->subtract($c)); - $z3 = $f->multiply($g); - - return [$x3, $y3, $z3]; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP160r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP160r1.php deleted file mode 100644 index 337d89b..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP160r1.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class brainpoolP160r1 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('E95E4A5F737059DC60DFC7AD95B3D8139515620F', 16)); - $this->setCoefficients( - new BigInteger('340E7BE2A280EB74E2BE61BADA745D97E8F7C300', 16), - new BigInteger('1E589A8595423412134FAA2DBDEC95C8D8675E58', 16) - ); - $this->setBasePoint( - new BigInteger('BED5AF16EA3F6A4F62938C4631EB5AF7BDBCDBC3', 16), - new BigInteger('1667CB477A1A8EC338F94741669C976316DA6321', 16) - ); - $this->setOrder(new BigInteger('E95E4A5F737059DC60DF5991D45029409E60FC09', 16)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP160t1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP160t1.php deleted file mode 100644 index 19bdb80..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP160t1.php +++ /dev/null @@ -1,47 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class brainpoolP160t1 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('E95E4A5F737059DC60DFC7AD95B3D8139515620F', 16)); - $this->setCoefficients( - new BigInteger('E95E4A5F737059DC60DFC7AD95B3D8139515620C', 16), // eg. -3 - new BigInteger('7A556B6DAE535B7B51ED2C4D7DAA7A0B5C55F380', 16) - ); - $this->setBasePoint( - new BigInteger('B199B13B9B34EFC1397E64BAEB05ACC265FF2378', 16), - new BigInteger('ADD6718B7C7C1961F0991B842443772152C9E0AD', 16) - ); - $this->setOrder(new BigInteger('E95E4A5F737059DC60DF5991D45029409E60FC09', 16)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP192r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP192r1.php deleted file mode 100644 index 678dc40..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP192r1.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class brainpoolP192r1 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('C302F41D932A36CDA7A3463093D18DB78FCE476DE1A86297', 16)); - $this->setCoefficients( - new BigInteger('6A91174076B1E0E19C39C031FE8685C1CAE040E5C69A28EF', 16), - new BigInteger('469A28EF7C28CCA3DC721D044F4496BCCA7EF4146FBF25C9', 16) - ); - $this->setBasePoint( - new BigInteger('C0A0647EAAB6A48753B033C56CB0F0900A2F5C4853375FD6', 16), - new BigInteger('14B690866ABD5BB88B5F4828C1490002E6773FA2FA299B8F', 16) - ); - $this->setOrder(new BigInteger('C302F41D932A36CDA7A3462F9E9E916B5BE8F1029AC4ACC1', 16)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP192t1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP192t1.php deleted file mode 100644 index abd3d40..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP192t1.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class brainpoolP192t1 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('C302F41D932A36CDA7A3463093D18DB78FCE476DE1A86297', 16)); - $this->setCoefficients( - new BigInteger('C302F41D932A36CDA7A3463093D18DB78FCE476DE1A86294', 16), // eg. -3 - new BigInteger('13D56FFAEC78681E68F9DEB43B35BEC2FB68542E27897B79', 16) - ); - $this->setBasePoint( - new BigInteger('3AE9E58C82F63C30282E1FE7BBF43FA72C446AF6F4618129', 16), - new BigInteger('097E2C5667C2223A902AB5CA449D0084B7E5B3DE7CCC01C9', 16) - ); - $this->setOrder(new BigInteger('C302F41D932A36CDA7A3462F9E9E916B5BE8F1029AC4ACC1', 16)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP224r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP224r1.php deleted file mode 100644 index 900b809..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP224r1.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class brainpoolP224r1 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('D7C134AA264366862A18302575D1D787B09F075797DA89F57EC8C0FF', 16)); - $this->setCoefficients( - new BigInteger('68A5E62CA9CE6C1C299803A6C1530B514E182AD8B0042A59CAD29F43', 16), - new BigInteger('2580F63CCFE44138870713B1A92369E33E2135D266DBB372386C400B', 16) - ); - $this->setBasePoint( - new BigInteger('0D9029AD2C7E5CF4340823B2A87DC68C9E4CE3174C1E6EFDEE12C07D', 16), - new BigInteger('58AA56F772C0726F24C6B89E4ECDAC24354B9E99CAA3F6D3761402CD', 16) - ); - $this->setOrder(new BigInteger('D7C134AA264366862A18302575D0FB98D116BC4B6DDEBCA3A5A7939F', 16)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP224t1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP224t1.php deleted file mode 100644 index 8bb13fd..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP224t1.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class brainpoolP224t1 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('D7C134AA264366862A18302575D1D787B09F075797DA89F57EC8C0FF', 16)); - $this->setCoefficients( - new BigInteger('D7C134AA264366862A18302575D1D787B09F075797DA89F57EC8C0FC', 16), // eg. -3 - new BigInteger('4B337D934104CD7BEF271BF60CED1ED20DA14C08B3BB64F18A60888D', 16) - ); - $this->setBasePoint( - new BigInteger('6AB1E344CE25FF3896424E7FFE14762ECB49F8928AC0C76029B4D580', 16), - new BigInteger('0374E9F5143E568CD23F3F4D7C0D4B1E41C8CC0D1C6ABD5F1A46DB4C', 16) - ); - $this->setOrder(new BigInteger('D7C134AA264366862A18302575D0FB98D116BC4B6DDEBCA3A5A7939F', 16)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP256r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP256r1.php deleted file mode 100644 index 5394cc6..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP256r1.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class brainpoolP256r1 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377', 16)); - $this->setCoefficients( - new BigInteger('7D5A0975FC2C3057EEF67530417AFFE7FB8055C126DC5C6CE94A4B44F330B5D9', 16), - new BigInteger('26DC5C6CE94A4B44F330B5D9BBD77CBF958416295CF7E1CE6BCCDC18FF8C07B6', 16) - ); - $this->setBasePoint( - new BigInteger('8BD2AEB9CB7E57CB2C4B482FFC81B7AFB9DE27E1E3BD23C23A4453BD9ACE3262', 16), - new BigInteger('547EF835C3DAC4FD97F8461A14611DC9C27745132DED8E545C1D54C72F046997', 16) - ); - $this->setOrder(new BigInteger('A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7', 16)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP256t1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP256t1.php deleted file mode 100644 index 6ac0a3f..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP256t1.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class brainpoolP256t1 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5377', 16)); - $this->setCoefficients( - new BigInteger('A9FB57DBA1EEA9BC3E660A909D838D726E3BF623D52620282013481D1F6E5374', 16), // eg. -3 - new BigInteger('662C61C430D84EA4FE66A7733D0B76B7BF93EBC4AF2F49256AE58101FEE92B04', 16) - ); - $this->setBasePoint( - new BigInteger('A3E8EB3CC1CFE7B7732213B23A656149AFA142C47AAFBC2B79A191562E1305F4', 16), - new BigInteger('2D996C823439C56D7F7B22E14644417E69BCB6DE39D027001DABE8F35B25C9BE', 16) - ); - $this->setOrder(new BigInteger('A9FB57DBA1EEA9BC3E660A909D838D718C397AA3B561A6F7901E0E82974856A7', 16)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP320r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP320r1.php deleted file mode 100644 index 5caa214..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP320r1.php +++ /dev/null @@ -1,40 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class brainpoolP320r1 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('D35E472036BC4FB7E13C785ED201E065F98FCFA6F6F40DEF4F9' . - '2B9EC7893EC28FCD412B1F1B32E27', 16)); - $this->setCoefficients( - new BigInteger('3EE30B568FBAB0F883CCEBD46D3F3BB8A2A73513F5EB79DA66190EB085FFA9F4' . - '92F375A97D860EB4', 16), - new BigInteger('520883949DFDBC42D3AD198640688A6FE13F41349554B49ACC31DCCD88453981' . - '6F5EB4AC8FB1F1A6', 16) - ); - $this->setBasePoint( - new BigInteger('43BD7E9AFB53D8B85289BCC48EE5BFE6F20137D10A087EB6E7871E2A10A599C7' . - '10AF8D0D39E20611', 16), - new BigInteger('14FDD05545EC1CC8AB4093247F77275E0743FFED117182EAA9C77877AAAC6AC7' . - 'D35245D1692E8EE1', 16) - ); - $this->setOrder(new BigInteger('D35E472036BC4FB7E13C785ED201E065F98FCFA5B68F12A32D4' . - '82EC7EE8658E98691555B44C59311', 16)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP320t1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP320t1.php deleted file mode 100644 index 986027c..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP320t1.php +++ /dev/null @@ -1,40 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class brainpoolP320t1 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('D35E472036BC4FB7E13C785ED201E065F98FCFA6F6F40DEF4F9' . - '2B9EC7893EC28FCD412B1F1B32E27', 16)); - $this->setCoefficients( - new BigInteger('D35E472036BC4FB7E13C785ED201E065F98FCFA6F6F40DEF4F92B9EC7893EC28' . - 'FCD412B1F1B32E24', 16), // eg. -3 - new BigInteger('A7F561E038EB1ED560B3D147DB782013064C19F27ED27C6780AAF77FB8A547CE' . - 'B5B4FEF422340353', 16) - ); - $this->setBasePoint( - new BigInteger('925BE9FB01AFC6FB4D3E7D4990010F813408AB106C4F09CB7EE07868CC136FFF' . - '3357F624A21BED52', 16), - new BigInteger('63BA3A7A27483EBF6671DBEF7ABB30EBEE084E58A0B077AD42A5A0989D1EE71B' . - '1B9BC0455FB0D2C3', 16) - ); - $this->setOrder(new BigInteger('D35E472036BC4FB7E13C785ED201E065F98FCFA5B68F12A32D4' . - '82EC7EE8658E98691555B44C59311', 16)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP384r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP384r1.php deleted file mode 100644 index 9e9933c..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP384r1.php +++ /dev/null @@ -1,58 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class brainpoolP384r1 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger( - '8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123ACD3A729901D1A7' . - '1874700133107EC53', - 16 - )); - $this->setCoefficients( - new BigInteger( - '7BC382C63D8C150C3C72080ACE05AFA0C2BEA28E4FB22787139165EFBA91F90F8AA5814A503' . - 'AD4EB04A8C7DD22CE2826', - 16 - ), - new BigInteger( - '4A8C7DD22CE28268B39B55416F0447C2FB77DE107DCD2A62E880EA53EEB62D57CB4390295DB' . - 'C9943AB78696FA504C11', - 16 - ) - ); - $this->setBasePoint( - new BigInteger( - '1D1C64F068CF45FFA2A63A81B7C13F6B8847A3E77EF14FE3DB7FCAFE0CBD10E8E826E03436D' . - '646AAEF87B2E247D4AF1E', - 16 - ), - new BigInteger( - '8ABE1D7520F9C2A45CB1EB8E95CFD55262B70B29FEEC5864E19C054FF99129280E464621779' . - '1811142820341263C5315', - 16 - ) - ); - $this->setOrder(new BigInteger( - '8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B31F166E6CAC0425A7CF3AB6AF6B7FC31' . - '03B883202E9046565', - 16 - )); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP384t1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP384t1.php deleted file mode 100644 index 8a70473..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP384t1.php +++ /dev/null @@ -1,58 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class brainpoolP384t1 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger( - '8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123ACD3A729901D1A7' . - '1874700133107EC53', - 16 - )); - $this->setCoefficients( - new BigInteger( - '8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B412B1DA197FB71123ACD3A729901' . - 'D1A71874700133107EC50', - 16 - ), // eg. -3 - new BigInteger( - '7F519EADA7BDA81BD826DBA647910F8C4B9346ED8CCDC64E4B1ABD11756DCE1D2074AA263B8' . - '8805CED70355A33B471EE', - 16 - ) - ); - $this->setBasePoint( - new BigInteger( - '18DE98B02DB9A306F2AFCD7235F72A819B80AB12EBD653172476FECD462AABFFC4FF191B946' . - 'A5F54D8D0AA2F418808CC', - 16 - ), - new BigInteger( - '25AB056962D30651A114AFD2755AD336747F93475B7A1FCA3B88F2B6A208CCFE469408584DC' . - '2B2912675BF5B9E582928', - 16 - ) - ); - $this->setOrder(new BigInteger( - '8CB91E82A3386D280F5D6F7E50E641DF152F7109ED5456B31F166E6CAC0425A7CF3AB6AF6B7FC31' . - '03B883202E9046565', - 16 - )); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP512r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP512r1.php deleted file mode 100644 index c3c07dc..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP512r1.php +++ /dev/null @@ -1,58 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class brainpoolP512r1 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger( - 'AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308717D4D9B009BC' . - '66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F3', - 16 - )); - $this->setCoefficients( - new BigInteger( - '7830A3318B603B89E2327145AC234CC594CBDD8D3DF91610A83441CAEA9863BC2DED5D5AA82' . - '53AA10A2EF1C98B9AC8B57F1117A72BF2C7B9E7C1AC4D77FC94CA', - 16 - ), - new BigInteger( - '3DF91610A83441CAEA9863BC2DED5D5AA8253AA10A2EF1C98B9AC8B57F1117A72BF2C7B9E7C' . - '1AC4D77FC94CADC083E67984050B75EBAE5DD2809BD638016F723', - 16 - ) - ); - $this->setBasePoint( - new BigInteger( - '81AEE4BDD82ED9645A21322E9C4C6A9385ED9F70B5D916C1B43B62EEF4D0098EFF3B1F78E2D' . - '0D48D50D1687B93B97D5F7C6D5047406A5E688B352209BCB9F822', - 16 - ), - new BigInteger( - '7DDE385D566332ECC0EABFA9CF7822FDF209F70024A57B1AA000C55B881F8111B2DCDE494A5' . - 'F485E5BCA4BD88A2763AED1CA2B2FA8F0540678CD1E0F3AD80892', - 16 - ) - ); - $this->setOrder(new BigInteger( - 'AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA70330870553E5C414CA' . - '92619418661197FAC10471DB1D381085DDADDB58796829CA90069', - 16 - )); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP512t1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP512t1.php deleted file mode 100644 index e981e2c..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/brainpoolP512t1.php +++ /dev/null @@ -1,58 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class brainpoolP512t1 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger( - 'AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308717D4D9B009BC' . - '66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F3', - 16 - )); - $this->setCoefficients( - new BigInteger( - 'AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA703308717D4D9B009BC' . - '66842AECDA12AE6A380E62881FF2F2D82C68528AA6056583A48F0', - 16 - ), // eg. -3 - new BigInteger( - '7CBBBCF9441CFAB76E1890E46884EAE321F70C0BCB4981527897504BEC3E36A62BCDFA23049' . - '76540F6450085F2DAE145C22553B465763689180EA2571867423E', - 16 - ) - ); - $this->setBasePoint( - new BigInteger( - '640ECE5C12788717B9C1BA06CBC2A6FEBA85842458C56DDE9DB1758D39C0313D82BA51735CD' . - 'B3EA499AA77A7D6943A64F7A3F25FE26F06B51BAA2696FA9035DA', - 16 - ), - new BigInteger( - '5B534BD595F5AF0FA2C892376C84ACE1BB4E3019B71634C01131159CAE03CEE9D9932184BEE' . - 'F216BD71DF2DADF86A627306ECFF96DBB8BACE198B61E00F8B332', - 16 - ) - ); - $this->setOrder(new BigInteger( - 'AADD9DB8DBE9C48B3FD4E6AE33C9FC07CB308DB3B3C9D20ED6639CCA70330870553E5C414CA' . - '92619418661197FAC10471DB1D381085DDADDB58796829CA90069', - 16 - )); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistb233.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistb233.php deleted file mode 100644 index f73ebe2..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistb233.php +++ /dev/null @@ -1,18 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -final class nistb233 extends sect233r1 -{ -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistb409.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistb409.php deleted file mode 100644 index efe8de3..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistb409.php +++ /dev/null @@ -1,18 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -final class nistb409 extends sect409r1 -{ -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk163.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk163.php deleted file mode 100644 index 66e4252..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk163.php +++ /dev/null @@ -1,18 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -final class nistk163 extends sect163k1 -{ -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk233.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk233.php deleted file mode 100644 index 49ff2ba..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk233.php +++ /dev/null @@ -1,18 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -final class nistk233 extends sect233k1 -{ -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk283.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk283.php deleted file mode 100644 index dca9830..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk283.php +++ /dev/null @@ -1,18 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -final class nistk283 extends sect283k1 -{ -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk409.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk409.php deleted file mode 100644 index 3785547..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistk409.php +++ /dev/null @@ -1,18 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -final class nistk409 extends sect409k1 -{ -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp192.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp192.php deleted file mode 100644 index 31b67a5..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp192.php +++ /dev/null @@ -1,18 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -final class nistp192 extends secp192r1 -{ -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp224.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp224.php deleted file mode 100644 index 9408dd5..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp224.php +++ /dev/null @@ -1,18 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -final class nistp224 extends secp224r1 -{ -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp256.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp256.php deleted file mode 100644 index 4952be4..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp256.php +++ /dev/null @@ -1,18 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -final class nistp256 extends secp256r1 -{ -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp384.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp384.php deleted file mode 100644 index 05425c7..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp384.php +++ /dev/null @@ -1,18 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -final class nistp384 extends secp384r1 -{ -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp521.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp521.php deleted file mode 100644 index b17e173..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistp521.php +++ /dev/null @@ -1,18 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -final class nistp521 extends secp521r1 -{ -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistt571.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistt571.php deleted file mode 100644 index f650785..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/nistt571.php +++ /dev/null @@ -1,18 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -final class nistt571 extends sect571k1 -{ -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v1.php deleted file mode 100644 index 583eedd..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v1.php +++ /dev/null @@ -1,18 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -final class prime192v1 extends secp192r1 -{ -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v2.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v2.php deleted file mode 100644 index 594ea66..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v2.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class prime192v2 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF', 16)); - $this->setCoefficients( - new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC', 16), - new BigInteger('CC22D6DFB95C6B25E49C0D6364A4E5980C393AA21668D953', 16) - ); - $this->setBasePoint( - new BigInteger('EEA2BAE7E1497842F2DE7769CFE9C989C072AD696F48034A', 16), - new BigInteger('6574D11D69B6EC7A672BB82A083DF2F2B0847DE970B2DE15', 16) - ); - $this->setOrder(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFE5FB1A724DC80418648D8DD31', 16)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v3.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v3.php deleted file mode 100644 index b4a6867..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime192v3.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class prime192v3 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF', 16)); - $this->setCoefficients( - new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC', 16), - new BigInteger('22123DC2395A05CAA7423DAECCC94760A7D462256BD56916', 16) - ); - $this->setBasePoint( - new BigInteger('7D29778100C65A1DA1783716588DCE2B8B4AEE8E228F1896', 16), - new BigInteger('38A90F22637337334B49DCB66A6DC8F9978ACA7648A943B0', 16) - ); - $this->setOrder(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFF7A62D031C83F4294F640EC13', 16)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v1.php deleted file mode 100644 index 08b7f82..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v1.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class prime239v1 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF', 16)); - $this->setCoefficients( - new BigInteger('7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC', 16), - new BigInteger('6B016C3BDCF18941D0D654921475CA71A9DB2FB27D1D37796185C2942C0A', 16) - ); - $this->setBasePoint( - new BigInteger('0FFA963CDCA8816CCC33B8642BEDF905C3D358573D3F27FBBD3B3CB9AAAF', 16), - new BigInteger('7DEBE8E4E90A5DAE6E4054CA530BA04654B36818CE226B39FCCB7B02F1AE', 16) - ); - $this->setOrder(new BigInteger('7FFFFFFFFFFFFFFFFFFFFFFF7FFFFF9E5E9A9F5D9071FBD1522688909D0B', 16)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v2.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v2.php deleted file mode 100644 index 19a03a4..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v2.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class prime239v2 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF', 16)); - $this->setCoefficients( - new BigInteger('7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC', 16), - new BigInteger('617FAB6832576CBBFED50D99F0249C3FEE58B94BA0038C7AE84C8C832F2C', 16) - ); - $this->setBasePoint( - new BigInteger('38AF09D98727705120C921BB5E9E26296A3CDCF2F35757A0EAFD87B830E7', 16), - new BigInteger('5B0125E4DBEA0EC7206DA0FC01D9B081329FB555DE6EF460237DFF8BE4BA', 16) - ); - $this->setOrder(new BigInteger('7FFFFFFFFFFFFFFFFFFFFFFF800000CFA7E8594377D414C03821BC582063', 16)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v3.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v3.php deleted file mode 100644 index f179a24..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime239v3.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class prime239v3 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFF', 16)); - $this->setCoefficients( - new BigInteger('7FFFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFF8000000000007FFFFFFFFFFC', 16), - new BigInteger('255705FA2A306654B1F4CB03D6A750A30C250102D4988717D9BA15AB6D3E', 16) - ); - $this->setBasePoint( - new BigInteger('6768AE8E18BB92CFCF005C949AA2C6D94853D0E660BBF854B1C9505FE95A', 16), - new BigInteger('1607E6898F390C06BC1D552BAD226F3B6FCFE48B6E818499AF18E3ED6CF3', 16) - ); - $this->setOrder(new BigInteger('7FFFFFFFFFFFFFFFFFFFFFFF7FFFFF975DEB41B3A6057C3C432146526551', 16)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime256v1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime256v1.php deleted file mode 100644 index abb42dc..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/prime256v1.php +++ /dev/null @@ -1,18 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -final class prime256v1 extends secp256r1 -{ -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp112r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp112r1.php deleted file mode 100644 index c7b009d..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp112r1.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class secp112r1 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('DB7C2ABF62E35E668076BEAD208B', 16)); - $this->setCoefficients( - new BigInteger('DB7C2ABF62E35E668076BEAD2088', 16), - new BigInteger('659EF8BA043916EEDE8911702B22', 16) - ); - $this->setBasePoint( - new BigInteger('09487239995A5EE76B55F9C2F098', 16), - new BigInteger('A89CE5AF8724C0A23E0E0FF77500', 16) - ); - $this->setOrder(new BigInteger('DB7C2ABF62E35E7628DFAC6561C5', 16)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp112r2.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp112r2.php deleted file mode 100644 index 3d25c86..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp112r2.php +++ /dev/null @@ -1,35 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class secp112r2 extends Prime -{ - public function __construct() - { - // same modulo as secp112r1 - $this->setModulo(new BigInteger('DB7C2ABF62E35E668076BEAD208B', 16)); - $this->setCoefficients( - new BigInteger('6127C24C05F38A0AAAF65C0EF02C', 16), - new BigInteger('51DEF1815DB5ED74FCC34C85D709', 16) - ); - $this->setBasePoint( - new BigInteger('4BA30AB5E892B4E1649DD0928643', 16), - new BigInteger('ADCD46F5882E3747DEF36E956E97', 16) - ); - $this->setOrder(new BigInteger('36DF0AAFD8B8D7597CA10520D04B', 16)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp128r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp128r1.php deleted file mode 100644 index dbfe501..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp128r1.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class secp128r1 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF', 16)); - $this->setCoefficients( - new BigInteger('FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFC', 16), - new BigInteger('E87579C11079F43DD824993C2CEE5ED3', 16) - ); - $this->setBasePoint( - new BigInteger('161FF7528B899B2D0C28607CA52C5B86', 16), - new BigInteger('CF5AC8395BAFEB13C02DA292DDED7A83', 16) - ); - $this->setOrder(new BigInteger('FFFFFFFE0000000075A30D1B9038A115', 16)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp128r2.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp128r2.php deleted file mode 100644 index 3e818d9..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp128r2.php +++ /dev/null @@ -1,35 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class secp128r2 extends Prime -{ - public function __construct() - { - // same as secp128r1 - $this->setModulo(new BigInteger('FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF', 16)); - $this->setCoefficients( - new BigInteger('D6031998D1B3BBFEBF59CC9BBFF9AEE1', 16), - new BigInteger('5EEEFCA380D02919DC2C6558BB6D8A5D', 16) - ); - $this->setBasePoint( - new BigInteger('7B6AA5D85E572983E6FB32A7CDEBC140', 16), - new BigInteger('27B6916A894D3AEE7106FE805FC34B44', 16) - ); - $this->setOrder(new BigInteger('3FFFFFFF7FFFFFFFBE0024720613B5A3', 16)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160k1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160k1.php deleted file mode 100644 index bf44312..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160k1.php +++ /dev/null @@ -1,46 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\KoblitzPrime; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class secp160k1 extends KoblitzPrime -{ - public function __construct() - { - // same as secp160r2 - $this->setModulo(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73', 16)); - $this->setCoefficients( - new BigInteger('0000000000000000000000000000000000000000', 16), - new BigInteger('0000000000000000000000000000000000000007', 16) - ); - $this->setBasePoint( - new BigInteger('3B4C382CE37AA192A4019E763036F4F5DD4D7EBB', 16), - new BigInteger('938CF935318FDCED6BC28286531733C3F03C4FEE', 16) - ); - $this->setOrder(new BigInteger('0100000000000000000001B8FA16DFAB9ACA16B6B3', 16)); - - $this->basis = []; - $this->basis[] = [ - 'a' => new BigInteger('0096341F1138933BC2F505', -16), - 'b' => new BigInteger('FF6E9D0418C67BB8D5F562', -16) - ]; - $this->basis[] = [ - 'a' => new BigInteger('01BDCB3A09AAAABEAFF4A8', -16), - 'b' => new BigInteger('04D12329FF0EF498EA67', -16) - ]; - $this->beta = $this->factory->newInteger(new BigInteger('645B7345A143464942CC46D7CF4D5D1E1E6CBB68', -16)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160r1.php deleted file mode 100644 index 605a93e..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160r1.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class secp160r1 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF', 16)); - $this->setCoefficients( - new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC', 16), - new BigInteger('1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45', 16) - ); - $this->setBasePoint( - new BigInteger('4A96B5688EF573284664698968C38BB913CBFC82', 16), - new BigInteger('23A628553168947D59DCC912042351377AC5FB32', 16) - ); - $this->setOrder(new BigInteger('0100000000000000000001F4C8F927AED3CA752257', 16)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160r2.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160r2.php deleted file mode 100644 index 7c1bb48..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp160r2.php +++ /dev/null @@ -1,35 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class secp160r2 extends Prime -{ - public function __construct() - { - // same as secp160k1 - $this->setModulo(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73', 16)); - $this->setCoefficients( - new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC70', 16), - new BigInteger('B4E134D3FB59EB8BAB57274904664D5AF50388BA', 16) - ); - $this->setBasePoint( - new BigInteger('52DCB034293A117E1F4FF11B30F7199D3144CE6D', 16), - new BigInteger('FEAFFEF2E331F296E071FA0DF9982CFEA7D43F2E', 16) - ); - $this->setOrder(new BigInteger('0100000000000000000000351EE786A818F3A1A16B', 16)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp192k1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp192k1.php deleted file mode 100644 index 762add3..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp192k1.php +++ /dev/null @@ -1,45 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\KoblitzPrime; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class secp192k1 extends KoblitzPrime -{ - public function __construct() - { - $this->setModulo(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37', 16)); - $this->setCoefficients( - new BigInteger('000000000000000000000000000000000000000000000000', 16), - new BigInteger('000000000000000000000000000000000000000000000003', 16) - ); - $this->setBasePoint( - new BigInteger('DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D', 16), - new BigInteger('9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D', 16) - ); - $this->setOrder(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D', 16)); - - $this->basis = []; - $this->basis[] = [ - 'a' => new BigInteger('00B3FB3400DEC5C4ADCEB8655C', -16), - 'b' => new BigInteger('8EE96418CCF4CFC7124FDA0F', -16) - ]; - $this->basis[] = [ - 'a' => new BigInteger('01D90D03E8F096B9948B20F0A9', -16), - 'b' => new BigInteger('42E49819ABBA9474E1083F6B', -16) - ]; - $this->beta = $this->factory->newInteger(new BigInteger('447A96E6C647963E2F7809FEAAB46947F34B0AA3CA0BBA74', -16)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp192r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp192r1.php deleted file mode 100644 index 600be25..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp192r1.php +++ /dev/null @@ -1,78 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class secp192r1 extends Prime -{ - public function __construct() - { - $modulo = new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF', 16); - $this->setModulo($modulo); - - // algorithm 2.27 from http://diamond.boisestate.edu/~liljanab/MATH308/GuideToECC.pdf#page=66 - /* in theory this should be faster than regular modular reductions save for one small issue. - to convert to / from base-2**8 with BCMath you have to call bcmul() and bcdiv() a lot. - to convert to / from base-2**8 with PHP64 you have to call base256_rshift() a lot. - in short, converting to / from base-2**8 is pretty expensive and that expense is - enough to offset whatever else might be gained by a simplified reduction algorithm. - now, if PHP supported unsigned integers things might be different. no bit-shifting - would be required for the PHP engine and it'd be a lot faster. but as is, BigInteger - uses base-2**31 or base-2**26 depending on whether or not the system is has a 32-bit - or a 64-bit OS. - */ - /* - $m_length = $this->getLengthInBytes(); - $this->setReduction(function($c) use ($m_length) { - $cBytes = $c->toBytes(); - $className = $this->className; - - if (strlen($cBytes) > 2 * $m_length) { - list(, $r) = $c->divide($className::$modulo); - return $r; - } - - $c = str_pad($cBytes, 48, "\0", STR_PAD_LEFT); - $c = array_reverse(str_split($c, 8)); - - $null = "\0\0\0\0\0\0\0\0"; - $s1 = new BigInteger($c[2] . $c[1] . $c[0], 256); - $s2 = new BigInteger($null . $c[3] . $c[3], 256); - $s3 = new BigInteger($c[4] . $c[4] . $null, 256); - $s4 = new BigInteger($c[5] . $c[5] . $c[5], 256); - - $r = $s1->add($s2)->add($s3)->add($s4); - while ($r->compare($className::$modulo) >= 0) { - $r = $r->subtract($className::$modulo); - } - - return $r; - }); - */ - - $this->setCoefficients( - new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC', 16), - new BigInteger('64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1', 16) - ); - $this->setBasePoint( - new BigInteger('188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012', 16), - new BigInteger('07192B95FFC8DA78631011ED6B24CDD573F977A11E794811', 16) - ); - $this->setOrder(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831', 16)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp224k1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp224k1.php deleted file mode 100644 index 3447a82..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp224k1.php +++ /dev/null @@ -1,45 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\KoblitzPrime; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class secp224k1 extends KoblitzPrime -{ - public function __construct() - { - $this->setModulo(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFE56D', 16)); - $this->setCoefficients( - new BigInteger('00000000000000000000000000000000000000000000000000000000', 16), - new BigInteger('00000000000000000000000000000000000000000000000000000005', 16) - ); - $this->setBasePoint( - new BigInteger('A1455B334DF099DF30FC28A169A467E9E47075A90F7E650EB6B7A45C', 16), - new BigInteger('7E089FED7FBA344282CAFBD6F7E319F7C0B0BD59E2CA4BDB556D61A5', 16) - ); - $this->setOrder(new BigInteger('010000000000000000000000000001DCE8D2EC6184CAF0A971769FB1F7', 16)); - - $this->basis = []; - $this->basis[] = [ - 'a' => new BigInteger('00B8ADF1378A6EB73409FA6C9C637D', -16), - 'b' => new BigInteger('94730F82B358A3776A826298FA6F', -16) - ]; - $this->basis[] = [ - 'a' => new BigInteger('01DCE8D2EC6184CAF0A972769FCC8B', -16), - 'b' => new BigInteger('4D2100BA3DC75AAB747CCF355DEC', -16) - ]; - $this->beta = $this->factory->newInteger(new BigInteger('01F178FFA4B17C89E6F73AECE2AAD57AF4C0A748B63C830947B27E04', -16)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp224r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp224r1.php deleted file mode 100644 index 8d03d31..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp224r1.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class secp224r1 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001', 16)); - $this->setCoefficients( - new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE', 16), - new BigInteger('B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4', 16) - ); - $this->setBasePoint( - new BigInteger('B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21', 16), - new BigInteger('BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34', 16) - ); - $this->setOrder(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D', 16)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp256k1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp256k1.php deleted file mode 100644 index 29c829a..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp256k1.php +++ /dev/null @@ -1,49 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -//use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\KoblitzPrime; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -//class secp256k1 extends Prime -class secp256k1 extends KoblitzPrime -{ - public function __construct() - { - $this->setModulo(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F', 16)); - $this->setCoefficients( - new BigInteger('0000000000000000000000000000000000000000000000000000000000000000', 16), - new BigInteger('0000000000000000000000000000000000000000000000000000000000000007', 16) - ); - $this->setOrder(new BigInteger('FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141', 16)); - $this->setBasePoint( - new BigInteger('79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798', 16), - new BigInteger('483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8', 16) - ); - - $this->basis = []; - $this->basis[] = [ - 'a' => new BigInteger('3086D221A7D46BCDE86C90E49284EB15', -16), - 'b' => new BigInteger('FF1BBC8129FEF177D790AB8056F5401B3D', -16) - ]; - $this->basis[] = [ - 'a' => new BigInteger('114CA50F7A8E2F3F657C1108D9D44CFD8', -16), - 'b' => new BigInteger('3086D221A7D46BCDE86C90E49284EB15', -16) - ]; - $this->beta = $this->factory->newInteger(new BigInteger('7AE96A2B657C07106E64479EAC3434E99CF0497512F58995C1396C28719501EE', -16)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp256r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp256r1.php deleted file mode 100644 index 0f29334..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp256r1.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class secp256r1 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF', 16)); - $this->setCoefficients( - new BigInteger('FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC', 16), - new BigInteger('5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B', 16) - ); - $this->setBasePoint( - new BigInteger('6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296', 16), - new BigInteger('4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5', 16) - ); - $this->setOrder(new BigInteger('FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551', 16)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp384r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp384r1.php deleted file mode 100644 index d15ba31..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp384r1.php +++ /dev/null @@ -1,52 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class secp384r1 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger( - 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF', - 16 - )); - $this->setCoefficients( - new BigInteger( - 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC', - 16 - ), - new BigInteger( - 'B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF', - 16 - ) - ); - $this->setBasePoint( - new BigInteger( - 'AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7', - 16 - ), - new BigInteger( - '3617DE4A96262C6F5D9E98BF9292DC29F8F41DBD289A147CE9DA3113B5F0B8C00A60B1CE1D7E819D7A431D7C90EA0E5F', - 16 - ) - ); - $this->setOrder(new BigInteger( - 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973', - 16 - )); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp521r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp521r1.php deleted file mode 100644 index 1640a32..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/secp521r1.php +++ /dev/null @@ -1,46 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class secp521r1 extends Prime -{ - public function __construct() - { - $this->setModulo(new BigInteger('01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' . - 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' . - 'FFFF', 16)); - $this->setCoefficients( - new BigInteger('01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' . - 'FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' . - 'FFFC', 16), - new BigInteger('0051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF1' . - '09E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B50' . - '3F00', 16) - ); - $this->setBasePoint( - new BigInteger('00C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D' . - '3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5' . - 'BD66', 16), - new BigInteger('011839296A789A3BC0045C8A5FB42C7D1BD998F54449579B446817AFBD17273E' . - '662C97EE72995EF42640C550B9013FAD0761353C7086A272C24088BE94769FD1' . - '6650', 16) - ); - $this->setOrder(new BigInteger('01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' . - 'FFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E9138' . - '6409', 16)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect113r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect113r1.php deleted file mode 100644 index ac6c810..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect113r1.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Binary; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class sect113r1 extends Binary -{ - public function __construct() - { - $this->setModulo(113, 9, 0); - $this->setCoefficients( - '003088250CA6E7C7FE649CE85820F7', - '00E8BEE4D3E2260744188BE0E9C723' - ); - $this->setBasePoint( - '009D73616F35F4AB1407D73562C10F', - '00A52830277958EE84D1315ED31886' - ); - $this->setOrder(new BigInteger('0100000000000000D9CCEC8A39E56F', 16)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect113r2.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect113r2.php deleted file mode 100644 index 667fa0e..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect113r2.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Binary; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class sect113r2 extends Binary -{ - public function __construct() - { - $this->setModulo(113, 9, 0); - $this->setCoefficients( - '00689918DBEC7E5A0DD6DFC0AA55C7', - '0095E9A9EC9B297BD4BF36E059184F' - ); - $this->setBasePoint( - '01A57A6A7B26CA5EF52FCDB8164797', - '00B3ADC94ED1FE674C06E695BABA1D' - ); - $this->setOrder(new BigInteger('010000000000000108789B2496AF93', 16)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect131r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect131r1.php deleted file mode 100644 index cb6e9f9..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect131r1.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Binary; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class sect131r1 extends Binary -{ - public function __construct() - { - $this->setModulo(131, 8, 3, 2, 0); - $this->setCoefficients( - '07A11B09A76B562144418FF3FF8C2570B8', - '0217C05610884B63B9C6C7291678F9D341' - ); - $this->setBasePoint( - '0081BAF91FDF9833C40F9C181343638399', - '078C6E7EA38C001F73C8134B1B4EF9E150' - ); - $this->setOrder(new BigInteger('0400000000000000023123953A9464B54D', 16)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect131r2.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect131r2.php deleted file mode 100644 index 8b98a44..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect131r2.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Binary; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class sect131r2 extends Binary -{ - public function __construct() - { - $this->setModulo(131, 8, 3, 2, 0); - $this->setCoefficients( - '03E5A88919D7CAFCBF415F07C2176573B2', - '04B8266A46C55657AC734CE38F018F2192' - ); - $this->setBasePoint( - '0356DCD8F2F95031AD652D23951BB366A8', - '0648F06D867940A5366D9E265DE9EB240F' - ); - $this->setOrder(new BigInteger('0400000000000000016954A233049BA98F', 16)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163k1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163k1.php deleted file mode 100644 index 0ab77aa..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163k1.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Binary; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class sect163k1 extends Binary -{ - public function __construct() - { - $this->setModulo(163, 7, 6, 3, 0); - $this->setCoefficients( - '000000000000000000000000000000000000000001', - '000000000000000000000000000000000000000001' - ); - $this->setBasePoint( - '02FE13C0537BBC11ACAA07D793DE4E6D5E5C94EEE8', - '0289070FB05D38FF58321F2E800536D538CCDAA3D9' - ); - $this->setOrder(new BigInteger('04000000000000000000020108A2E0CC0D99F8A5EF', 16)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163r1.php deleted file mode 100644 index 4e6bd53..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163r1.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Binary; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class sect163r1 extends Binary -{ - public function __construct() - { - $this->setModulo(163, 7, 6, 3, 0); - $this->setCoefficients( - '07B6882CAAEFA84F9554FF8428BD88E246D2782AE2', - '0713612DCDDCB40AAB946BDA29CA91F73AF958AFD9' - ); - $this->setBasePoint( - '0369979697AB43897789566789567F787A7876A654', - '00435EDB42EFAFB2989D51FEFCE3C80988F41FF883' - ); - $this->setOrder(new BigInteger('03FFFFFFFFFFFFFFFFFFFF48AAB689C29CA710279B', 16)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163r2.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163r2.php deleted file mode 100644 index 0eabf0d..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect163r2.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Binary; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class sect163r2 extends Binary -{ - public function __construct() - { - $this->setModulo(163, 7, 6, 3, 0); - $this->setCoefficients( - '000000000000000000000000000000000000000001', - '020A601907B8C953CA1481EB10512F78744A3205FD' - ); - $this->setBasePoint( - '03F0EBA16286A2D57EA0991168D4994637E8343E36', - '00D51FBC6C71A0094FA2CDD545B11C5C0C797324F1' - ); - $this->setOrder(new BigInteger('040000000000000000000292FE77E70C12A4234C33', 16)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect193r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect193r1.php deleted file mode 100644 index 2e09e4f..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect193r1.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Binary; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class sect193r1 extends Binary -{ - public function __construct() - { - $this->setModulo(193, 15, 0); - $this->setCoefficients( - '0017858FEB7A98975169E171F77B4087DE098AC8A911DF7B01', - '00FDFB49BFE6C3A89FACADAA7A1E5BBC7CC1C2E5D831478814' - ); - $this->setBasePoint( - '01F481BC5F0FF84A74AD6CDF6FDEF4BF6179625372D8C0C5E1', - '0025E399F2903712CCF3EA9E3A1AD17FB0B3201B6AF7CE1B05' - ); - $this->setOrder(new BigInteger('01000000000000000000000000C7F34A778F443ACC920EBA49', 16)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect193r2.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect193r2.php deleted file mode 100644 index 4a98cc0..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect193r2.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Binary; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class sect193r2 extends Binary -{ - public function __construct() - { - $this->setModulo(193, 15, 0); - $this->setCoefficients( - '0163F35A5137C2CE3EA6ED8667190B0BC43ECD69977702709B', - '00C9BB9E8927D4D64C377E2AB2856A5B16E3EFB7F61D4316AE' - ); - $this->setBasePoint( - '00D9B67D192E0367C803F39E1A7E82CA14A651350AAE617E8F', - '01CE94335607C304AC29E7DEFBD9CA01F596F927224CDECF6C' - ); - $this->setOrder(new BigInteger('010000000000000000000000015AAB561B005413CCD4EE99D5', 16)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect233k1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect233k1.php deleted file mode 100644 index ac5bf54..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect233k1.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Binary; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class sect233k1 extends Binary -{ - public function __construct() - { - $this->setModulo(233, 74, 0); - $this->setCoefficients( - '000000000000000000000000000000000000000000000000000000000000', - '000000000000000000000000000000000000000000000000000000000001' - ); - $this->setBasePoint( - '017232BA853A7E731AF129F22FF4149563A419C26BF50A4C9D6EEFAD6126', - '01DB537DECE819B7F70F555A67C427A8CD9BF18AEB9B56E0C11056FAE6A3' - ); - $this->setOrder(new BigInteger('8000000000000000000000000000069D5BB915BCD46EFB1AD5F173ABDF', 16)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect233r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect233r1.php deleted file mode 100644 index 17fd4c8..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect233r1.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Binary; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class sect233r1 extends Binary -{ - public function __construct() - { - $this->setModulo(233, 74, 0); - $this->setCoefficients( - '000000000000000000000000000000000000000000000000000000000001', - '0066647EDE6C332C7F8C0923BB58213B333B20E9CE4281FE115F7D8F90AD' - ); - $this->setBasePoint( - '00FAC9DFCBAC8313BB2139F1BB755FEF65BC391F8B36F8F8EB7371FD558B', - '01006A08A41903350678E58528BEBF8A0BEFF867A7CA36716F7E01F81052' - ); - $this->setOrder(new BigInteger('01000000000000000000000000000013E974E72F8A6922031D2603CFE0D7', 16)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect239k1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect239k1.php deleted file mode 100644 index f3ccbf9..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect239k1.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Binary; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class sect239k1 extends Binary -{ - public function __construct() - { - $this->setModulo(239, 158, 0); - $this->setCoefficients( - '000000000000000000000000000000000000000000000000000000000000', - '000000000000000000000000000000000000000000000000000000000001' - ); - $this->setBasePoint( - '29A0B6A887A983E9730988A68727A8B2D126C44CC2CC7B2A6555193035DC', - '76310804F12E549BDB011C103089E73510ACB275FC312A5DC6B76553F0CA' - ); - $this->setOrder(new BigInteger('2000000000000000000000000000005A79FEC67CB6E91F1C1DA800E478A5', 16)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect283k1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect283k1.php deleted file mode 100644 index cbace47..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect283k1.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Binary; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class sect283k1 extends Binary -{ - public function __construct() - { - $this->setModulo(283, 12, 7, 5, 0); - $this->setCoefficients( - '000000000000000000000000000000000000000000000000000000000000000000000000', - '000000000000000000000000000000000000000000000000000000000000000000000001' - ); - $this->setBasePoint( - '0503213F78CA44883F1A3B8162F188E553CD265F23C1567A16876913B0C2AC2458492836', - '01CCDA380F1C9E318D90F95D07E5426FE87E45C0E8184698E45962364E34116177DD2259' - ); - $this->setOrder(new BigInteger('01FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE9AE2ED07577265DFF7F94451E061E163C61', 16)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect283r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect283r1.php deleted file mode 100644 index 7a33684..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect283r1.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Binary; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class sect283r1 extends Binary -{ - public function __construct() - { - $this->setModulo(283, 12, 7, 5, 0); - $this->setCoefficients( - '000000000000000000000000000000000000000000000000000000000000000000000001', - '027B680AC8B8596DA5A4AF8A19A0303FCA97FD7645309FA2A581485AF6263E313B79A2F5' - ); - $this->setBasePoint( - '05F939258DB7DD90E1934F8C70B0DFEC2EED25B8557EAC9C80E2E198F8CDBECD86B12053', - '03676854FE24141CB98FE6D4B20D02B4516FF702350EDDB0826779C813F0DF45BE8112F4' - ); - $this->setOrder(new BigInteger('03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF90399660FC938A90165B042A7CEFADB307', 16)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect409k1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect409k1.php deleted file mode 100644 index 850540f..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect409k1.php +++ /dev/null @@ -1,38 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Binary; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class sect409k1 extends Binary -{ - public function __construct() - { - $this->setModulo(409, 87, 0); - $this->setCoefficients( - '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', - '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001' - ); - $this->setBasePoint( - '0060F05F658F49C1AD3AB1890F7184210EFD0987E307C84C27ACCFB8F9F67CC2C460189EB5AAAA62EE222EB1B35540CFE9023746', - '01E369050B7C4E42ACBA1DACBF04299C3460782F918EA427E6325165E9EA10E3DA5F6C42E9C55215AA9CA27A5863EC48D8E0286B' - ); - $this->setOrder(new BigInteger( - '7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE5F' . - '83B2D4EA20400EC4557D5ED3E3E7CA5B4B5C83B8E01E5FCF', - 16 - )); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect409r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect409r1.php deleted file mode 100644 index 7ace1d2..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect409r1.php +++ /dev/null @@ -1,38 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Binary; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class sect409r1 extends Binary -{ - public function __construct() - { - $this->setModulo(409, 87, 0); - $this->setCoefficients( - '00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001', - '0021A5C2C8EE9FEB5C4B9A753B7B476B7FD6422EF1F3DD674761FA99D6AC27C8A9A197B272822F6CD57A55AA4F50AE317B13545F' - ); - $this->setBasePoint( - '015D4860D088DDB3496B0C6064756260441CDE4AF1771D4DB01FFE5B34E59703DC255A868A1180515603AEAB60794E54BB7996A7', - '0061B1CFAB6BE5F32BBFA78324ED106A7636B9C5A7BD198D0158AA4F5488D08F38514F1FDF4B4F40D2181B3681C364BA0273C706' - ); - $this->setOrder(new BigInteger( - '010000000000000000000000000000000000000000000000000001E2' . - 'AAD6A612F33307BE5FA47C3C9E052F838164CD37D9A21173', - 16 - )); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect571k1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect571k1.php deleted file mode 100644 index bc1e250..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect571k1.php +++ /dev/null @@ -1,42 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Binary; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class sect571k1 extends Binary -{ - public function __construct() - { - $this->setModulo(571, 10, 5, 2, 0); - $this->setCoefficients( - '000000000000000000000000000000000000000000000000000000000000000000000000' . - '000000000000000000000000000000000000000000000000000000000000000000000000', - '000000000000000000000000000000000000000000000000000000000000000000000000' . - '000000000000000000000000000000000000000000000000000000000000000000000001' - ); - $this->setBasePoint( - '026EB7A859923FBC82189631F8103FE4AC9CA2970012D5D46024804801841CA443709584' . - '93B205E647DA304DB4CEB08CBBD1BA39494776FB988B47174DCA88C7E2945283A01C8972', - '0349DC807F4FBF374F4AEADE3BCA95314DD58CEC9F307A54FFC61EFC006D8A2C9D4979C0' . - 'AC44AEA74FBEBBB9F772AEDCB620B01A7BA7AF1B320430C8591984F601CD4C143EF1C7A3' - ); - $this->setOrder(new BigInteger( - '020000000000000000000000000000000000000000000000000000000000000000000000' . - '131850E1F19A63E4B391A8DB917F4138B630D84BE5D639381E91DEB45CFE778F637C1001', - 16 - )); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect571r1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect571r1.php deleted file mode 100644 index 68effee..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Curves/sect571r1.php +++ /dev/null @@ -1,42 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Binary; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -class sect571r1 extends Binary -{ - public function __construct() - { - $this->setModulo(571, 10, 5, 2, 0); - $this->setCoefficients( - '000000000000000000000000000000000000000000000000000000000000000000000000' . - '000000000000000000000000000000000000000000000000000000000000000000000001', - '02F40E7E2221F295DE297117B7F3D62F5C6A97FFCB8CEFF1CD6BA8CE4A9A18AD84FFABBD' . - '8EFA59332BE7AD6756A66E294AFD185A78FF12AA520E4DE739BACA0C7FFEFF7F2955727A' - ); - $this->setBasePoint( - '0303001D34B856296C16C0D40D3CD7750A93D1D2955FA80AA5F40FC8DB7B2ABDBDE53950' . - 'F4C0D293CDD711A35B67FB1499AE60038614F1394ABFA3B4C850D927E1E7769C8EEC2D19', - '037BF27342DA639B6DCCFFFEB73D69D78C6C27A6009CBBCA1980F8533921E8A684423E43' . - 'BAB08A576291AF8F461BB2A8B3531D2F0485C19B16E2F1516E23DD3C1A4827AF1B8AC15B' - ); - $this->setOrder(new BigInteger( - '03FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF' . - 'E661CE18FF55987308059B186823851EC7DD9CA1161DE93D5174D66E8382E9BB2FE84E47', - 16 - )); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/Common.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/Common.php deleted file mode 100644 index f3a5c10..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/Common.php +++ /dev/null @@ -1,549 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Formats\Keys; - -use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Base as BaseCurve; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Binary as BinaryCurve; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime as PrimeCurve; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\TwistedEdwards as TwistedEdwardsCurve; -use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedCurveException; -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; -use OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * Generic EC Key Parsing Helper functions - * - * @author Jim Wigginton - */ -trait Common -{ - /** - * Curve OIDs - * - * @var array - */ - private static $curveOIDs = []; - - /** - * Child OIDs loaded - * - * @var bool - */ - protected static $childOIDsLoaded = false; - - /** - * Use Named Curves - * - * @var bool - */ - private static $useNamedCurves = true; - - /** - * Initialize static variables - */ - private static function initialize_static_variables() - { - if (empty(self::$curveOIDs)) { - // the sec* curves are from the standards for efficient cryptography group - // sect* curves are curves over binary finite fields - // secp* curves are curves over prime finite fields - // sec*r* curves are regular curves; sec*k* curves are koblitz curves - // brainpool*r* curves are regular prime finite field curves - // brainpool*t* curves are twisted versions of the brainpool*r* curves - self::$curveOIDs = [ - 'prime192v1' => '1.2.840.10045.3.1.1', // J.5.1, example 1 (aka secp192r1) - 'prime192v2' => '1.2.840.10045.3.1.2', // J.5.1, example 2 - 'prime192v3' => '1.2.840.10045.3.1.3', // J.5.1, example 3 - 'prime239v1' => '1.2.840.10045.3.1.4', // J.5.2, example 1 - 'prime239v2' => '1.2.840.10045.3.1.5', // J.5.2, example 2 - 'prime239v3' => '1.2.840.10045.3.1.6', // J.5.2, example 3 - 'prime256v1' => '1.2.840.10045.3.1.7', // J.5.3, example 1 (aka secp256r1) - - // https://tools.ietf.org/html/rfc5656#section-10 - 'nistp256' => '1.2.840.10045.3.1.7', // aka secp256r1 - 'nistp384' => '1.3.132.0.34', // aka secp384r1 - 'nistp521' => '1.3.132.0.35', // aka secp521r1 - - 'nistk163' => '1.3.132.0.1', // aka sect163k1 - 'nistp192' => '1.2.840.10045.3.1.1', // aka secp192r1 - 'nistp224' => '1.3.132.0.33', // aka secp224r1 - 'nistk233' => '1.3.132.0.26', // aka sect233k1 - 'nistb233' => '1.3.132.0.27', // aka sect233r1 - 'nistk283' => '1.3.132.0.16', // aka sect283k1 - 'nistk409' => '1.3.132.0.36', // aka sect409k1 - 'nistb409' => '1.3.132.0.37', // aka sect409r1 - 'nistt571' => '1.3.132.0.38', // aka sect571k1 - - // from https://tools.ietf.org/html/rfc5915 - 'secp192r1' => '1.2.840.10045.3.1.1', // aka prime192v1 - 'sect163k1' => '1.3.132.0.1', - 'sect163r2' => '1.3.132.0.15', - 'secp224r1' => '1.3.132.0.33', - 'sect233k1' => '1.3.132.0.26', - 'sect233r1' => '1.3.132.0.27', - 'secp256r1' => '1.2.840.10045.3.1.7', // aka prime256v1 - 'sect283k1' => '1.3.132.0.16', - 'sect283r1' => '1.3.132.0.17', - 'secp384r1' => '1.3.132.0.34', - 'sect409k1' => '1.3.132.0.36', - 'sect409r1' => '1.3.132.0.37', - 'secp521r1' => '1.3.132.0.35', - 'sect571k1' => '1.3.132.0.38', - 'sect571r1' => '1.3.132.0.39', - // from http://www.secg.org/SEC2-Ver-1.0.pdf - 'secp112r1' => '1.3.132.0.6', - 'secp112r2' => '1.3.132.0.7', - 'secp128r1' => '1.3.132.0.28', - 'secp128r2' => '1.3.132.0.29', - 'secp160k1' => '1.3.132.0.9', - 'secp160r1' => '1.3.132.0.8', - 'secp160r2' => '1.3.132.0.30', - 'secp192k1' => '1.3.132.0.31', - 'secp224k1' => '1.3.132.0.32', - 'secp256k1' => '1.3.132.0.10', - - 'sect113r1' => '1.3.132.0.4', - 'sect113r2' => '1.3.132.0.5', - 'sect131r1' => '1.3.132.0.22', - 'sect131r2' => '1.3.132.0.23', - 'sect163r1' => '1.3.132.0.2', - 'sect193r1' => '1.3.132.0.24', - 'sect193r2' => '1.3.132.0.25', - 'sect239k1' => '1.3.132.0.3', - - // from http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.202.2977&rep=rep1&type=pdf#page=36 - /* - 'c2pnb163v1' => '1.2.840.10045.3.0.1', // J.4.1, example 1 - 'c2pnb163v2' => '1.2.840.10045.3.0.2', // J.4.1, example 2 - 'c2pnb163v3' => '1.2.840.10045.3.0.3', // J.4.1, example 3 - 'c2pnb172w1' => '1.2.840.10045.3.0.4', // J.4.2, example 1 - 'c2tnb191v1' => '1.2.840.10045.3.0.5', // J.4.3, example 1 - 'c2tnb191v2' => '1.2.840.10045.3.0.6', // J.4.3, example 2 - 'c2tnb191v3' => '1.2.840.10045.3.0.7', // J.4.3, example 3 - 'c2onb191v4' => '1.2.840.10045.3.0.8', // J.4.3, example 4 - 'c2onb191v5' => '1.2.840.10045.3.0.9', // J.4.3, example 5 - 'c2pnb208w1' => '1.2.840.10045.3.0.10', // J.4.4, example 1 - 'c2tnb239v1' => '1.2.840.10045.3.0.11', // J.4.5, example 1 - 'c2tnb239v2' => '1.2.840.10045.3.0.12', // J.4.5, example 2 - 'c2tnb239v3' => '1.2.840.10045.3.0.13', // J.4.5, example 3 - 'c2onb239v4' => '1.2.840.10045.3.0.14', // J.4.5, example 4 - 'c2onb239v5' => '1.2.840.10045.3.0.15', // J.4.5, example 5 - 'c2pnb272w1' => '1.2.840.10045.3.0.16', // J.4.6, example 1 - 'c2pnb304w1' => '1.2.840.10045.3.0.17', // J.4.7, example 1 - 'c2tnb359v1' => '1.2.840.10045.3.0.18', // J.4.8, example 1 - 'c2pnb368w1' => '1.2.840.10045.3.0.19', // J.4.9, example 1 - 'c2tnb431r1' => '1.2.840.10045.3.0.20', // J.4.10, example 1 - */ - - // http://www.ecc-brainpool.org/download/Domain-parameters.pdf - // https://tools.ietf.org/html/rfc5639 - 'brainpoolP160r1' => '1.3.36.3.3.2.8.1.1.1', - 'brainpoolP160t1' => '1.3.36.3.3.2.8.1.1.2', - 'brainpoolP192r1' => '1.3.36.3.3.2.8.1.1.3', - 'brainpoolP192t1' => '1.3.36.3.3.2.8.1.1.4', - 'brainpoolP224r1' => '1.3.36.3.3.2.8.1.1.5', - 'brainpoolP224t1' => '1.3.36.3.3.2.8.1.1.6', - 'brainpoolP256r1' => '1.3.36.3.3.2.8.1.1.7', - 'brainpoolP256t1' => '1.3.36.3.3.2.8.1.1.8', - 'brainpoolP320r1' => '1.3.36.3.3.2.8.1.1.9', - 'brainpoolP320t1' => '1.3.36.3.3.2.8.1.1.10', - 'brainpoolP384r1' => '1.3.36.3.3.2.8.1.1.11', - 'brainpoolP384t1' => '1.3.36.3.3.2.8.1.1.12', - 'brainpoolP512r1' => '1.3.36.3.3.2.8.1.1.13', - 'brainpoolP512t1' => '1.3.36.3.3.2.8.1.1.14' - ]; - ASN1::loadOIDs([ - 'prime-field' => '1.2.840.10045.1.1', - 'characteristic-two-field' => '1.2.840.10045.1.2', - 'characteristic-two-basis' => '1.2.840.10045.1.2.3', - // per http://www.secg.org/SEC1-Ver-1.0.pdf#page=84, gnBasis "not used here" - 'gnBasis' => '1.2.840.10045.1.2.3.1', // NULL - 'tpBasis' => '1.2.840.10045.1.2.3.2', // Trinomial - 'ppBasis' => '1.2.840.10045.1.2.3.3' // Pentanomial - ] + self::$curveOIDs); - } - } - - /** - * Explicitly set the curve - * - * If the key contains an implicit curve phpseclib needs the curve - * to be explicitly provided - * - * @param BaseCurve $curve - */ - public static function setImplicitCurve(BaseCurve $curve) - { - self::$implicitCurve = $curve; - } - - /** - * Returns an instance of \phpseclib3\Crypt\EC\BaseCurves\Base based - * on the curve parameters - * - * @param array $params - * @return BaseCurve|false - */ - protected static function loadCurveByParam(array $params) - { - if (count($params) > 1) { - throw new \RuntimeException('No parameters are present'); - } - if (isset($params['namedCurve'])) { - $curve = '\phpseclib3\Crypt\EC\Curves\\' . $params['namedCurve']; - if (!class_exists($curve)) { - throw new UnsupportedCurveException('Named Curve of ' . $params['namedCurve'] . ' is not supported'); - } - return new $curve(); - } - if (isset($params['implicitCurve'])) { - if (!isset(self::$implicitCurve)) { - throw new \RuntimeException('Implicit curves can be provided by calling setImplicitCurve'); - } - return self::$implicitCurve; - } - if (isset($params['specifiedCurve'])) { - $data = $params['specifiedCurve']; - switch ($data['fieldID']['fieldType']) { - case 'prime-field': - $curve = new PrimeCurve(); - $curve->setModulo($data['fieldID']['parameters']); - $curve->setCoefficients( - new BigInteger($data['curve']['a'], 256), - new BigInteger($data['curve']['b'], 256) - ); - $point = self::extractPoint("\0" . $data['base'], $curve); - $curve->setBasePoint(...$point); - $curve->setOrder($data['order']); - return $curve; - case 'characteristic-two-field': - $curve = new BinaryCurve(); - $params = ASN1::decodeBER($data['fieldID']['parameters']); - $params = ASN1::asn1map($params[0], Maps\Characteristic_two::MAP); - $modulo = [(int) $params['m']->toString()]; - switch ($params['basis']) { - case 'tpBasis': - $modulo[] = (int) $params['parameters']->toString(); - break; - case 'ppBasis': - $temp = ASN1::decodeBER($params['parameters']); - $temp = ASN1::asn1map($temp[0], Maps\Pentanomial::MAP); - $modulo[] = (int) $temp['k3']->toString(); - $modulo[] = (int) $temp['k2']->toString(); - $modulo[] = (int) $temp['k1']->toString(); - } - $modulo[] = 0; - $curve->setModulo(...$modulo); - $len = ceil($modulo[0] / 8); - $curve->setCoefficients( - Strings::bin2hex($data['curve']['a']), - Strings::bin2hex($data['curve']['b']) - ); - $point = self::extractPoint("\0" . $data['base'], $curve); - $curve->setBasePoint(...$point); - $curve->setOrder($data['order']); - return $curve; - default: - throw new UnsupportedCurveException('Field Type of ' . $data['fieldID']['fieldType'] . ' is not supported'); - } - } - throw new \RuntimeException('No valid parameters are present'); - } - - /** - * Extract points from a string - * - * Supports both compressed and uncompressed points - * - * @param string $str - * @param BaseCurve $curve - * @return object[] - */ - public static function extractPoint($str, BaseCurve $curve) - { - if ($curve instanceof TwistedEdwardsCurve) { - // first step of point deciding as discussed at the following URL's: - // https://tools.ietf.org/html/rfc8032#section-5.1.3 - // https://tools.ietf.org/html/rfc8032#section-5.2.3 - $y = $str; - $y = strrev($y); - $sign = (bool) (ord($y[0]) & 0x80); - $y[0] = $y[0] & chr(0x7F); - $y = new BigInteger($y, 256); - if ($y->compare($curve->getModulo()) >= 0) { - throw new \RuntimeException('The Y coordinate should not be >= the modulo'); - } - $point = $curve->recoverX($y, $sign); - if (!$curve->verifyPoint($point)) { - throw new \RuntimeException('Unable to verify that point exists on curve'); - } - return $point; - } - - // the first byte of a bit string represents the number of bits in the last byte that are to be ignored but, - // currently, bit strings wanting a non-zero amount of bits trimmed are not supported - if (($val = Strings::shift($str)) != "\0") { - throw new \UnexpectedValueException('extractPoint expects the first byte to be null - not ' . Strings::bin2hex($val)); - } - if ($str == "\0") { - return []; - } - - $keylen = strlen($str); - $order = $curve->getLengthInBytes(); - // point compression is being used - if ($keylen == $order + 1) { - return $curve->derivePoint($str); - } - - // point compression is not being used - if ($keylen == 2 * $order + 1) { - preg_match("#(.)(.{{$order}})(.{{$order}})#s", $str, $matches); - list(, $w, $x, $y) = $matches; - if ($w != "\4") { - throw new \UnexpectedValueException('The first byte of an uncompressed point should be 04 - not ' . Strings::bin2hex($val)); - } - $point = [ - $curve->convertInteger(new BigInteger($x, 256)), - $curve->convertInteger(new BigInteger($y, 256)) - ]; - - if (!$curve->verifyPoint($point)) { - throw new \RuntimeException('Unable to verify that point exists on curve'); - } - - return $point; - } - - throw new \UnexpectedValueException('The string representation of the points is not of an appropriate length'); - } - - /** - * Encode Parameters - * - * @todo Maybe at some point this could be moved to __toString() for each of the curves? - * @param BaseCurve $curve - * @param bool $returnArray optional - * @param array $options optional - * @return string|false - */ - private static function encodeParameters(BaseCurve $curve, $returnArray = false, array $options = []) - { - $useNamedCurves = isset($options['namedCurve']) ? $options['namedCurve'] : self::$useNamedCurves; - - $reflect = new \ReflectionClass($curve); - $name = $reflect->getShortName(); - if ($useNamedCurves) { - if (isset(self::$curveOIDs[$name])) { - if ($reflect->isFinal()) { - $reflect = $reflect->getParentClass(); - $name = $reflect->getShortName(); - } - return $returnArray ? - ['namedCurve' => $name] : - ASN1::encodeDER(['namedCurve' => $name], Maps\ECParameters::MAP); - } - foreach (new \DirectoryIterator(__DIR__ . '/../../Curves/') as $file) { - if ($file->getExtension() != 'php') { - continue; - } - $testName = $file->getBasename('.php'); - $class = '\OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves\\' . $testName; - $reflect = new \ReflectionClass($class); - if ($reflect->isFinal()) { - continue; - } - $candidate = new $class(); - switch ($name) { - case 'Prime': - if (!$candidate instanceof PrimeCurve) { - break; - } - if (!$candidate->getModulo()->equals($curve->getModulo())) { - break; - } - if ($candidate->getA()->toBytes() != $curve->getA()->toBytes()) { - break; - } - if ($candidate->getB()->toBytes() != $curve->getB()->toBytes()) { - break; - } - - list($candidateX, $candidateY) = $candidate->getBasePoint(); - list($curveX, $curveY) = $curve->getBasePoint(); - if ($candidateX->toBytes() != $curveX->toBytes()) { - break; - } - if ($candidateY->toBytes() != $curveY->toBytes()) { - break; - } - - return $returnArray ? - ['namedCurve' => $testName] : - ASN1::encodeDER(['namedCurve' => $testName], Maps\ECParameters::MAP); - case 'Binary': - if (!$candidate instanceof BinaryCurve) { - break; - } - if ($candidate->getModulo() != $curve->getModulo()) { - break; - } - if ($candidate->getA()->toBytes() != $curve->getA()->toBytes()) { - break; - } - if ($candidate->getB()->toBytes() != $curve->getB()->toBytes()) { - break; - } - - list($candidateX, $candidateY) = $candidate->getBasePoint(); - list($curveX, $curveY) = $curve->getBasePoint(); - if ($candidateX->toBytes() != $curveX->toBytes()) { - break; - } - if ($candidateY->toBytes() != $curveY->toBytes()) { - break; - } - - return $returnArray ? - ['namedCurve' => $testName] : - ASN1::encodeDER(['namedCurve' => $testName], Maps\ECParameters::MAP); - } - } - } - - $order = $curve->getOrder(); - // we could try to calculate the order thusly: - // https://crypto.stackexchange.com/a/27914/4520 - // https://en.wikipedia.org/wiki/Schoof%E2%80%93Elkies%E2%80%93Atkin_algorithm - if (!$order) { - throw new \RuntimeException('Specified Curves need the order to be specified'); - } - $point = $curve->getBasePoint(); - $x = $point[0]->toBytes(); - $y = $point[1]->toBytes(); - - if ($curve instanceof PrimeCurve) { - /* - * valid versions are: - * - * ecdpVer1: - * - neither the curve or the base point are generated verifiably randomly. - * ecdpVer2: - * - curve and base point are generated verifiably at random and curve.seed is present - * ecdpVer3: - * - base point is generated verifiably at random but curve is not. curve.seed is present - */ - // other (optional) parameters can be calculated using the methods discused at - // https://crypto.stackexchange.com/q/28947/4520 - $data = [ - 'version' => 'ecdpVer1', - 'fieldID' => [ - 'fieldType' => 'prime-field', - 'parameters' => $curve->getModulo() - ], - 'curve' => [ - 'a' => $curve->getA()->toBytes(), - 'b' => $curve->getB()->toBytes() - ], - 'base' => "\4" . $x . $y, - 'order' => $order - ]; - - return $returnArray ? - ['specifiedCurve' => $data] : - ASN1::encodeDER(['specifiedCurve' => $data], Maps\ECParameters::MAP); - } - if ($curve instanceof BinaryCurve) { - $modulo = $curve->getModulo(); - $basis = count($modulo); - $m = array_shift($modulo); - array_pop($modulo); // the last parameter should always be 0 - //rsort($modulo); - switch ($basis) { - case 3: - $basis = 'tpBasis'; - $modulo = new BigInteger($modulo[0]); - break; - case 5: - $basis = 'ppBasis'; - // these should be in strictly ascending order (hence the commented out rsort above) - $modulo = [ - 'k1' => new BigInteger($modulo[2]), - 'k2' => new BigInteger($modulo[1]), - 'k3' => new BigInteger($modulo[0]) - ]; - $modulo = ASN1::encodeDER($modulo, Maps\Pentanomial::MAP); - $modulo = new ASN1\Element($modulo); - } - $params = ASN1::encodeDER([ - 'm' => new BigInteger($m), - 'basis' => $basis, - 'parameters' => $modulo - ], Maps\Characteristic_two::MAP); - $params = new ASN1\Element($params); - $a = ltrim($curve->getA()->toBytes(), "\0"); - if (!strlen($a)) { - $a = "\0"; - } - $b = ltrim($curve->getB()->toBytes(), "\0"); - if (!strlen($b)) { - $b = "\0"; - } - $data = [ - 'version' => 'ecdpVer1', - 'fieldID' => [ - 'fieldType' => 'characteristic-two-field', - 'parameters' => $params - ], - 'curve' => [ - 'a' => $a, - 'b' => $b - ], - 'base' => "\4" . $x . $y, - 'order' => $order - ]; - - return $returnArray ? - ['specifiedCurve' => $data] : - ASN1::encodeDER(['specifiedCurve' => $data], Maps\ECParameters::MAP); - } - - throw new UnsupportedCurveException('Curve cannot be serialized'); - } - - /** - * Use Specified Curve - * - * A specified curve has all the coefficients, the base points, etc, explicitely included. - * A specified curve is a more verbose way of representing a curve - */ - public static function useSpecifiedCurve() - { - self::$useNamedCurves = false; - } - - /** - * Use Named Curve - * - * A named curve does not include any parameters. It is up to the EC parameters to - * know what the coefficients, the base points, etc, are from the name of the curve. - * A named curve is a more concise way of representing a curve - */ - public static function useNamedCurve() - { - self::$useNamedCurves = true; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/JWK.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/JWK.php deleted file mode 100644 index 52c1512..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/JWK.php +++ /dev/null @@ -1,189 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Formats\Keys; - -use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Keys\JWK as Progenitor; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Base as BaseCurve; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\TwistedEdwards as TwistedEdwardsCurve; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves\Ed25519; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves\secp256k1; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves\secp256r1; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves\secp384r1; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves\secp521r1; -use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedCurveException; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * JWK Formatted EC Handler - * - * @author Jim Wigginton - */ -abstract class JWK extends Progenitor -{ - use Common; - - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - $key = parent::load($key, $password); - - switch ($key->kty) { - case 'EC': - switch ($key->crv) { - case 'P-256': - case 'P-384': - case 'P-521': - case 'secp256k1': - break; - default: - throw new UnsupportedCurveException('Only P-256, P-384, P-521 and secp256k1 curves are accepted (' . $key->crv . ' provided)'); - } - break; - case 'OKP': - switch ($key->crv) { - case 'Ed25519': - case 'Ed448': - break; - default: - throw new UnsupportedCurveException('Only Ed25519 and Ed448 curves are accepted (' . $key->crv . ' provided)'); - } - break; - default: - throw new \Exception('Only EC and OKP JWK keys are supported'); - } - - $curve = '\phpseclib3\Crypt\EC\Curves\\' . str_replace('P-', 'nistp', $key->crv); - $curve = new $curve(); - - if ($curve instanceof TwistedEdwardsCurve) { - $QA = self::extractPoint(Strings::base64url_decode($key->x), $curve); - if (!isset($key->d)) { - return compact('curve', 'QA'); - } - $arr = $curve->extractSecret(Strings::base64url_decode($key->d)); - return compact('curve', 'QA') + $arr; - } - - $QA = [ - $curve->convertInteger(new BigInteger(Strings::base64url_decode($key->x), 256)), - $curve->convertInteger(new BigInteger(Strings::base64url_decode($key->y), 256)) - ]; - - if (!$curve->verifyPoint($QA)) { - throw new \RuntimeException('Unable to verify that point exists on curve'); - } - - if (!isset($key->d)) { - return compact('curve', 'QA'); - } - - $dA = new BigInteger(Strings::base64url_decode($key->d), 256); - - $curve->rangeCheck($dA); - - return compact('curve', 'dA', 'QA'); - } - - /** - * Returns the alias that corresponds to a curve - * - * @return string - */ - private static function getAlias(BaseCurve $curve) - { - switch (true) { - case $curve instanceof secp256r1: - return 'P-256'; - case $curve instanceof secp384r1: - return 'P-384'; - case $curve instanceof secp521r1: - return 'P-521'; - case $curve instanceof secp256k1: - return 'secp256k1'; - } - - $reflect = new \ReflectionClass($curve); - $curveName = $reflect->isFinal() ? - $reflect->getParentClass()->getShortName() : - $reflect->getShortName(); - throw new UnsupportedCurveException("$curveName is not a supported curve"); - } - - /** - * Return the array superstructure for an EC public key - * - * @param BaseCurve $curve - * @param \phpseclib3\Math\Common\FiniteField\Integer[] $publicKey - * @return array - */ - private static function savePublicKeyHelper(BaseCurve $curve, array $publicKey) - { - if ($curve instanceof TwistedEdwardsCurve) { - return [ - 'kty' => 'OKP', - 'crv' => $curve instanceof Ed25519 ? 'Ed25519' : 'Ed448', - 'x' => Strings::base64url_encode($curve->encodePoint($publicKey)) - ]; - } - - return [ - 'kty' => 'EC', - 'crv' => self::getAlias($curve), - 'x' => Strings::base64url_encode($publicKey[0]->toBytes()), - 'y' => Strings::base64url_encode($publicKey[1]->toBytes()) - ]; - } - - /** - * Convert an EC public key to the appropriate format - * - * @param BaseCurve $curve - * @param \phpseclib3\Math\Common\FiniteField\Integer[] $publicKey - * @param array $options optional - * @return string - */ - public static function savePublicKey(BaseCurve $curve, array $publicKey, array $options = []) - { - $key = self::savePublicKeyHelper($curve, $publicKey); - - return self::wrapKey($key, $options); - } - - /** - * Convert a private key to the appropriate format. - * - * @param BigInteger $privateKey - * @param Ed25519 $curve - * @param \phpseclib3\Math\Common\FiniteField\Integer[] $publicKey - * @param string $secret optional - * @param string $password optional - * @param array $options optional - * @return string - */ - public static function savePrivateKey(BigInteger $privateKey, BaseCurve $curve, array $publicKey, $secret = null, $password = '', array $options = []) - { - $key = self::savePublicKeyHelper($curve, $publicKey); - $key['d'] = $curve instanceof TwistedEdwardsCurve ? $secret : $privateKey->toBytes(); - $key['d'] = Strings::base64url_encode($key['d']); - - return self::wrapKey($key, $options); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/MontgomeryPrivate.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/MontgomeryPrivate.php deleted file mode 100644 index e977cd3..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/MontgomeryPrivate.php +++ /dev/null @@ -1,101 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Formats\Keys; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Montgomery as MontgomeryCurve; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves\Curve25519; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves\Curve448; -use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedFormatException; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * Montgomery Curve Private Key Handler - * - * @author Jim Wigginton - */ -abstract class MontgomeryPrivate -{ - /** - * Is invisible flag - * - */ - const IS_INVISIBLE = true; - - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - switch (strlen($key)) { - case 32: - $curve = new Curve25519(); - break; - case 56: - $curve = new Curve448(); - break; - default: - throw new \LengthException('The only supported lengths are 32 and 56'); - } - - $components = ['curve' => $curve]; - $components['dA'] = new BigInteger($key, 256); - $curve->rangeCheck($components['dA']); - // note that EC::getEncodedCoordinates does some additional "magic" (it does strrev on the result) - $components['QA'] = $components['curve']->multiplyPoint($components['curve']->getBasePoint(), $components['dA']); - - return $components; - } - - /** - * Convert an EC public key to the appropriate format - * - * @param MontgomeryCurve $curve - * @param \phpseclib3\Math\Common\FiniteField\Integer[] $publicKey - * @return string - */ - public static function savePublicKey(MontgomeryCurve $curve, array $publicKey) - { - return strrev($publicKey[0]->toBytes()); - } - - /** - * Convert a private key to the appropriate format. - * - * @param BigInteger $privateKey - * @param MontgomeryCurve $curve - * @param \phpseclib3\Math\Common\FiniteField\Integer[] $publicKey - * @param string $secret optional - * @param string $password optional - * @return string - */ - public static function savePrivateKey(BigInteger $privateKey, MontgomeryCurve $curve, array $publicKey, $secret = null, $password = '') - { - if (!empty($password) && is_string($password)) { - throw new UnsupportedFormatException('MontgomeryPrivate private keys do not support encryption'); - } - - return $privateKey->toBytes(); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/MontgomeryPublic.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/MontgomeryPublic.php deleted file mode 100644 index 458913d..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/MontgomeryPublic.php +++ /dev/null @@ -1,71 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Formats\Keys; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Montgomery as MontgomeryCurve; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves\Curve25519; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves\Curve448; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * Montgomery Public Key Handler - * - * @author Jim Wigginton - */ -abstract class MontgomeryPublic -{ - /** - * Is invisible flag - * - */ - const IS_INVISIBLE = true; - - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - switch (strlen($key)) { - case 32: - $curve = new Curve25519(); - break; - case 56: - $curve = new Curve448(); - break; - default: - throw new \LengthException('The only supported lengths are 32 and 56'); - } - - $components = ['curve' => $curve]; - $components['QA'] = [$components['curve']->convertInteger(new BigInteger(strrev($key), 256))]; - - return $components; - } - - /** - * Convert an EC public key to the appropriate format - * - * @param MontgomeryCurve $curve - * @param \phpseclib3\Math\Common\FiniteField\Integer[] $publicKey - * @return string - */ - public static function savePublicKey(MontgomeryCurve $curve, array $publicKey) - { - return strrev($publicKey[0]->toBytes()); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/OpenSSH.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/OpenSSH.php deleted file mode 100644 index cc9be0b..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/OpenSSH.php +++ /dev/null @@ -1,209 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Formats\Keys; - -use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Keys\OpenSSH as Progenitor; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Base as BaseCurve; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves\Ed25519; -use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedCurveException; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * OpenSSH Formatted EC Key Handler - * - * @author Jim Wigginton - */ -abstract class OpenSSH extends Progenitor -{ - use Common; - - /** - * Supported Key Types - * - * @var array - */ - protected static $types = [ - 'ecdsa-sha2-nistp256', - 'ecdsa-sha2-nistp384', - 'ecdsa-sha2-nistp521', - 'ssh-ed25519' - ]; - - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - $parsed = parent::load($key, $password); - - if (isset($parsed['paddedKey'])) { - $paddedKey = $parsed['paddedKey']; - list($type) = Strings::unpackSSH2('s', $paddedKey); - if ($type != $parsed['type']) { - throw new \RuntimeException("The public and private keys are not of the same type ($type vs $parsed[type])"); - } - if ($type == 'ssh-ed25519') { - list(, $key, $comment) = Strings::unpackSSH2('sss', $paddedKey); - $key = libsodium::load($key); - $key['comment'] = $comment; - return $key; - } - list($curveName, $publicKey, $privateKey, $comment) = Strings::unpackSSH2('ssis', $paddedKey); - $curve = self::loadCurveByParam(['namedCurve' => $curveName]); - $curve->rangeCheck($privateKey); - return [ - 'curve' => $curve, - 'dA' => $privateKey, - 'QA' => self::extractPoint("\0$publicKey", $curve), - 'comment' => $comment - ]; - } - - if ($parsed['type'] == 'ssh-ed25519') { - if (Strings::shift($parsed['publicKey'], 4) != "\0\0\0\x20") { - throw new \RuntimeException('Length of ssh-ed25519 key should be 32'); - } - - $curve = new Ed25519(); - $qa = self::extractPoint($parsed['publicKey'], $curve); - } else { - list($curveName, $publicKey) = Strings::unpackSSH2('ss', $parsed['publicKey']); - $curveName = '\phpseclib3\Crypt\EC\Curves\\' . $curveName; - $curve = new $curveName(); - - $qa = self::extractPoint("\0" . $publicKey, $curve); - } - - return [ - 'curve' => $curve, - 'QA' => $qa, - 'comment' => $parsed['comment'] - ]; - } - - /** - * Returns the alias that corresponds to a curve - * - * @return string - */ - private static function getAlias(BaseCurve $curve) - { - self::initialize_static_variables(); - - $reflect = new \ReflectionClass($curve); - $name = $reflect->getShortName(); - - $oid = self::$curveOIDs[$name]; - $aliases = array_filter(self::$curveOIDs, function ($v) use ($oid) { - return $v == $oid; - }); - $aliases = array_keys($aliases); - - for ($i = 0; $i < count($aliases); $i++) { - if (in_array('ecdsa-sha2-' . $aliases[$i], self::$types)) { - $alias = $aliases[$i]; - break; - } - } - - if (!isset($alias)) { - throw new UnsupportedCurveException($name . ' is not a curve that the OpenSSH plugin supports'); - } - - return $alias; - } - - /** - * Convert an EC public key to the appropriate format - * - * @param BaseCurve $curve - * @param \phpseclib3\Math\Common\FiniteField\Integer[] $publicKey - * @param array $options optional - * @return string - */ - public static function savePublicKey(BaseCurve $curve, array $publicKey, array $options = []) - { - $comment = isset($options['comment']) ? $options['comment'] : self::$comment; - - if ($curve instanceof Ed25519) { - $key = Strings::packSSH2('ss', 'ssh-ed25519', $curve->encodePoint($publicKey)); - - if (isset($options['binary']) ? $options['binary'] : self::$binary) { - return $key; - } - - $key = 'ssh-ed25519 ' . base64_encode($key) . ' ' . $comment; - return $key; - } - - $alias = self::getAlias($curve); - - $points = "\4" . $publicKey[0]->toBytes() . $publicKey[1]->toBytes(); - $key = Strings::packSSH2('sss', 'ecdsa-sha2-' . $alias, $alias, $points); - - if (isset($options['binary']) ? $options['binary'] : self::$binary) { - return $key; - } - - $key = 'ecdsa-sha2-' . $alias . ' ' . base64_encode($key) . ' ' . $comment; - - return $key; - } - - /** - * Convert a private key to the appropriate format. - * - * @param BigInteger $privateKey - * @param Ed25519 $curve - * @param \phpseclib3\Math\Common\FiniteField\Integer[] $publicKey - * @param string $secret optional - * @param string $password optional - * @param array $options optional - * @return string - */ - public static function savePrivateKey(BigInteger $privateKey, BaseCurve $curve, array $publicKey, $secret = null, $password = '', array $options = []) - { - if ($curve instanceof Ed25519) { - if (!isset($secret)) { - throw new \RuntimeException('Private Key does not have a secret set'); - } - if (strlen($secret) != 32) { - throw new \RuntimeException('Private Key secret is not of the correct length'); - } - - $pubKey = $curve->encodePoint($publicKey); - - $publicKey = Strings::packSSH2('ss', 'ssh-ed25519', $pubKey); - $privateKey = Strings::packSSH2('sss', 'ssh-ed25519', $pubKey, $secret . $pubKey); - - return self::wrapPrivateKey($publicKey, $privateKey, $password, $options); - } - - $alias = self::getAlias($curve); - - $points = "\4" . $publicKey[0]->toBytes() . $publicKey[1]->toBytes(); - $publicKey = self::savePublicKey($curve, $publicKey, ['binary' => true]); - - $privateKey = Strings::packSSH2('sssi', 'ecdsa-sha2-' . $alias, $alias, $points, $privateKey); - - return self::wrapPrivateKey($publicKey, $privateKey, $password, $options); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PKCS1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PKCS1.php deleted file mode 100644 index d716db3..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PKCS1.php +++ /dev/null @@ -1,194 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Formats\Keys; - -use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Keys\PKCS1 as Progenitor; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Base as BaseCurve; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Montgomery as MontgomeryCurve; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\TwistedEdwards as TwistedEdwardsCurve; -use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedCurveException; -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; -use OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * "PKCS1" (RFC5915) Formatted EC Key Handler - * - * @author Jim Wigginton - */ -abstract class PKCS1 extends Progenitor -{ - use Common; - - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - self::initialize_static_variables(); - - if (!Strings::is_stringable($key)) { - throw new \UnexpectedValueException('Key should be a string - not a ' . gettype($key)); - } - - if (strpos($key, 'BEGIN EC PARAMETERS') && strpos($key, 'BEGIN EC PRIVATE KEY')) { - $components = []; - - preg_match('#-*BEGIN EC PRIVATE KEY-*[^-]*-*END EC PRIVATE KEY-*#s', $key, $matches); - $decoded = parent::load($matches[0], $password); - $decoded = ASN1::decodeBER($decoded); - if (!$decoded) { - throw new \RuntimeException('Unable to decode BER'); - } - - $ecPrivate = ASN1::asn1map($decoded[0], Maps\ECPrivateKey::MAP); - if (!is_array($ecPrivate)) { - throw new \RuntimeException('Unable to perform ASN1 mapping'); - } - - if (isset($ecPrivate['parameters'])) { - $components['curve'] = self::loadCurveByParam($ecPrivate['parameters']); - } - - preg_match('#-*BEGIN EC PARAMETERS-*[^-]*-*END EC PARAMETERS-*#s', $key, $matches); - $decoded = parent::load($matches[0], ''); - $decoded = ASN1::decodeBER($decoded); - if (!$decoded) { - throw new \RuntimeException('Unable to decode BER'); - } - $ecParams = ASN1::asn1map($decoded[0], Maps\ECParameters::MAP); - if (!is_array($ecParams)) { - throw new \RuntimeException('Unable to perform ASN1 mapping'); - } - $ecParams = self::loadCurveByParam($ecParams); - - // comparing $ecParams and $components['curve'] directly won't work because they'll have different Math\Common\FiniteField classes - // even if the modulo is the same - if (isset($components['curve']) && self::encodeParameters($ecParams, false, []) != self::encodeParameters($components['curve'], false, [])) { - throw new \RuntimeException('EC PARAMETERS does not correspond to EC PRIVATE KEY'); - } - - if (!isset($components['curve'])) { - $components['curve'] = $ecParams; - } - - $components['dA'] = new BigInteger($ecPrivate['privateKey'], 256); - $components['curve']->rangeCheck($components['dA']); - $components['QA'] = isset($ecPrivate['publicKey']) ? - self::extractPoint($ecPrivate['publicKey'], $components['curve']) : - $components['curve']->multiplyPoint($components['curve']->getBasePoint(), $components['dA']); - - return $components; - } - - $key = parent::load($key, $password); - - $decoded = ASN1::decodeBER($key); - if (!$decoded) { - throw new \RuntimeException('Unable to decode BER'); - } - - $key = ASN1::asn1map($decoded[0], Maps\ECParameters::MAP); - if (is_array($key)) { - return ['curve' => self::loadCurveByParam($key)]; - } - - $key = ASN1::asn1map($decoded[0], Maps\ECPrivateKey::MAP); - if (!is_array($key)) { - throw new \RuntimeException('Unable to perform ASN1 mapping'); - } - if (!isset($key['parameters'])) { - throw new \RuntimeException('Key cannot be loaded without parameters'); - } - - $components = []; - $components['curve'] = self::loadCurveByParam($key['parameters']); - $components['dA'] = new BigInteger($key['privateKey'], 256); - $components['QA'] = isset($ecPrivate['publicKey']) ? - self::extractPoint($ecPrivate['publicKey'], $components['curve']) : - $components['curve']->multiplyPoint($components['curve']->getBasePoint(), $components['dA']); - - return $components; - } - - /** - * Convert EC parameters to the appropriate format - * - * @return string - */ - public static function saveParameters(BaseCurve $curve, array $options = []) - { - self::initialize_static_variables(); - - if ($curve instanceof TwistedEdwardsCurve || $curve instanceof MontgomeryCurve) { - throw new UnsupportedCurveException('TwistedEdwards and Montgomery Curves are not supported'); - } - - $key = self::encodeParameters($curve, false, $options); - - return "-----BEGIN EC PARAMETERS-----\r\n" . - chunk_split(Strings::base64_encode($key), 64) . - "-----END EC PARAMETERS-----\r\n"; - } - - /** - * Convert a private key to the appropriate format. - * - * @param BigInteger $privateKey - * @param BaseCurve $curve - * @param \phpseclib3\Math\Common\FiniteField\Integer[] $publicKey - * @param string $secret optional - * @param string $password optional - * @param array $options optional - * @return string - */ - public static function savePrivateKey(BigInteger $privateKey, BaseCurve $curve, array $publicKey, $secret = null, $password = '', array $options = []) - { - self::initialize_static_variables(); - - if ($curve instanceof TwistedEdwardsCurve || $curve instanceof MontgomeryCurve) { - throw new UnsupportedCurveException('TwistedEdwards Curves are not supported'); - } - - $publicKey = "\4" . $publicKey[0]->toBytes() . $publicKey[1]->toBytes(); - - $key = [ - 'version' => 'ecPrivkeyVer1', - 'privateKey' => $privateKey->toBytes(), - 'parameters' => new ASN1\Element(self::encodeParameters($curve)), - 'publicKey' => "\0" . $publicKey - ]; - - $key = ASN1::encodeDER($key, Maps\ECPrivateKey::MAP); - - return self::wrapPrivateKey($key, 'EC', $password, $options); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PKCS8.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PKCS8.php deleted file mode 100644 index 770b6ec..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PKCS8.php +++ /dev/null @@ -1,237 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Formats\Keys; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Keys\PKCS8 as Progenitor; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Base as BaseCurve; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Montgomery as MontgomeryCurve; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\TwistedEdwards as TwistedEdwardsCurve; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves\Ed25519; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves\Ed448; -use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedCurveException; -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; -use OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * PKCS#8 Formatted EC Key Handler - * - * @author Jim Wigginton - */ -abstract class PKCS8 extends Progenitor -{ - use Common; - - /** - * OID Name - * - * @var array - */ - const OID_NAME = ['id-ecPublicKey', 'id-Ed25519', 'id-Ed448']; - - /** - * OID Value - * - * @var string - */ - const OID_VALUE = ['1.2.840.10045.2.1', '1.3.101.112', '1.3.101.113']; - - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - // initialize_static_variables() is defined in both the trait and the parent class - // when it's defined in two places it's the traits one that's called - // the parent one is needed, as well, but the parent one is called by other methods - // in the parent class as needed and in the context of the parent it's the parent - // one that's called - self::initialize_static_variables(); - - $key = parent::load($key, $password); - - $type = isset($key['privateKey']) ? 'privateKey' : 'publicKey'; - - switch ($key[$type . 'Algorithm']['algorithm']) { - case 'id-Ed25519': - case 'id-Ed448': - return self::loadEdDSA($key); - } - - $decoded = ASN1::decodeBER($key[$type . 'Algorithm']['parameters']->element); - if (!$decoded) { - throw new \RuntimeException('Unable to decode BER'); - } - $params = ASN1::asn1map($decoded[0], Maps\ECParameters::MAP); - if (!$params) { - throw new \RuntimeException('Unable to decode the parameters using Maps\ECParameters'); - } - - $components = []; - $components['curve'] = self::loadCurveByParam($params); - - if ($type == 'publicKey') { - $components['QA'] = self::extractPoint("\0" . $key['publicKey'], $components['curve']); - - return $components; - } - - $decoded = ASN1::decodeBER($key['privateKey']); - if (!$decoded) { - throw new \RuntimeException('Unable to decode BER'); - } - $key = ASN1::asn1map($decoded[0], Maps\ECPrivateKey::MAP); - if (isset($key['parameters']) && $params != $key['parameters']) { - throw new \RuntimeException('The PKCS8 parameter field does not match the private key parameter field'); - } - - $components['dA'] = new BigInteger($key['privateKey'], 256); - $components['curve']->rangeCheck($components['dA']); - $components['QA'] = isset($key['publicKey']) ? - self::extractPoint($key['publicKey'], $components['curve']) : - $components['curve']->multiplyPoint($components['curve']->getBasePoint(), $components['dA']); - - return $components; - } - - /** - * Break a public or private EdDSA key down into its constituent components - * - * @return array - */ - private static function loadEdDSA(array $key) - { - $components = []; - - if (isset($key['privateKey'])) { - $components['curve'] = $key['privateKeyAlgorithm']['algorithm'] == 'id-Ed25519' ? new Ed25519() : new Ed448(); - $expected = chr(ASN1::TYPE_OCTET_STRING) . ASN1::encodeLength($components['curve']::SIZE); - if (substr($key['privateKey'], 0, 2) != $expected) { - throw new \RuntimeException( - 'The first two bytes of the ' . - $key['privateKeyAlgorithm']['algorithm'] . - ' private key field should be 0x' . bin2hex($expected) - ); - } - $arr = $components['curve']->extractSecret(substr($key['privateKey'], 2)); - $components['dA'] = $arr['dA']; - $components['secret'] = $arr['secret']; - } - - if (isset($key['publicKey'])) { - if (!isset($components['curve'])) { - $components['curve'] = $key['publicKeyAlgorithm']['algorithm'] == 'id-Ed25519' ? new Ed25519() : new Ed448(); - } - - $components['QA'] = self::extractPoint($key['publicKey'], $components['curve']); - } - - if (isset($key['privateKey']) && !isset($components['QA'])) { - $components['QA'] = $components['curve']->multiplyPoint($components['curve']->getBasePoint(), $components['dA']); - } - - return $components; - } - - /** - * Convert an EC public key to the appropriate format - * - * @param BaseCurve $curve - * @param \phpseclib3\Math\Common\FiniteField\Integer[] $publicKey - * @param array $options optional - * @return string - */ - public static function savePublicKey(BaseCurve $curve, array $publicKey, array $options = []) - { - self::initialize_static_variables(); - - if ($curve instanceof MontgomeryCurve) { - throw new UnsupportedCurveException('Montgomery Curves are not supported'); - } - - if ($curve instanceof TwistedEdwardsCurve) { - return self::wrapPublicKey( - $curve->encodePoint($publicKey), - null, - $curve instanceof Ed25519 ? 'id-Ed25519' : 'id-Ed448', - $options - ); - } - - $params = new ASN1\Element(self::encodeParameters($curve, false, $options)); - - $key = "\4" . $publicKey[0]->toBytes() . $publicKey[1]->toBytes(); - - return self::wrapPublicKey($key, $params, 'id-ecPublicKey', $options); - } - - /** - * Convert a private key to the appropriate format. - * - * @param BigInteger $privateKey - * @param BaseCurve $curve - * @param \phpseclib3\Math\Common\FiniteField\Integer[] $publicKey - * @param string $secret optional - * @param string $password optional - * @param array $options optional - * @return string - */ - public static function savePrivateKey(BigInteger $privateKey, BaseCurve $curve, array $publicKey, $secret = null, $password = '', array $options = []) - { - self::initialize_static_variables(); - - if ($curve instanceof MontgomeryCurve) { - throw new UnsupportedCurveException('Montgomery Curves are not supported'); - } - - if ($curve instanceof TwistedEdwardsCurve) { - return self::wrapPrivateKey( - chr(ASN1::TYPE_OCTET_STRING) . ASN1::encodeLength($curve::SIZE) . $secret, - [], - null, - $password, - $curve instanceof Ed25519 ? 'id-Ed25519' : 'id-Ed448' - ); - } - - $publicKey = "\4" . $publicKey[0]->toBytes() . $publicKey[1]->toBytes(); - - $params = new ASN1\Element(self::encodeParameters($curve, false, $options)); - - $key = [ - 'version' => 'ecPrivkeyVer1', - 'privateKey' => $privateKey->toBytes(), - //'parameters' => $params, - 'publicKey' => "\0" . $publicKey - ]; - - $key = ASN1::encodeDER($key, Maps\ECPrivateKey::MAP); - - return self::wrapPrivateKey($key, [], $params, $password, 'id-ecPublicKey', '', $options); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PuTTY.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PuTTY.php deleted file mode 100644 index bf98f5a..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/PuTTY.php +++ /dev/null @@ -1,138 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Formats\Keys; - -use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Keys\PuTTY as Progenitor; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Base as BaseCurve; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\TwistedEdwards as TwistedEdwardsCurve; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * PuTTY Formatted EC Key Handler - * - * @author Jim Wigginton - */ -abstract class PuTTY extends Progenitor -{ - use Common; - - /** - * Public Handler - * - * @var string - */ - const PUBLIC_HANDLER = '\OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Formats\Keys\OpenSSH'; - - /** - * Supported Key Types - * - * @var array - */ - protected static $types = [ - 'ecdsa-sha2-nistp256', - 'ecdsa-sha2-nistp384', - 'ecdsa-sha2-nistp521', - 'ssh-ed25519' - ]; - - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - $components = parent::load($key, $password); - if (!isset($components['private'])) { - return $components; - } - - $private = $components['private']; - - $temp = Strings::base64_encode(Strings::packSSH2('s', $components['type']) . $components['public']); - $components = OpenSSH::load($components['type'] . ' ' . $temp . ' ' . $components['comment']); - - if ($components['curve'] instanceof TwistedEdwardsCurve) { - if (Strings::shift($private, 4) != "\0\0\0\x20") { - throw new \RuntimeException('Length of ssh-ed25519 key should be 32'); - } - $arr = $components['curve']->extractSecret($private); - $components['dA'] = $arr['dA']; - $components['secret'] = $arr['secret']; - } else { - list($components['dA']) = Strings::unpackSSH2('i', $private); - $components['curve']->rangeCheck($components['dA']); - } - - return $components; - } - - /** - * Convert a private key to the appropriate format. - * - * @param BigInteger $privateKey - * @param BaseCurve $curve - * @param \phpseclib3\Math\Common\FiniteField\Integer[] $publicKey - * @param string $secret optional - * @param string $password optional - * @param array $options optional - * @return string - */ - public static function savePrivateKey(BigInteger $privateKey, BaseCurve $curve, array $publicKey, $secret = null, $password = false, array $options = []) - { - self::initialize_static_variables(); - - $public = explode(' ', OpenSSH::savePublicKey($curve, $publicKey)); - $name = $public[0]; - $public = Strings::base64_decode($public[1]); - list(, $length) = unpack('N', Strings::shift($public, 4)); - Strings::shift($public, $length); - - // PuTTY pads private keys with a null byte per the following: - // https://github.com/github/putty/blob/a3d14d77f566a41fc61dfdc5c2e0e384c9e6ae8b/sshecc.c#L1926 - if (!$curve instanceof TwistedEdwardsCurve) { - $private = $privateKey->toBytes(); - if (!(strlen($privateKey->toBits()) & 7)) { - $private = "\0$private"; - } - } - - $private = $curve instanceof TwistedEdwardsCurve ? - Strings::packSSH2('s', $secret) : - Strings::packSSH2('s', $private); - - return self::wrapPrivateKey($public, $private, $name, $password, $options); - } - - /** - * Convert an EC public key to the appropriate format - * - * @param BaseCurve $curve - * @param \phpseclib3\Math\Common\FiniteField[] $publicKey - * @return string - */ - public static function savePublicKey(BaseCurve $curve, array $publicKey) - { - $public = explode(' ', OpenSSH::savePublicKey($curve, $publicKey)); - $type = $public[0]; - $public = Strings::base64_decode($public[1]); - list(, $length) = unpack('N', Strings::shift($public, 4)); - Strings::shift($public, $length); - - return self::wrapPublicKey($public, $type); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/XML.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/XML.php deleted file mode 100644 index 61ba09c..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/XML.php +++ /dev/null @@ -1,486 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Formats\Keys; - -use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Base as BaseCurve; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Montgomery as MontgomeryCurve; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Prime as PrimeCurve; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\TwistedEdwards as TwistedEdwardsCurve; -use OCA\Libresign\Vendor\phpseclib3\Exception\BadConfigurationException; -use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedCurveException; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * XML Formatted EC Key Handler - * - * @author Jim Wigginton - */ -abstract class XML -{ - use Common; - - /** - * Default namespace - * - * @var string - */ - private static $namespace; - - /** - * Flag for using RFC4050 syntax - * - * @var bool - */ - private static $rfc4050 = false; - - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - self::initialize_static_variables(); - - if (!Strings::is_stringable($key)) { - throw new \UnexpectedValueException('Key should be a string - not a ' . gettype($key)); - } - - if (!class_exists('DOMDocument')) { - throw new BadConfigurationException('The dom extension is not setup correctly on this system'); - } - - $use_errors = libxml_use_internal_errors(true); - - if (substr($key, 0, 5) != '' . $key . ''; - } - - $temp = self::isolateNamespace($key, 'http://www.w3.org/2009/xmldsig11#'); - if ($temp) { - $key = $temp; - } - - $temp = self::isolateNamespace($key, 'http://www.w3.org/2001/04/xmldsig-more#'); - if ($temp) { - $key = $temp; - } - - $dom = new \DOMDocument(); - - if (!$dom->loadXML($key)) { - libxml_use_internal_errors($use_errors); - throw new \UnexpectedValueException('Key does not appear to contain XML'); - } - $xpath = new \DOMXPath($dom); - libxml_use_internal_errors($use_errors); - $curve = self::loadCurveByParam($xpath); - - $pubkey = self::query($xpath, 'publickey', 'Public Key is not present'); - - $QA = self::query($xpath, 'ecdsakeyvalue')->length ? - self::extractPointRFC4050($xpath, $curve) : - self::extractPoint("\0" . $pubkey, $curve); - - libxml_use_internal_errors($use_errors); - - return compact('curve', 'QA'); - } - - /** - * Case-insensitive xpath query - * - * @param \DOMXPath $xpath - * @param string $name - * @param string $error optional - * @param bool $decode optional - * @return \DOMNodeList - */ - private static function query(\DOMXPath $xpath, $name, $error = null, $decode = true) - { - $query = '/'; - $names = explode('/', $name); - foreach ($names as $name) { - $query .= "/*[translate(local-name(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')='$name']"; - } - $result = $xpath->query($query); - if (!isset($error)) { - return $result; - } - - if (!$result->length) { - throw new \RuntimeException($error); - } - return $decode ? self::decodeValue($result->item(0)->textContent) : $result->item(0)->textContent; - } - - /** - * Finds the first element in the relevant namespace, strips the namespacing and returns the XML for that element. - * - * @param string $xml - * @param string $ns - */ - private static function isolateNamespace($xml, $ns) - { - $dom = new \DOMDocument(); - if (!$dom->loadXML($xml)) { - return false; - } - $xpath = new \DOMXPath($dom); - $nodes = $xpath->query("//*[namespace::*[.='$ns'] and not(../namespace::*[.='$ns'])]"); - if (!$nodes->length) { - return false; - } - $node = $nodes->item(0); - $ns_name = $node->lookupPrefix($ns); - if ($ns_name) { - $node->removeAttributeNS($ns, $ns_name); - } - return $dom->saveXML($node); - } - - /** - * Decodes the value - * - * @param string $value - */ - private static function decodeValue($value) - { - return Strings::base64_decode(str_replace(["\r", "\n", ' ', "\t"], '', $value)); - } - - /** - * Extract points from an XML document - * - * @param \DOMXPath $xpath - * @param BaseCurve $curve - * @return object[] - */ - private static function extractPointRFC4050(\DOMXPath $xpath, BaseCurve $curve) - { - $x = self::query($xpath, 'publickey/x'); - $y = self::query($xpath, 'publickey/y'); - if (!$x->length || !$x->item(0)->hasAttribute('Value')) { - throw new \RuntimeException('Public Key / X coordinate not found'); - } - if (!$y->length || !$y->item(0)->hasAttribute('Value')) { - throw new \RuntimeException('Public Key / Y coordinate not found'); - } - $point = [ - $curve->convertInteger(new BigInteger($x->item(0)->getAttribute('Value'))), - $curve->convertInteger(new BigInteger($y->item(0)->getAttribute('Value'))) - ]; - if (!$curve->verifyPoint($point)) { - throw new \RuntimeException('Unable to verify that point exists on curve'); - } - return $point; - } - - /** - * Returns an instance of \phpseclib3\Crypt\EC\BaseCurves\Base based - * on the curve parameters - * - * @param \DomXPath $xpath - * @return BaseCurve|false - */ - private static function loadCurveByParam(\DOMXPath $xpath) - { - $namedCurve = self::query($xpath, 'namedcurve'); - if ($namedCurve->length == 1) { - $oid = $namedCurve->item(0)->getAttribute('URN'); - $oid = preg_replace('#[^\d.]#', '', $oid); - $name = array_search($oid, self::$curveOIDs); - if ($name === false) { - throw new UnsupportedCurveException('Curve with OID of ' . $oid . ' is not supported'); - } - - $curve = '\phpseclib3\Crypt\EC\Curves\\' . $name; - if (!class_exists($curve)) { - throw new UnsupportedCurveException('Named Curve of ' . $name . ' is not supported'); - } - return new $curve(); - } - - $params = self::query($xpath, 'explicitparams'); - if ($params->length) { - return self::loadCurveByParamRFC4050($xpath); - } - - $params = self::query($xpath, 'ecparameters'); - if (!$params->length) { - throw new \RuntimeException('No parameters are present'); - } - - $fieldTypes = [ - 'prime-field' => ['fieldid/prime/p'], - 'gnb' => ['fieldid/gnb/m'], - 'tnb' => ['fieldid/tnb/k'], - 'pnb' => ['fieldid/pnb/k1', 'fieldid/pnb/k2', 'fieldid/pnb/k3'], - 'unknown' => [] - ]; - - foreach ($fieldTypes as $type => $queries) { - foreach ($queries as $query) { - $result = self::query($xpath, $query); - if (!$result->length) { - continue 2; - } - $param = preg_replace('#.*/#', '', $query); - $$param = self::decodeValue($result->item(0)->textContent); - } - break; - } - - $a = self::query($xpath, 'curve/a', 'A coefficient is not present'); - $b = self::query($xpath, 'curve/b', 'B coefficient is not present'); - $base = self::query($xpath, 'base', 'Base point is not present'); - $order = self::query($xpath, 'order', 'Order is not present'); - - switch ($type) { - case 'prime-field': - $curve = new PrimeCurve(); - $curve->setModulo(new BigInteger($p, 256)); - $curve->setCoefficients( - new BigInteger($a, 256), - new BigInteger($b, 256) - ); - $point = self::extractPoint("\0" . $base, $curve); - $curve->setBasePoint(...$point); - $curve->setOrder(new BigInteger($order, 256)); - return $curve; - case 'gnb': - case 'tnb': - case 'pnb': - default: - throw new UnsupportedCurveException('Field Type of ' . $type . ' is not supported'); - } - } - - /** - * Returns an instance of \phpseclib3\Crypt\EC\BaseCurves\Base based - * on the curve parameters - * - * @param \DomXPath $xpath - * @return BaseCurve|false - */ - private static function loadCurveByParamRFC4050(\DOMXPath $xpath) - { - $fieldTypes = [ - 'prime-field' => ['primefieldparamstype/p'], - 'unknown' => [] - ]; - - foreach ($fieldTypes as $type => $queries) { - foreach ($queries as $query) { - $result = self::query($xpath, $query); - if (!$result->length) { - continue 2; - } - $param = preg_replace('#.*/#', '', $query); - $$param = $result->item(0)->textContent; - } - break; - } - - $a = self::query($xpath, 'curveparamstype/a', 'A coefficient is not present', false); - $b = self::query($xpath, 'curveparamstype/b', 'B coefficient is not present', false); - $x = self::query($xpath, 'basepointparams/basepoint/ecpointtype/x', 'Base Point X is not present', false); - $y = self::query($xpath, 'basepointparams/basepoint/ecpointtype/y', 'Base Point Y is not present', false); - $order = self::query($xpath, 'order', 'Order is not present', false); - - switch ($type) { - case 'prime-field': - $curve = new PrimeCurve(); - - $p = str_replace(["\r", "\n", ' ', "\t"], '', $p); - $curve->setModulo(new BigInteger($p)); - - $a = str_replace(["\r", "\n", ' ', "\t"], '', $a); - $b = str_replace(["\r", "\n", ' ', "\t"], '', $b); - $curve->setCoefficients( - new BigInteger($a), - new BigInteger($b) - ); - - $x = str_replace(["\r", "\n", ' ', "\t"], '', $x); - $y = str_replace(["\r", "\n", ' ', "\t"], '', $y); - $curve->setBasePoint( - new BigInteger($x), - new BigInteger($y) - ); - - $order = str_replace(["\r", "\n", ' ', "\t"], '', $order); - $curve->setOrder(new BigInteger($order)); - return $curve; - default: - throw new UnsupportedCurveException('Field Type of ' . $type . ' is not supported'); - } - } - - /** - * Sets the namespace. dsig11 is the most common one. - * - * Set to null to unset. Used only for creating public keys. - * - * @param string $namespace - */ - public static function setNamespace($namespace) - { - self::$namespace = $namespace; - } - - /** - * Uses the XML syntax specified in https://tools.ietf.org/html/rfc4050 - */ - public static function enableRFC4050Syntax() - { - self::$rfc4050 = true; - } - - /** - * Uses the XML syntax specified in https://www.w3.org/TR/xmldsig-core/#sec-ECParameters - */ - public static function disableRFC4050Syntax() - { - self::$rfc4050 = false; - } - - /** - * Convert a public key to the appropriate format - * - * @param BaseCurve $curve - * @param \phpseclib3\Math\Common\FiniteField\Integer[] $publicKey - * @param array $options optional - * @return string - */ - public static function savePublicKey(BaseCurve $curve, array $publicKey, array $options = []) - { - self::initialize_static_variables(); - - if ($curve instanceof TwistedEdwardsCurve || $curve instanceof MontgomeryCurve) { - throw new UnsupportedCurveException('TwistedEdwards and Montgomery Curves are not supported'); - } - - if (empty(static::$namespace)) { - $pre = $post = ''; - } else { - $pre = static::$namespace . ':'; - $post = ':' . static::$namespace; - } - - if (self::$rfc4050) { - return '<' . $pre . 'ECDSAKeyValue xmlns' . $post . '="http://www.w3.org/2001/04/xmldsig-more#">' . "\r\n" . - self::encodeXMLParameters($curve, $pre, $options) . "\r\n" . - '<' . $pre . 'PublicKey>' . "\r\n" . - '<' . $pre . 'X Value="' . $publicKey[0] . '" />' . "\r\n" . - '<' . $pre . 'Y Value="' . $publicKey[1] . '" />' . "\r\n" . - '' . "\r\n" . - ''; - } - - $publicKey = "\4" . $publicKey[0]->toBytes() . $publicKey[1]->toBytes(); - - return '<' . $pre . 'ECDSAKeyValue xmlns' . $post . '="http://www.w3.org/2009/xmldsig11#">' . "\r\n" . - self::encodeXMLParameters($curve, $pre, $options) . "\r\n" . - '<' . $pre . 'PublicKey>' . Strings::base64_encode($publicKey) . '' . "\r\n" . - ''; - } - - /** - * Encode Parameters - * - * @param BaseCurve $curve - * @param string $pre - * @param array $options optional - * @return string|false - */ - private static function encodeXMLParameters(BaseCurve $curve, $pre, array $options = []) - { - $result = self::encodeParameters($curve, true, $options); - - if (isset($result['namedCurve'])) { - $namedCurve = '<' . $pre . 'NamedCurve URI="urn:oid:' . self::$curveOIDs[$result['namedCurve']] . '" />'; - return self::$rfc4050 ? - '' . str_replace('URI', 'URN', $namedCurve) . '' : - $namedCurve; - } - - if (self::$rfc4050) { - $xml = '<' . $pre . 'ExplicitParams>' . "\r\n" . - '<' . $pre . 'FieldParams>' . "\r\n"; - $temp = $result['specifiedCurve']; - switch ($temp['fieldID']['fieldType']) { - case 'prime-field': - $xml .= '<' . $pre . 'PrimeFieldParamsType>' . "\r\n" . - '<' . $pre . 'P>' . $temp['fieldID']['parameters'] . '' . "\r\n" . - '' . "\r\n"; - $a = $curve->getA(); - $b = $curve->getB(); - list($x, $y) = $curve->getBasePoint(); - break; - default: - throw new UnsupportedCurveException('Field Type of ' . $temp['fieldID']['fieldType'] . ' is not supported'); - } - $xml .= '' . "\r\n" . - '<' . $pre . 'CurveParamsType>' . "\r\n" . - '<' . $pre . 'A>' . $a . '' . "\r\n" . - '<' . $pre . 'B>' . $b . '' . "\r\n" . - '' . "\r\n" . - '<' . $pre . 'BasePointParams>' . "\r\n" . - '<' . $pre . 'BasePoint>' . "\r\n" . - '<' . $pre . 'ECPointType>' . "\r\n" . - '<' . $pre . 'X>' . $x . '' . "\r\n" . - '<' . $pre . 'Y>' . $y . '' . "\r\n" . - '' . "\r\n" . - '' . "\r\n" . - '<' . $pre . 'Order>' . $curve->getOrder() . '' . "\r\n" . - '' . "\r\n" . - '' . "\r\n"; - - return $xml; - } - - if (isset($result['specifiedCurve'])) { - $xml = '<' . $pre . 'ECParameters>' . "\r\n" . - '<' . $pre . 'FieldID>' . "\r\n"; - $temp = $result['specifiedCurve']; - switch ($temp['fieldID']['fieldType']) { - case 'prime-field': - $xml .= '<' . $pre . 'Prime>' . "\r\n" . - '<' . $pre . 'P>' . Strings::base64_encode($temp['fieldID']['parameters']->toBytes()) . '' . "\r\n" . - '' . "\r\n" ; - break; - default: - throw new UnsupportedCurveException('Field Type of ' . $temp['fieldID']['fieldType'] . ' is not supported'); - } - $xml .= '' . "\r\n" . - '<' . $pre . 'Curve>' . "\r\n" . - '<' . $pre . 'A>' . Strings::base64_encode($temp['curve']['a']) . '' . "\r\n" . - '<' . $pre . 'B>' . Strings::base64_encode($temp['curve']['b']) . '' . "\r\n" . - '' . "\r\n" . - '<' . $pre . 'Base>' . Strings::base64_encode($temp['base']) . '' . "\r\n" . - '<' . $pre . 'Order>' . Strings::base64_encode($temp['order']) . '' . "\r\n" . - ''; - return $xml; - } - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/libsodium.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/libsodium.php deleted file mode 100644 index 21203be..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Keys/libsodium.php +++ /dev/null @@ -1,116 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Formats\Keys; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves\Ed25519; -use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedFormatException; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * libsodium Key Handler - * - * @author Jim Wigginton - */ -abstract class libsodium -{ - use Common; - - /** - * Is invisible flag - * - */ - const IS_INVISIBLE = true; - - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - switch (strlen($key)) { - case 32: - $public = $key; - break; - case 64: - $private = substr($key, 0, 32); - $public = substr($key, -32); - break; - case 96: - $public = substr($key, -32); - if (substr($key, 32, 32) != $public) { - throw new \RuntimeException('Keys with 96 bytes should have the 2nd and 3rd set of 32 bytes match'); - } - $private = substr($key, 0, 32); - break; - default: - throw new \RuntimeException('libsodium keys need to either be 32 bytes long, 64 bytes long or 96 bytes long'); - } - - $curve = new Ed25519(); - $components = ['curve' => $curve]; - if (isset($private)) { - $arr = $curve->extractSecret($private); - $components['dA'] = $arr['dA']; - $components['secret'] = $arr['secret']; - } - $components['QA'] = isset($public) ? - self::extractPoint($public, $curve) : - $curve->multiplyPoint($curve->getBasePoint(), $components['dA']); - - return $components; - } - - /** - * Convert an EC public key to the appropriate format - * - * @param Ed25519 $curve - * @param \phpseclib3\Math\Common\FiniteField\Integer[] $publicKey - * @return string - */ - public static function savePublicKey(Ed25519 $curve, array $publicKey) - { - return $curve->encodePoint($publicKey); - } - - /** - * Convert a private key to the appropriate format. - * - * @param BigInteger $privateKey - * @param Ed25519 $curve - * @param \phpseclib3\Math\Common\FiniteField\Integer[] $publicKey - * @param string $secret optional - * @param string $password optional - * @return string - */ - public static function savePrivateKey(BigInteger $privateKey, Ed25519 $curve, array $publicKey, $secret = null, $password = '') - { - if (!isset($secret)) { - throw new \RuntimeException('Private Key does not have a secret set'); - } - if (strlen($secret) != 32) { - throw new \RuntimeException('Private Key secret is not of the correct length'); - } - if (!empty($password) && is_string($password)) { - throw new UnsupportedFormatException('libsodium private keys do not support encryption'); - } - return $secret . $curve->encodePoint($publicKey); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/ASN1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/ASN1.php deleted file mode 100644 index 8fd9031..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/ASN1.php +++ /dev/null @@ -1,62 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Formats\Signature; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1 as Encoder; -use OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps\EcdsaSigValue; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * ASN1 Signature Handler - * - * @author Jim Wigginton - */ -abstract class ASN1 -{ - /** - * Loads a signature - * - * @param string $sig - * @return array - */ - public static function load($sig) - { - if (!is_string($sig)) { - return false; - } - - $decoded = Encoder::decodeBER($sig); - if (empty($decoded)) { - return false; - } - $components = Encoder::asn1map($decoded[0], EcdsaSigValue::MAP); - - return $components; - } - - /** - * Returns a signature in the appropriate format - * - * @param BigInteger $r - * @param BigInteger $s - * @return string - */ - public static function save(BigInteger $r, BigInteger $s) - { - return Encoder::encodeDER(compact('r', 's'), EcdsaSigValue::MAP); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/IEEE.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/IEEE.php deleted file mode 100644 index 6cba666..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/IEEE.php +++ /dev/null @@ -1,68 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Formats\Signature; - -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * ASN1 Signature Handler - * - * @author Jim Wigginton - */ -abstract class IEEE -{ - /** - * Loads a signature - * - * @param string $sig - * @return array - */ - public static function load($sig) - { - if (!is_string($sig)) { - return false; - } - - $len = strlen($sig); - if ($len & 1) { - return false; - } - - $r = new BigInteger(substr($sig, 0, $len >> 1), 256); - $s = new BigInteger(substr($sig, $len >> 1), 256); - - return compact('r', 's'); - } - - /** - * Returns a signature in the appropriate format - * - * @param BigInteger $r - * @param BigInteger $s - * @param string $curve - * @param int $length - * @return string - */ - public static function save(BigInteger $r, BigInteger $s, $curve, $length) - { - $r = $r->toBytes(); - $s = $s->toBytes(); - $length = (int) ceil($length / 8); - return str_pad($r, $length, "\0", STR_PAD_LEFT) . str_pad($s, $length, "\0", STR_PAD_LEFT); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/Raw.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/Raw.php deleted file mode 100644 index c95106c..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/Raw.php +++ /dev/null @@ -1,25 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Formats\Signature; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Signature\Raw as Progenitor; - -/** - * Raw DSA Signature Handler - * - * @author Jim Wigginton - */ -abstract class Raw extends Progenitor -{ -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/SSH2.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/SSH2.php deleted file mode 100644 index 9b3033b..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Formats/Signature/SSH2.php +++ /dev/null @@ -1,94 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Formats\Signature; - -use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * SSH2 Signature Handler - * - * @author Jim Wigginton - */ -abstract class SSH2 -{ - /** - * Loads a signature - * - * @param string $sig - * @return mixed - */ - public static function load($sig) - { - if (!is_string($sig)) { - return false; - } - - $result = Strings::unpackSSH2('ss', $sig); - if ($result === false) { - return false; - } - list($type, $blob) = $result; - switch ($type) { - // see https://tools.ietf.org/html/rfc5656#section-3.1.2 - case 'ecdsa-sha2-nistp256': - case 'ecdsa-sha2-nistp384': - case 'ecdsa-sha2-nistp521': - break; - default: - return false; - } - - $result = Strings::unpackSSH2('ii', $blob); - if ($result === false) { - return false; - } - - return [ - 'r' => $result[0], - 's' => $result[1] - ]; - } - - /** - * Returns a signature in the appropriate format - * - * @param BigInteger $r - * @param BigInteger $s - * @param string $curve - * @return string - */ - public static function save(BigInteger $r, BigInteger $s, $curve) - { - switch ($curve) { - case 'secp256r1': - $curve = 'nistp256'; - break; - case 'secp384r1': - $curve = 'nistp384'; - break; - case 'secp521r1': - $curve = 'nistp521'; - break; - default: - return false; - } - - $blob = Strings::packSSH2('ii', $r, $s); - - return Strings::packSSH2('ss', 'ecdsa-sha2-' . $curve, $blob); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Parameters.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Parameters.php deleted file mode 100644 index 06c4642..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/Parameters.php +++ /dev/null @@ -1,36 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC; - -/** - * EC Parameters - * - * @author Jim Wigginton - */ -final class Parameters extends EC -{ - /** - * Returns the parameters - * - * @param string $type - * @param array $options optional - * @return string - */ - public function toString($type = 'PKCS1', array $options = []) - { - $type = self::validatePlugin('Keys', 'PKCS1', 'saveParameters'); - - return $type::saveParameters($this->curve, $options); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/PrivateKey.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/PrivateKey.php deleted file mode 100644 index 41b67bd..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/PrivateKey.php +++ /dev/null @@ -1,283 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC; - -use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Montgomery as MontgomeryCurve; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\TwistedEdwards as TwistedEdwardsCurve; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves\Curve25519; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves\Ed25519; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Formats\Keys\PKCS1; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Formats\Signature\ASN1 as ASN1Signature; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Hash; -use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedOperationException; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * EC Private Key - * - * @author Jim Wigginton - */ -final class PrivateKey extends EC implements Common\PrivateKey -{ - use Common\Traits\PasswordProtected; - - /** - * Private Key dA - * - * sign() converts this to a BigInteger so one might wonder why this is a FiniteFieldInteger instead of - * a BigInteger. That's because a FiniteFieldInteger, when converted to a byte string, is null padded by - * a certain amount whereas a BigInteger isn't. - * - * @var object - */ - protected $dA; - - /** - * @var string - */ - protected $secret; - - /** - * Multiplies an encoded point by the private key - * - * Used by ECDH - * - * @param string $coordinates - * @return string - */ - public function multiply($coordinates) - { - if ($this->curve instanceof MontgomeryCurve) { - if ($this->curve instanceof Curve25519 && self::$engines['libsodium']) { - return sodium_crypto_scalarmult($this->dA->toBytes(), $coordinates); - } - - $point = [$this->curve->convertInteger(new BigInteger(strrev($coordinates), 256))]; - $point = $this->curve->multiplyPoint($point, $this->dA); - return strrev($point[0]->toBytes(true)); - } - if (!$this->curve instanceof TwistedEdwardsCurve) { - $coordinates = "\0$coordinates"; - } - $point = PKCS1::extractPoint($coordinates, $this->curve); - $point = $this->curve->multiplyPoint($point, $this->dA); - if ($this->curve instanceof TwistedEdwardsCurve) { - return $this->curve->encodePoint($point); - } - if (empty($point)) { - throw new \RuntimeException('The infinity point is invalid'); - } - return "\4" . $point[0]->toBytes(true) . $point[1]->toBytes(true); - } - - /** - * Create a signature - * - * @see self::verify() - * @param string $message - * @return mixed - */ - public function sign($message) - { - if ($this->curve instanceof MontgomeryCurve) { - throw new UnsupportedOperationException('Montgomery Curves cannot be used to create signatures'); - } - - $dA = $this->dA; - $order = $this->curve->getOrder(); - - $shortFormat = $this->shortFormat; - $format = $this->sigFormat; - if ($format === false) { - return false; - } - - if ($this->curve instanceof TwistedEdwardsCurve) { - if ($this->curve instanceof Ed25519 && self::$engines['libsodium'] && !isset($this->context)) { - $result = sodium_crypto_sign_detached($message, $this->withPassword()->toString('libsodium')); - return $shortFormat == 'SSH2' ? Strings::packSSH2('ss', 'ssh-' . strtolower($this->getCurve()), $result) : $result; - } - - // contexts (Ed25519ctx) are supported but prehashing (Ed25519ph) is not. - // quoting https://tools.ietf.org/html/rfc8032#section-8.5 , - // "The Ed25519ph and Ed448ph variants ... SHOULD NOT be used" - $A = $this->curve->encodePoint($this->QA); - $curve = $this->curve; - $hash = new Hash($curve::HASH); - - $secret = substr($hash->hash($this->secret), $curve::SIZE); - - if ($curve instanceof Ed25519) { - $dom = !isset($this->context) ? '' : - 'SigEd25519 no Ed25519 collisions' . "\0" . chr(strlen($this->context)) . $this->context; - } else { - $context = isset($this->context) ? $this->context : ''; - $dom = 'SigEd448' . "\0" . chr(strlen($context)) . $context; - } - // SHA-512(dom2(F, C) || prefix || PH(M)) - $r = $hash->hash($dom . $secret . $message); - $r = strrev($r); - $r = new BigInteger($r, 256); - list(, $r) = $r->divide($order); - $R = $curve->multiplyPoint($curve->getBasePoint(), $r); - $R = $curve->encodePoint($R); - $k = $hash->hash($dom . $R . $A . $message); - $k = strrev($k); - $k = new BigInteger($k, 256); - list(, $k) = $k->divide($order); - $S = $k->multiply($dA)->add($r); - list(, $S) = $S->divide($order); - $S = str_pad(strrev($S->toBytes()), $curve::SIZE, "\0"); - return $shortFormat == 'SSH2' ? Strings::packSSH2('ss', 'ssh-' . strtolower($this->getCurve()), $R . $S) : $R . $S; - } - - if (self::$engines['OpenSSL'] && in_array($this->hash->getHash(), openssl_get_md_methods())) { - $signature = ''; - // altho PHP's OpenSSL bindings only supported EC key creation in PHP 7.1 they've long - // supported signing / verification - // we use specified curves to avoid issues with OpenSSL possibly not supporting a given named curve; - // doing this may mean some curve-specific optimizations can't be used but idk if OpenSSL even - // has curve-specific optimizations - $result = openssl_sign($message, $signature, $this->withPassword()->toString('PKCS8', ['namedCurve' => false]), $this->hash->getHash()); - - if ($result) { - if ($shortFormat == 'ASN1') { - return $signature; - } - - $loaded = ASN1Signature::load($signature); - $r = $loaded['r']; - $s = $loaded['s']; - - - return $this->formatSignature($r, $s); - } - } - - $e = $this->hash->hash($message); - $e = new BigInteger($e, 256); - - $Ln = $this->hash->getLength() - $order->getLength(); - $z = $Ln > 0 ? $e->bitwise_rightShift($Ln) : $e; - - while (true) { - $k = BigInteger::randomRange(self::$one, $order->subtract(self::$one)); - list($x, $y) = $this->curve->multiplyPoint($this->curve->getBasePoint(), $k); - $x = $x->toBigInteger(); - list(, $r) = $x->divide($order); - if ($r->equals(self::$zero)) { - continue; - } - $kinv = $k->modInverse($order); - $temp = $z->add($dA->multiply($r)); - $temp = $kinv->multiply($temp); - list(, $s) = $temp->divide($order); - if (!$s->equals(self::$zero)) { - break; - } - } - - // the following is an RFC6979 compliant implementation of deterministic ECDSA - // it's unused because it's mainly intended for use when a good CSPRNG isn't - // available. if phpseclib's CSPRNG isn't good then even key generation is - // suspect - /* - // if this were actually being used it'd probably be better if this lived in load() and createKey() - $this->q = $this->curve->getOrder(); - $dA = $this->dA->toBigInteger(); - $this->x = $dA; - - $h1 = $this->hash->hash($message); - $k = $this->computek($h1); - list($x, $y) = $this->curve->multiplyPoint($this->curve->getBasePoint(), $k); - $x = $x->toBigInteger(); - list(, $r) = $x->divide($this->q); - $kinv = $k->modInverse($this->q); - $h1 = $this->bits2int($h1); - $temp = $h1->add($dA->multiply($r)); - $temp = $kinv->multiply($temp); - list(, $s) = $temp->divide($this->q); - */ - - return $this->formatSignature($r, $s); - } - - /** - * Returns the private key - * - * @param string $type - * @param array $options optional - * @return string - */ - public function toString($type, array $options = []) - { - $type = self::validatePlugin('Keys', $type, 'savePrivateKey'); - - return $type::savePrivateKey($this->dA, $this->curve, $this->QA, $this->secret, $this->password, $options); - } - - /** - * Returns the public key - * - * @see self::getPrivateKey() - * @return mixed - */ - public function getPublicKey() - { - $format = 'PKCS8'; - if ($this->curve instanceof MontgomeryCurve) { - $format = 'MontgomeryPublic'; - } - - $type = self::validatePlugin('Keys', $format, 'savePublicKey'); - - $key = $type::savePublicKey($this->curve, $this->QA); - $key = EC::loadFormat($format, $key); - if ($this->curve instanceof MontgomeryCurve) { - return $key; - } - $key = $key - ->withHash($this->hash->getHash()) - ->withSignatureFormat($this->shortFormat); - if ($this->curve instanceof TwistedEdwardsCurve) { - $key = $key->withContext($this->context); - } - return $key; - } - - /** - * Returns a signature in the appropriate format - * - * @return string - */ - private function formatSignature(BigInteger $r, BigInteger $s) - { - $format = $this->sigFormat; - - $temp = new \ReflectionMethod($format, 'save'); - $paramCount = $temp->getNumberOfRequiredParameters(); - - // @codingStandardsIgnoreStart - switch ($paramCount) { - case 2: return $format::save($r, $s); - case 3: return $format::save($r, $s, $this->getCurve()); - case 4: return $format::save($r, $s, $this->getCurve(), $this->getLength()); - } - // @codingStandardsIgnoreEnd - - // presumably the only way you could get to this is if you were using a custom plugin - throw new UnsupportedOperationException("$format::save() has $paramCount parameters - the only valid parameter counts are 2 or 3"); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/PublicKey.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/PublicKey.php deleted file mode 100644 index 138c3bc..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/EC/PublicKey.php +++ /dev/null @@ -1,173 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\EC; - -use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\Montgomery as MontgomeryCurve; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\BaseCurves\TwistedEdwards as TwistedEdwardsCurve; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Curves\Ed25519; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Formats\Keys\PKCS1; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC\Formats\Signature\ASN1 as ASN1Signature; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Hash; -use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedOperationException; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * EC Public Key - * - * @author Jim Wigginton - */ -final class PublicKey extends EC implements Common\PublicKey -{ - use Common\Traits\Fingerprint; - - /** - * Verify a signature - * - * @see self::verify() - * @param string $message - * @param string $signature - * @return mixed - */ - public function verify($message, $signature) - { - if ($this->curve instanceof MontgomeryCurve) { - throw new UnsupportedOperationException('Montgomery Curves cannot be used to create signatures'); - } - - $shortFormat = $this->shortFormat; - $format = $this->sigFormat; - if ($format === false) { - return false; - } - - $order = $this->curve->getOrder(); - - if ($this->curve instanceof TwistedEdwardsCurve) { - if ($shortFormat == 'SSH2') { - list(, $signature) = Strings::unpackSSH2('ss', $signature); - } - - if ($this->curve instanceof Ed25519 && self::$engines['libsodium'] && !isset($this->context)) { - return sodium_crypto_sign_verify_detached($signature, $message, $this->toString('libsodium')); - } - - $curve = $this->curve; - if (strlen($signature) != 2 * $curve::SIZE) { - return false; - } - - $R = substr($signature, 0, $curve::SIZE); - $S = substr($signature, $curve::SIZE); - - try { - $R = PKCS1::extractPoint($R, $curve); - $R = $this->curve->convertToInternal($R); - } catch (\Exception $e) { - return false; - } - - $S = strrev($S); - $S = new BigInteger($S, 256); - - if ($S->compare($order) >= 0) { - return false; - } - - $A = $curve->encodePoint($this->QA); - - if ($curve instanceof Ed25519) { - $dom2 = !isset($this->context) ? '' : - 'SigEd25519 no Ed25519 collisions' . "\0" . chr(strlen($this->context)) . $this->context; - } else { - $context = isset($this->context) ? $this->context : ''; - $dom2 = 'SigEd448' . "\0" . chr(strlen($context)) . $context; - } - - $hash = new Hash($curve::HASH); - $k = $hash->hash($dom2 . substr($signature, 0, $curve::SIZE) . $A . $message); - $k = strrev($k); - $k = new BigInteger($k, 256); - list(, $k) = $k->divide($order); - - $qa = $curve->convertToInternal($this->QA); - - $lhs = $curve->multiplyPoint($curve->getBasePoint(), $S); - $rhs = $curve->multiplyPoint($qa, $k); - $rhs = $curve->addPoint($rhs, $R); - $rhs = $curve->convertToAffine($rhs); - - return $lhs[0]->equals($rhs[0]) && $lhs[1]->equals($rhs[1]); - } - - $params = $format::load($signature); - if ($params === false || count($params) != 2) { - return false; - } - $r = $params['r']; - $s = $params['s']; - - if (self::$engines['OpenSSL'] && in_array($this->hash->getHash(), openssl_get_md_methods())) { - $sig = $format != 'ASN1' ? ASN1Signature::save($r, $s) : $signature; - - $result = openssl_verify($message, $sig, $this->toString('PKCS8', ['namedCurve' => false]), $this->hash->getHash()); - - if ($result != -1) { - return (bool) $result; - } - } - - $n_1 = $order->subtract(self::$one); - if (!$r->between(self::$one, $n_1) || !$s->between(self::$one, $n_1)) { - return false; - } - - $e = $this->hash->hash($message); - $e = new BigInteger($e, 256); - - $Ln = $this->hash->getLength() - $order->getLength(); - $z = $Ln > 0 ? $e->bitwise_rightShift($Ln) : $e; - - $w = $s->modInverse($order); - list(, $u1) = $z->multiply($w)->divide($order); - list(, $u2) = $r->multiply($w)->divide($order); - - $u1 = $this->curve->convertInteger($u1); - $u2 = $this->curve->convertInteger($u2); - - list($x1, $y1) = $this->curve->multiplyAddPoints( - [$this->curve->getBasePoint(), $this->QA], - [$u1, $u2] - ); - - $x1 = $x1->toBigInteger(); - list(, $x1) = $x1->divide($order); - - return $x1->equals($r); - } - - /** - * Returns the public key - * - * @param string $type - * @param array $options optional - * @return string - */ - public function toString($type, array $options = []) - { - $type = self::validatePlugin('Keys', $type, 'savePublicKey'); - - return $type::savePublicKey($this->curve, $this->QA, $options); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/Hash.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/Hash.php deleted file mode 100644 index a0d034a..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/Hash.php +++ /dev/null @@ -1,1891 +0,0 @@ - - * setKey('abcdefg'); - * - * echo base64_encode($hash->hash('abcdefg')); - * ?> - * - * - * @author Jim Wigginton - * @copyright 2015 Jim Wigginton - * @author Andreas Fischer - * @copyright 2015 Andreas Fischer - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt; - -use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; -use OCA\Libresign\Vendor\phpseclib3\Exception\InsufficientSetupException; -use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedAlgorithmException; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -use OCA\Libresign\Vendor\phpseclib3\Math\PrimeField; - -/** - * @author Jim Wigginton - * @author Andreas Fischer - */ -class Hash -{ - /** - * Padding Types - * - */ - const PADDING_KECCAK = 1; - - /** - * Padding Types - * - */ - const PADDING_SHA3 = 2; - - /** - * Padding Types - * - */ - const PADDING_SHAKE = 3; - - /** - * Padding Type - * - * Only used by SHA3 - * - * @var int - */ - private $paddingType = 0; - - /** - * Hash Parameter - * - * @see self::setHash() - * @var int - */ - private $hashParam; - - /** - * Byte-length of hash output (Internal HMAC) - * - * @see self::setHash() - * @var int - */ - private $length; - - /** - * Hash Algorithm - * - * @see self::setHash() - * @var string - */ - private $algo; - - /** - * Key - * - * @see self::setKey() - * @var string - */ - private $key = false; - - /** - * Nonce - * - * @see self::setNonce() - * @var string - */ - private $nonce = false; - - /** - * Hash Parameters - * - * @var array - */ - private $parameters = []; - - /** - * Computed Key - * - * @see self::_computeKey() - * @var string - */ - private $computedKey = false; - - /** - * Outer XOR (Internal HMAC) - * - * Used only for sha512 - * - * @see self::hash() - * @var string - */ - private $opad; - - /** - * Inner XOR (Internal HMAC) - * - * Used only for sha512 - * - * @see self::hash() - * @var string - */ - private $ipad; - - /** - * Recompute AES Key - * - * Used only for umac - * - * @see self::hash() - * @var boolean - */ - private $recomputeAESKey; - - /** - * umac cipher object - * - * @see self::hash() - * @var AES - */ - private $c; - - /** - * umac pad - * - * @see self::hash() - * @var string - */ - private $pad; - - /** - * Block Size - * - * @var int - */ - private $blockSize; - - /**#@+ - * UMAC variables - * - * @var PrimeField - */ - private static $factory36; - private static $factory64; - private static $factory128; - private static $offset64; - private static $offset128; - private static $marker64; - private static $marker128; - private static $maxwordrange64; - private static $maxwordrange128; - /**#@-*/ - - /**#@+ - * AES_CMAC variables - * - * @var string - */ - private $k1; - private $k2; - /**#@-*/ - - /** - * Default Constructor. - * - * @param string $hash - */ - public function __construct($hash = 'sha256') - { - $this->setHash($hash); - } - - /** - * Sets the key for HMACs - * - * Keys can be of any length. - * - * @param string $key - */ - public function setKey($key = false) - { - $this->key = $key; - $this->computeKey(); - $this->recomputeAESKey = true; - } - - /** - * Sets the nonce for UMACs - * - * Keys can be of any length. - * - * @param string $nonce - */ - public function setNonce($nonce = false) - { - switch (true) { - case !is_string($nonce): - case strlen($nonce) > 0 && strlen($nonce) <= 16: - $this->recomputeAESKey = true; - $this->nonce = $nonce; - return; - } - - throw new \LengthException('The nonce length must be between 1 and 16 bytes, inclusive'); - } - - /** - * Pre-compute the key used by the HMAC - * - * Quoting http://tools.ietf.org/html/rfc2104#section-2, "Applications that use keys longer than B bytes - * will first hash the key using H and then use the resultant L byte string as the actual key to HMAC." - * - * As documented in https://www.reddit.com/r/PHP/comments/9nct2l/symfonypolyfill_hash_pbkdf2_correct_fix_for/ - * when doing an HMAC multiple times it's faster to compute the hash once instead of computing it during - * every call - * - */ - private function computeKey() - { - if ($this->key === false) { - $this->computedKey = false; - return; - } - - if (strlen($this->key) <= $this->getBlockLengthInBytes()) { - $this->computedKey = $this->key; - return; - } - - $this->computedKey = is_array($this->algo) ? - call_user_func($this->algo, $this->key) : - hash($this->algo, $this->key, true); - } - - /** - * Gets the hash function. - * - * As set by the constructor or by the setHash() method. - * - * @return string - */ - public function getHash() - { - return $this->hashParam; - } - - /** - * Sets the hash function. - * - * @param string $hash - */ - public function setHash($hash) - { - $oldHash = $this->hashParam; - $this->hashParam = $hash = strtolower($hash); - switch ($hash) { - case 'umac-32': - case 'umac-64': - case 'umac-96': - case 'umac-128': - if ($oldHash != $this->hashParam) { - $this->recomputeAESKey = true; - } - $this->blockSize = 128; - $this->length = abs(substr($hash, -3)) >> 3; - $this->algo = 'umac'; - return; - case 'aes_cmac': - if ($oldHash != $this->hashParam) { - $this->recomputeAESKey = true; - } - $this->blockSize = 128; - $this->length = 16; - $this->algo = 'aes_cmac'; - return; - case 'md2-96': - case 'md5-96': - case 'sha1-96': - case 'sha224-96': - case 'sha256-96': - case 'sha384-96': - case 'sha512-96': - case 'sha512/224-96': - case 'sha512/256-96': - $hash = substr($hash, 0, -3); - $this->length = 12; // 96 / 8 = 12 - break; - case 'md2': - case 'md5': - $this->length = 16; - break; - case 'sha1': - $this->length = 20; - break; - case 'sha224': - case 'sha512/224': - case 'sha3-224': - $this->length = 28; - break; - case 'keccak256': - $this->paddingType = self::PADDING_KECCAK; - // fall-through - case 'sha256': - case 'sha512/256': - case 'sha3-256': - $this->length = 32; - break; - case 'sha384': - case 'sha3-384': - $this->length = 48; - break; - case 'sha512': - case 'sha3-512': - $this->length = 64; - break; - default: - if (preg_match('#^(shake(?:128|256))-(\d+)$#', $hash, $matches)) { - $this->paddingType = self::PADDING_SHAKE; - $hash = $matches[1]; - $this->length = $matches[2] >> 3; - } else { - throw new UnsupportedAlgorithmException( - "$hash is not a supported algorithm" - ); - } - } - - switch ($hash) { - case 'md2': - case 'md2-96': - $this->blockSize = 128; - break; - case 'md5-96': - case 'sha1-96': - case 'sha224-96': - case 'sha256-96': - case 'md5': - case 'sha1': - case 'sha224': - case 'sha256': - $this->blockSize = 512; - break; - case 'sha3-224': - $this->blockSize = 1152; // 1600 - 2*224 - break; - case 'sha3-256': - case 'shake256': - case 'keccak256': - $this->blockSize = 1088; // 1600 - 2*256 - break; - case 'sha3-384': - $this->blockSize = 832; // 1600 - 2*384 - break; - case 'sha3-512': - $this->blockSize = 576; // 1600 - 2*512 - break; - case 'shake128': - $this->blockSize = 1344; // 1600 - 2*128 - break; - default: - $this->blockSize = 1024; - } - - if (in_array(substr($hash, 0, 5), ['sha3-', 'shake', 'kecca'])) { - // PHP 7.1.0 introduced support for "SHA3 fixed mode algorithms": - // http://php.net/ChangeLog-7.php#7.1.0 - if (version_compare(PHP_VERSION, '7.1.0') < 0 || substr($hash, 0, 5) != 'sha3-') { - //preg_match('#(\d+)$#', $hash, $matches); - //$this->parameters['capacity'] = 2 * $matches[1]; // 1600 - $this->blockSize - //$this->parameters['rate'] = 1600 - $this->parameters['capacity']; // == $this->blockSize - if (!$this->paddingType) { - $this->paddingType = self::PADDING_SHA3; - } - $this->parameters = [ - 'capacity' => 1600 - $this->blockSize, - 'rate' => $this->blockSize, - 'length' => $this->length, - 'padding' => $this->paddingType - ]; - $hash = ['\OCA\Libresign\Vendor\phpseclib3\Crypt\Hash', PHP_INT_SIZE == 8 ? 'sha3_64' : 'sha3_32']; - } - } - - if ($hash == 'sha512/224' || $hash == 'sha512/256') { - // PHP 7.1.0 introduced sha512/224 and sha512/256 support: - // http://php.net/ChangeLog-7.php#7.1.0 - if (version_compare(PHP_VERSION, '7.1.0') < 0) { - // from http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf#page=24 - $initial = $hash == 'sha512/256' ? - [ - '22312194FC2BF72C', '9F555FA3C84C64C2', '2393B86B6F53B151', '963877195940EABD', - '96283EE2A88EFFE3', 'BE5E1E2553863992', '2B0199FC2C85B8AA', '0EB72DDC81C52CA2' - ] : - [ - '8C3D37C819544DA2', '73E1996689DCD4D6', '1DFAB7AE32FF9C82', '679DD514582F9FCF', - '0F6D2B697BD44DA8', '77E36F7304C48942', '3F9D85A86A1D36C8', '1112E6AD91D692A1' - ]; - for ($i = 0; $i < 8; $i++) { - if (PHP_INT_SIZE == 8) { - list(, $initial[$i]) = unpack('J', pack('H*', $initial[$i])); - } else { - $initial[$i] = new BigInteger($initial[$i], 16); - $initial[$i]->setPrecision(64); - } - } - - $this->parameters = compact('initial'); - - $hash = ['\OCA\Libresign\Vendor\phpseclib3\Crypt\Hash', PHP_INT_SIZE == 8 ? 'sha512_64' : 'sha512']; - } - } - - if (is_array($hash)) { - $b = $this->blockSize >> 3; - $this->ipad = str_repeat(chr(0x36), $b); - $this->opad = str_repeat(chr(0x5C), $b); - } - - $this->algo = $hash; - - $this->computeKey(); - } - - /** - * KDF: Key-Derivation Function - * - * The key-derivation function generates pseudorandom bits used to key the hash functions. - * - * @param int $index a non-negative integer less than 2^64 - * @param int $numbytes a non-negative integer less than 2^64 - * @return string string of length numbytes bytes - */ - private function kdf($index, $numbytes) - { - $this->c->setIV(pack('N4', 0, $index, 0, 1)); - - return $this->c->encrypt(str_repeat("\0", $numbytes)); - } - - /** - * PDF Algorithm - * - * @return string string of length taglen bytes. - */ - private function pdf() - { - $k = $this->key; - $nonce = $this->nonce; - $taglen = $this->length; - - // - // Extract and zero low bit(s) of Nonce if needed - // - if ($taglen <= 8) { - $last = strlen($nonce) - 1; - $mask = $taglen == 4 ? "\3" : "\1"; - $index = $nonce[$last] & $mask; - $nonce[$last] = $nonce[$last] ^ $index; - } - - // - // Make Nonce BLOCKLEN bytes by appending zeroes if needed - // - $nonce = str_pad($nonce, 16, "\0"); - - // - // Generate subkey, encipher and extract indexed substring - // - $kp = $this->kdf(0, 16); - $c = new AES('ctr'); - $c->disablePadding(); - $c->setKey($kp); - $c->setIV($nonce); - $t = $c->encrypt("\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"); - - // we could use ord() but per https://paragonie.com/blog/2016/06/constant-time-encoding-boring-cryptography-rfc-4648-and-you - // unpack() doesn't leak timing info - return $taglen <= 8 ? - substr($t, unpack('C', $index)[1] * $taglen, $taglen) : - substr($t, 0, $taglen); - } - - /** - * UHASH Algorithm - * - * @param string $m string of length less than 2^67 bits. - * @param int $taglen the integer 4, 8, 12 or 16. - * @return string string of length taglen bytes. - */ - private function uhash($m, $taglen) - { - // - // One internal iteration per 4 bytes of output - // - $iters = $taglen >> 2; - - // - // Define total key needed for all iterations using KDF. - // L1Key reuses most key material between iterations. - // - //$L1Key = $this->kdf(1, 1024 + ($iters - 1) * 16); - $L1Key = $this->kdf(1, (1024 + ($iters - 1)) * 16); - $L2Key = $this->kdf(2, $iters * 24); - $L3Key1 = $this->kdf(3, $iters * 64); - $L3Key2 = $this->kdf(4, $iters * 4); - - // - // For each iteration, extract key and do three-layer hash. - // If bytelength(M) <= 1024, then skip L2-HASH. - // - $y = ''; - for ($i = 0; $i < $iters; $i++) { - $L1Key_i = substr($L1Key, $i * 16, 1024); - $L2Key_i = substr($L2Key, $i * 24, 24); - $L3Key1_i = substr($L3Key1, $i * 64, 64); - $L3Key2_i = substr($L3Key2, $i * 4, 4); - - $a = self::L1Hash($L1Key_i, $m); - $b = strlen($m) <= 1024 ? "\0\0\0\0\0\0\0\0$a" : self::L2Hash($L2Key_i, $a); - $c = self::L3Hash($L3Key1_i, $L3Key2_i, $b); - $y .= $c; - } - - return $y; - } - - /** - * L1-HASH Algorithm - * - * The first-layer hash breaks the message into 1024-byte chunks and - * hashes each with a function called NH. Concatenating the results - * forms a string, which is up to 128 times shorter than the original. - * - * @param string $k string of length 1024 bytes. - * @param string $m string of length less than 2^67 bits. - * @return string string of length (8 * ceil(bitlength(M)/8192)) bytes. - */ - private static function L1Hash($k, $m) - { - // - // Break M into 1024 byte chunks (final chunk may be shorter) - // - $m = str_split($m, 1024); - - // - // For each chunk, except the last: endian-adjust, NH hash - // and add bit-length. Use results to build Y. - // - $length = 1024 * 8; - $y = ''; - - for ($i = 0; $i < count($m) - 1; $i++) { - $m[$i] = pack('N*', ...unpack('V*', $m[$i])); // ENDIAN-SWAP - $y .= PHP_INT_SIZE == 8 ? - static::nh64($k, $m[$i], $length) : - static::nh32($k, $m[$i], $length); - } - - // - // For the last chunk: pad to 32-byte boundary, endian-adjust, - // NH hash and add bit-length. Concatenate the result to Y. - // - $length = count($m) ? strlen($m[$i]) : 0; - $pad = 32 - ($length % 32); - $pad = max(32, $length + $pad % 32); - $m[$i] = str_pad(isset($m[$i]) ? $m[$i] : '', $pad, "\0"); // zeropad - $m[$i] = pack('N*', ...unpack('V*', $m[$i])); // ENDIAN-SWAP - - $y .= PHP_INT_SIZE == 8 ? - static::nh64($k, $m[$i], $length * 8) : - static::nh32($k, $m[$i], $length * 8); - - return $y; - } - - /** - * 32-bit safe 64-bit Multiply with 2x 32-bit ints - * - * @param int $x - * @param int $y - * @return string $x * $y - */ - private static function mul32_64($x, $y) - { - // see mul64() for a more detailed explanation of how this works - - $x1 = ($x >> 16) & 0xFFFF; - $x0 = $x & 0xFFFF; - - $y1 = ($y >> 16) & 0xFFFF; - $y0 = $y & 0xFFFF; - - // the following 3x lines will possibly yield floats - $z2 = $x1 * $y1; - $z0 = $x0 * $y0; - $z1 = $x1 * $y0 + $x0 * $y1; - - $a = intval(fmod($z0, 65536)); - $b = intval($z0 / 65536) + intval(fmod($z1, 65536)); - $c = intval($z1 / 65536) + intval(fmod($z2, 65536)) + intval($b / 65536); - $b = intval(fmod($b, 65536)); - $d = intval($z2 / 65536) + intval($c / 65536); - $c = intval(fmod($c, 65536)); - $d = intval(fmod($d, 65536)); - - return pack('n4', $d, $c, $b, $a); - } - - /** - * 32-bit safe 64-bit Addition with 2x 64-bit strings - * - * @param int $x - * @param int $y - * @return int $x * $y - */ - private static function add32_64($x, $y) - { - list(, $x1, $x2, $x3, $x4) = unpack('n4', $x); - list(, $y1, $y2, $y3, $y4) = unpack('n4', $y); - $a = $x4 + $y4; - $b = $x3 + $y3 + ($a >> 16); - $c = $x2 + $y2 + ($b >> 16); - $d = $x1 + $y1 + ($c >> 16); - return pack('n4', $d, $c, $b, $a); - } - - /** - * 32-bit safe 32-bit Addition with 2x 32-bit strings - * - * @param int $x - * @param int $y - * @return int $x * $y - */ - private static function add32($x, $y) - { - // see add64() for a more detailed explanation of how this works - - $x1 = $x & 0xFFFF; - $x2 = ($x >> 16) & 0xFFFF; - $y1 = $y & 0xFFFF; - $y2 = ($y >> 16) & 0xFFFF; - - $a = $x1 + $y1; - $b = ($x2 + $y2 + ($a >> 16)) << 16; - $a &= 0xFFFF; - - return $a | $b; - } - - /** - * NH Algorithm / 32-bit safe - * - * @param string $k string of length 1024 bytes. - * @param string $m string with length divisible by 32 bytes. - * @return string string of length 8 bytes. - */ - private static function nh32($k, $m, $length) - { - // - // Break M and K into 4-byte chunks - // - $k = unpack('N*', $k); - $m = unpack('N*', $m); - $t = count($m); - - // - // Perform NH hash on the chunks, pairing words for multiplication - // which are 4 apart to accommodate vector-parallelism. - // - $i = 1; - $y = "\0\0\0\0\0\0\0\0"; - while ($i <= $t) { - $temp = self::add32($m[$i], $k[$i]); - $temp2 = self::add32($m[$i + 4], $k[$i + 4]); - $y = self::add32_64($y, self::mul32_64($temp, $temp2)); - - $temp = self::add32($m[$i + 1], $k[$i + 1]); - $temp2 = self::add32($m[$i + 5], $k[$i + 5]); - $y = self::add32_64($y, self::mul32_64($temp, $temp2)); - - $temp = self::add32($m[$i + 2], $k[$i + 2]); - $temp2 = self::add32($m[$i + 6], $k[$i + 6]); - $y = self::add32_64($y, self::mul32_64($temp, $temp2)); - - $temp = self::add32($m[$i + 3], $k[$i + 3]); - $temp2 = self::add32($m[$i + 7], $k[$i + 7]); - $y = self::add32_64($y, self::mul32_64($temp, $temp2)); - - $i += 8; - } - - return self::add32_64($y, pack('N2', 0, $length)); - } - - /** - * 64-bit Multiply with 2x 32-bit ints - * - * @param int $x - * @param int $y - * @return int $x * $y - */ - private static function mul64($x, $y) - { - // since PHP doesn't implement unsigned integers we'll implement them with signed integers - // to do this we'll use karatsuba multiplication - - $x1 = $x >> 16; - $x0 = $x & 0xFFFF; - - $y1 = $y >> 16; - $y0 = $y & 0xFFFF; - - $z2 = $x1 * $y1; // up to 32 bits long - $z0 = $x0 * $y0; // up to 32 bits long - $z1 = $x1 * $y0 + $x0 * $y1; // up to 33 bit long - // normally karatsuba multiplication calculates $z1 thusly: - //$z1 = ($x1 + $x0) * ($y0 + $y1) - $z2 - $z0; - // the idea being to eliminate one extra multiplication. for arbitrary precision math that makes sense - // but not for this purpose - - // at this point karatsuba would normally return this: - //return ($z2 << 64) + ($z1 << 32) + $z0; - // the problem is that the output could be out of range for signed 64-bit ints, - // which would cause PHP to switch to floats, which would risk losing the lower few bits - // as such we'll OR 4x 16-bit blocks together like so: - /* - ........ | ........ | ........ | ........ - upper $z2 | lower $z2 | lower $z1 | lower $z0 - | +upper $z1 | +upper $z0 | - + $carry | + $carry | | - */ - // technically upper $z1 is 17 bit - not 16 - but the most significant digit of that will - // just get added to $carry - - $a = $z0 & 0xFFFF; - $b = ($z0 >> 16) + ($z1 & 0xFFFF); - $c = ($z1 >> 16) + ($z2 & 0xFFFF) + ($b >> 16); - $b = ($b & 0xFFFF) << 16; - $d = ($z2 >> 16) + ($c >> 16); - $c = ($c & 0xFFFF) << 32; - $d = ($d & 0xFFFF) << 48; - - return $a | $b | $c | $d; - } - - /** - * 64-bit Addition with 2x 64-bit ints - * - * @param int $x - * @param int $y - * @return int $x + $y - */ - private static function add64($x, $y) - { - // doing $x + $y risks returning a result that's out of range for signed 64-bit ints - // in that event PHP would convert the result to a float and precision would be lost - // so we'll just add 2x 32-bit ints together like so: - /* - ........ | ........ - upper $x | lower $x - +upper $y |+lower $y - + $carry | - */ - $x1 = $x & 0xFFFFFFFF; - $x2 = ($x >> 32) & 0xFFFFFFFF; - $y1 = $y & 0xFFFFFFFF; - $y2 = ($y >> 32) & 0xFFFFFFFF; - - $a = $x1 + $y1; - $b = ($x2 + $y2 + ($a >> 32)) << 32; - $a &= 0xFFFFFFFF; - - return $a | $b; - } - - /** - * NH Algorithm / 64-bit safe - * - * @param string $k string of length 1024 bytes. - * @param string $m string with length divisible by 32 bytes. - * @return string string of length 8 bytes. - */ - private static function nh64($k, $m, $length) - { - // - // Break M and K into 4-byte chunks - // - $k = unpack('N*', $k); - $m = unpack('N*', $m); - $t = count($m); - - // - // Perform NH hash on the chunks, pairing words for multiplication - // which are 4 apart to accommodate vector-parallelism. - // - $i = 1; - $y = 0; - while ($i <= $t) { - $temp = ($m[$i] + $k[$i]) & 0xFFFFFFFF; - $temp2 = ($m[$i + 4] + $k[$i + 4]) & 0xFFFFFFFF; - $y = self::add64($y, self::mul64($temp, $temp2)); - - $temp = ($m[$i + 1] + $k[$i + 1]) & 0xFFFFFFFF; - $temp2 = ($m[$i + 5] + $k[$i + 5]) & 0xFFFFFFFF; - $y = self::add64($y, self::mul64($temp, $temp2)); - - $temp = ($m[$i + 2] + $k[$i + 2]) & 0xFFFFFFFF; - $temp2 = ($m[$i + 6] + $k[$i + 6]) & 0xFFFFFFFF; - $y = self::add64($y, self::mul64($temp, $temp2)); - - $temp = ($m[$i + 3] + $k[$i + 3]) & 0xFFFFFFFF; - $temp2 = ($m[$i + 7] + $k[$i + 7]) & 0xFFFFFFFF; - $y = self::add64($y, self::mul64($temp, $temp2)); - - $i += 8; - } - - return pack('J', self::add64($y, $length)); - } - - /** - * L2-HASH: Second-Layer Hash - * - * The second-layer rehashes the L1-HASH output using a polynomial hash - * called POLY. If the L1-HASH output is long, then POLY is called once - * on a prefix of the L1-HASH output and called using different settings - * on the remainder. (This two-step hashing of the L1-HASH output is - * needed only if the message length is greater than 16 megabytes.) - * Careful implementation of POLY is necessary to avoid a possible - * timing attack (see Section 6.6 for more information). - * - * @param string $k string of length 24 bytes. - * @param string $m string of length less than 2^64 bytes. - * @return string string of length 16 bytes. - */ - private static function L2Hash($k, $m) - { - // - // Extract keys and restrict to special key-sets - // - $k64 = $k & "\x01\xFF\xFF\xFF\x01\xFF\xFF\xFF"; - $k64 = new BigInteger($k64, 256); - $k128 = substr($k, 8) & "\x01\xFF\xFF\xFF\x01\xFF\xFF\xFF\x01\xFF\xFF\xFF\x01\xFF\xFF\xFF"; - $k128 = new BigInteger($k128, 256); - - // - // If M is no more than 2^17 bytes, hash under 64-bit prime, - // otherwise, hash first 2^17 bytes under 64-bit prime and - // remainder under 128-bit prime. - // - if (strlen($m) <= 0x20000) { // 2^14 64-bit words - $y = self::poly(64, self::$maxwordrange64, $k64, $m); - } else { - $m_1 = substr($m, 0, 0x20000); // 1 << 17 - $m_2 = substr($m, 0x20000) . "\x80"; - $length = strlen($m_2); - $pad = 16 - ($length % 16); - $pad %= 16; - $m_2 = str_pad($m_2, $length + $pad, "\0"); // zeropad - $y = self::poly(64, self::$maxwordrange64, $k64, $m_1); - $y = str_pad($y, 16, "\0", STR_PAD_LEFT); - $y = self::poly(128, self::$maxwordrange128, $k128, $y . $m_2); - } - - return str_pad($y, 16, "\0", STR_PAD_LEFT); - } - - /** - * POLY Algorithm - * - * @param int $wordbits the integer 64 or 128. - * @param BigInteger $maxwordrange positive integer less than 2^wordbits. - * @param BigInteger $k integer in the range 0 ... prime(wordbits) - 1. - * @param string $m string with length divisible by (wordbits / 8) bytes. - * @return integer in the range 0 ... prime(wordbits) - 1. - */ - private static function poly($wordbits, $maxwordrange, $k, $m) - { - // - // Define constants used for fixing out-of-range words - // - $wordbytes = $wordbits >> 3; - if ($wordbits == 128) { - $factory = self::$factory128; - $offset = self::$offset128; - $marker = self::$marker128; - } else { - $factory = self::$factory64; - $offset = self::$offset64; - $marker = self::$marker64; - } - - $k = $factory->newInteger($k); - - // - // Break M into chunks of length wordbytes bytes - // - $m_i = str_split($m, $wordbytes); - - // - // Each input word m is compared with maxwordrange. If not smaller - // then 'marker' and (m - offset), both in range, are hashed. - // - $y = $factory->newInteger(new BigInteger(1)); - foreach ($m_i as $m) { - $m = $factory->newInteger(new BigInteger($m, 256)); - if ($m->compare($maxwordrange) >= 0) { - $y = $k->multiply($y)->add($marker); - $y = $k->multiply($y)->add($m->subtract($offset)); - } else { - $y = $k->multiply($y)->add($m); - } - } - - return $y->toBytes(); - } - - /** - * L3-HASH: Third-Layer Hash - * - * The output from L2-HASH is 16 bytes long. This final hash function - * hashes the 16-byte string to a fixed length of 4 bytes. - * - * @param string $k1 string of length 64 bytes. - * @param string $k2 string of length 4 bytes. - * @param string $m string of length 16 bytes. - * @return string string of length 4 bytes. - */ - private static function L3Hash($k1, $k2, $m) - { - $factory = self::$factory36; - - $y = $factory->newInteger(new BigInteger()); - for ($i = 0; $i < 8; $i++) { - $m_i = $factory->newInteger(new BigInteger(substr($m, 2 * $i, 2), 256)); - $k_i = $factory->newInteger(new BigInteger(substr($k1, 8 * $i, 8), 256)); - $y = $y->add($m_i->multiply($k_i)); - } - $y = str_pad(substr($y->toBytes(), -4), 4, "\0", STR_PAD_LEFT); - $y = $y ^ $k2; - - return $y; - } - - /** - * Compute the Hash / HMAC / UMAC. - * - * @param string $text - * @return string - */ - public function hash($text) - { - $algo = $this->algo; - // https://www.rfc-editor.org/rfc/rfc4493.html - // https://en.wikipedia.org/wiki/One-key_MAC - if ($algo == 'aes_cmac') { - $constZero = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"; - if ($this->recomputeAESKey) { - if (!is_string($this->key)) { - throw new InsufficientSetupException('No key has been set'); - } - if (strlen($this->key) != 16) { - throw new \LengthException('Key must be 16 bytes long'); - } - // Algorithm Generate_Subkey - $constRb = "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\x87"; - $this->c = new AES('ecb'); - $this->c->setKey($this->key); - $this->c->disablePadding(); - $l = $this->c->encrypt($constZero); - $msb = ($l & "\x80") == "\x80"; - $l = new BigInteger($l, 256); - $l->setPrecision(128); - $l = $l->bitwise_leftShift(1)->toBytes(); - // make it constant time - $k1 = $msb ? $l ^ $constRb : $l | $constZero; - - $msb = ($k1 & "\x80") == "\x80"; - $k2 = new BigInteger($k1, 256); - $k2->setPrecision(128); - $k2 = $k2->bitwise_leftShift(1)->toBytes(); - // make it constant time - $k2 = $msb ? $k2 ^ $constRb : $k2 | $constZero; - - $this->k1 = $k1; - $this->k2 = $k2; - } - - $len = strlen($text); - $const_Bsize = 16; - $M = strlen($text) ? str_split($text, $const_Bsize) : ['']; - - // Step 2 - $n = ceil($len / $const_Bsize); - // Step 3 - if ($n == 0) { - $n = 1; - $flag = false; - } else { - $flag = $len % $const_Bsize == 0; - } - // Step 4 - $M_last = $flag ? - $M[$n - 1] ^ $k1 : - self::OMAC_padding($M[$n - 1], $const_Bsize) ^ $k2; - // Step 5 - $x = $constZero; - // Step 6 - $c = &$this->c; - for ($i = 0; $i < $n - 1; $i++) { - $y = $x ^ $M[$i]; - $x = $c->encrypt($y); - } - $y = $M_last ^ $x; - return $c->encrypt($y); - } - if ($algo == 'umac') { - if ($this->recomputeAESKey) { - if (!is_string($this->nonce)) { - throw new InsufficientSetupException('No nonce has been set'); - } - if (!is_string($this->key)) { - throw new InsufficientSetupException('No key has been set'); - } - if (strlen($this->key) != 16) { - throw new \LengthException('Key must be 16 bytes long'); - } - - if (!isset(self::$maxwordrange64)) { - $one = new BigInteger(1); - - $prime36 = new BigInteger("\x00\x00\x00\x0F\xFF\xFF\xFF\xFB", 256); - self::$factory36 = new PrimeField($prime36); - - $prime64 = new BigInteger("\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xC5", 256); - self::$factory64 = new PrimeField($prime64); - - $prime128 = new BigInteger("\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\x61", 256); - self::$factory128 = new PrimeField($prime128); - - self::$offset64 = new BigInteger("\1\0\0\0\0\0\0\0\0", 256); - self::$offset64 = self::$factory64->newInteger(self::$offset64->subtract($prime64)); - self::$offset128 = new BigInteger("\1\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 256); - self::$offset128 = self::$factory128->newInteger(self::$offset128->subtract($prime128)); - - self::$marker64 = self::$factory64->newInteger($prime64->subtract($one)); - self::$marker128 = self::$factory128->newInteger($prime128->subtract($one)); - - $maxwordrange64 = $one->bitwise_leftShift(64)->subtract($one->bitwise_leftShift(32)); - self::$maxwordrange64 = self::$factory64->newInteger($maxwordrange64); - - $maxwordrange128 = $one->bitwise_leftShift(128)->subtract($one->bitwise_leftShift(96)); - self::$maxwordrange128 = self::$factory128->newInteger($maxwordrange128); - } - - $this->c = new AES('ctr'); - $this->c->disablePadding(); - $this->c->setKey($this->key); - - $this->pad = $this->pdf(); - - $this->recomputeAESKey = false; - } - - $hashedmessage = $this->uhash($text, $this->length); - return $hashedmessage ^ $this->pad; - } - - if (is_array($algo)) { - if (empty($this->key) || !is_string($this->key)) { - return substr($algo($text, ...array_values($this->parameters)), 0, $this->length); - } - - // SHA3 HMACs are discussed at https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf#page=30 - - $key = str_pad($this->computedKey, $b, chr(0)); - $temp = $this->ipad ^ $key; - $temp .= $text; - $temp = substr($algo($temp, ...array_values($this->parameters)), 0, $this->length); - $output = $this->opad ^ $key; - $output .= $temp; - $output = $algo($output, ...array_values($this->parameters)); - - return substr($output, 0, $this->length); - } - - $output = !empty($this->key) || is_string($this->key) ? - hash_hmac($algo, $text, $this->computedKey, true) : - hash($algo, $text, true); - - return strlen($output) > $this->length - ? substr($output, 0, $this->length) - : $output; - } - - /** - * Returns the hash length (in bits) - * - * @return int - */ - public function getLength() - { - return $this->length << 3; - } - - /** - * Returns the hash length (in bytes) - * - * @return int - */ - public function getLengthInBytes() - { - return $this->length; - } - - /** - * Returns the block length (in bits) - * - * @return int - */ - public function getBlockLength() - { - return $this->blockSize; - } - - /** - * Returns the block length (in bytes) - * - * @return int - */ - public function getBlockLengthInBytes() - { - return $this->blockSize >> 3; - } - - /** - * Pads SHA3 based on the mode - * - * @param int $padLength - * @param int $padType - * @return string - */ - private static function sha3_pad($padLength, $padType) - { - switch ($padType) { - case self::PADDING_KECCAK: - $temp = chr(0x01) . str_repeat("\0", $padLength - 1); - $temp[$padLength - 1] = $temp[$padLength - 1] | chr(0x80); - return $temp; - case self::PADDING_SHAKE: - $temp = chr(0x1F) . str_repeat("\0", $padLength - 1); - $temp[$padLength - 1] = $temp[$padLength - 1] | chr(0x80); - return $temp; - //case self::PADDING_SHA3: - default: - // from https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf#page=36 - return $padLength == 1 ? chr(0x86) : chr(0x06) . str_repeat("\0", $padLength - 2) . chr(0x80); - } - } - - /** - * Pure-PHP 32-bit implementation of SHA3 - * - * Whereas BigInteger.php's 32-bit engine works on PHP 64-bit this 32-bit implementation - * of SHA3 will *not* work on PHP 64-bit. This is because this implementation - * employees bitwise NOTs and bitwise left shifts. And the round constants only work - * on 32-bit PHP. eg. dechex(-2147483648) returns 80000000 on 32-bit PHP and - * FFFFFFFF80000000 on 64-bit PHP. Sure, we could do bitwise ANDs but that would slow - * things down. - * - * SHA512 requires BigInteger to simulate 64-bit unsigned integers because SHA2 employees - * addition whereas SHA3 just employees bitwise operators. PHP64 only supports signed - * 64-bit integers, which complicates addition, whereas that limitation isn't an issue - * for SHA3. - * - * In https://ws680.nist.gov/publication/get_pdf.cfm?pub_id=919061#page=16 KECCAK[C] is - * defined as "the KECCAK instance with KECCAK-f[1600] as the underlying permutation and - * capacity c". This is relevant because, altho the KECCAK standard defines a mode - * (KECCAK-f[800]) designed for 32-bit machines that mode is incompatible with SHA3 - * - * @param string $p - * @param int $c - * @param int $r - * @param int $d - * @param int $padType - */ - private static function sha3_32($p, $c, $r, $d, $padType) - { - $block_size = $r >> 3; - $padLength = $block_size - (strlen($p) % $block_size); - $num_ints = $block_size >> 2; - - $p .= static::sha3_pad($padLength, $padType); - - $n = strlen($p) / $r; // number of blocks - - $s = [ - [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], - [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], - [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], - [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]], - [[0, 0], [0, 0], [0, 0], [0, 0], [0, 0]] - ]; - - $p = str_split($p, $block_size); - - foreach ($p as $pi) { - $pi = unpack('V*', $pi); - $x = $y = 0; - for ($i = 1; $i <= $num_ints; $i += 2) { - $s[$x][$y][0] ^= $pi[$i + 1]; - $s[$x][$y][1] ^= $pi[$i]; - if (++$y == 5) { - $y = 0; - $x++; - } - } - static::processSHA3Block32($s); - } - - $z = ''; - $i = $j = 0; - while (strlen($z) < $d) { - $z .= pack('V2', $s[$i][$j][1], $s[$i][$j++][0]); - if ($j == 5) { - $j = 0; - $i++; - if ($i == 5) { - $i = 0; - static::processSHA3Block32($s); - } - } - } - - return $z; - } - - /** - * 32-bit block processing method for SHA3 - * - * @param array $s - */ - private static function processSHA3Block32(&$s) - { - static $rotationOffsets = [ - [ 0, 1, 62, 28, 27], - [36, 44, 6, 55, 20], - [ 3, 10, 43, 25, 39], - [41, 45, 15, 21, 8], - [18, 2, 61, 56, 14] - ]; - - // the standards give these constants in hexadecimal notation. it's tempting to want to use - // that same notation, here, however, we can't, because 0x80000000, on PHP32, is a positive - // float - not the negative int that we need to be in PHP32. so we use -2147483648 instead - static $roundConstants = [ - [0, 1], - [0, 32898], - [-2147483648, 32906], - [-2147483648, -2147450880], - [0, 32907], - [0, -2147483647], - [-2147483648, -2147450751], - [-2147483648, 32777], - [0, 138], - [0, 136], - [0, -2147450871], - [0, -2147483638], - [0, -2147450741], - [-2147483648, 139], - [-2147483648, 32905], - [-2147483648, 32771], - [-2147483648, 32770], - [-2147483648, 128], - [0, 32778], - [-2147483648, -2147483638], - [-2147483648, -2147450751], - [-2147483648, 32896], - [0, -2147483647], - [-2147483648, -2147450872] - ]; - - for ($round = 0; $round < 24; $round++) { - // theta step - $parity = $rotated = []; - for ($i = 0; $i < 5; $i++) { - $parity[] = [ - $s[0][$i][0] ^ $s[1][$i][0] ^ $s[2][$i][0] ^ $s[3][$i][0] ^ $s[4][$i][0], - $s[0][$i][1] ^ $s[1][$i][1] ^ $s[2][$i][1] ^ $s[3][$i][1] ^ $s[4][$i][1] - ]; - $rotated[] = static::rotateLeft32($parity[$i], 1); - } - - $temp = [ - [$parity[4][0] ^ $rotated[1][0], $parity[4][1] ^ $rotated[1][1]], - [$parity[0][0] ^ $rotated[2][0], $parity[0][1] ^ $rotated[2][1]], - [$parity[1][0] ^ $rotated[3][0], $parity[1][1] ^ $rotated[3][1]], - [$parity[2][0] ^ $rotated[4][0], $parity[2][1] ^ $rotated[4][1]], - [$parity[3][0] ^ $rotated[0][0], $parity[3][1] ^ $rotated[0][1]] - ]; - for ($i = 0; $i < 5; $i++) { - for ($j = 0; $j < 5; $j++) { - $s[$i][$j][0] ^= $temp[$j][0]; - $s[$i][$j][1] ^= $temp[$j][1]; - } - } - - $st = $s; - - // rho and pi steps - for ($i = 0; $i < 5; $i++) { - for ($j = 0; $j < 5; $j++) { - $st[(2 * $i + 3 * $j) % 5][$j] = static::rotateLeft32($s[$j][$i], $rotationOffsets[$j][$i]); - } - } - - // chi step - for ($i = 0; $i < 5; $i++) { - $s[$i][0] = [ - $st[$i][0][0] ^ (~$st[$i][1][0] & $st[$i][2][0]), - $st[$i][0][1] ^ (~$st[$i][1][1] & $st[$i][2][1]) - ]; - $s[$i][1] = [ - $st[$i][1][0] ^ (~$st[$i][2][0] & $st[$i][3][0]), - $st[$i][1][1] ^ (~$st[$i][2][1] & $st[$i][3][1]) - ]; - $s[$i][2] = [ - $st[$i][2][0] ^ (~$st[$i][3][0] & $st[$i][4][0]), - $st[$i][2][1] ^ (~$st[$i][3][1] & $st[$i][4][1]) - ]; - $s[$i][3] = [ - $st[$i][3][0] ^ (~$st[$i][4][0] & $st[$i][0][0]), - $st[$i][3][1] ^ (~$st[$i][4][1] & $st[$i][0][1]) - ]; - $s[$i][4] = [ - $st[$i][4][0] ^ (~$st[$i][0][0] & $st[$i][1][0]), - $st[$i][4][1] ^ (~$st[$i][0][1] & $st[$i][1][1]) - ]; - } - - // iota step - $s[0][0][0] ^= $roundConstants[$round][0]; - $s[0][0][1] ^= $roundConstants[$round][1]; - } - } - - /** - * Rotate 32-bit int - * - * @param array $x - * @param int $shift - */ - private static function rotateLeft32($x, $shift) - { - if ($shift < 32) { - list($hi, $lo) = $x; - } else { - $shift -= 32; - list($lo, $hi) = $x; - } - - $mask = -1 ^ (-1 << $shift); - return [ - ($hi << $shift) | (($lo >> (32 - $shift)) & $mask), - ($lo << $shift) | (($hi >> (32 - $shift)) & $mask) - ]; - } - - /** - * Pure-PHP 64-bit implementation of SHA3 - * - * @param string $p - * @param int $c - * @param int $r - * @param int $d - * @param int $padType - */ - private static function sha3_64($p, $c, $r, $d, $padType) - { - $block_size = $r >> 3; - $padLength = $block_size - (strlen($p) % $block_size); - $num_ints = $block_size >> 2; - - $p .= static::sha3_pad($padLength, $padType); - - $n = strlen($p) / $r; // number of blocks - - $s = [ - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0], - [0, 0, 0, 0, 0] - ]; - - $p = str_split($p, $block_size); - - foreach ($p as $pi) { - $pi = unpack('P*', $pi); - $x = $y = 0; - foreach ($pi as $subpi) { - $s[$x][$y++] ^= $subpi; - if ($y == 5) { - $y = 0; - $x++; - } - } - static::processSHA3Block64($s); - } - - $z = ''; - $i = $j = 0; - while (strlen($z) < $d) { - $z .= pack('P', $s[$i][$j++]); - if ($j == 5) { - $j = 0; - $i++; - if ($i == 5) { - $i = 0; - static::processSHA3Block64($s); - } - } - } - - return $z; - } - - /** - * 64-bit block processing method for SHA3 - * - * @param array $s - */ - private static function processSHA3Block64(&$s) - { - static $rotationOffsets = [ - [ 0, 1, 62, 28, 27], - [36, 44, 6, 55, 20], - [ 3, 10, 43, 25, 39], - [41, 45, 15, 21, 8], - [18, 2, 61, 56, 14] - ]; - - static $roundConstants = [ - 1, - 32898, - -9223372036854742902, - -9223372034707259392, - 32907, - 2147483649, - -9223372034707259263, - -9223372036854743031, - 138, - 136, - 2147516425, - 2147483658, - 2147516555, - -9223372036854775669, - -9223372036854742903, - -9223372036854743037, - -9223372036854743038, - -9223372036854775680, - 32778, - -9223372034707292150, - -9223372034707259263, - -9223372036854742912, - 2147483649, - -9223372034707259384 - ]; - - for ($round = 0; $round < 24; $round++) { - // theta step - $parity = []; - for ($i = 0; $i < 5; $i++) { - $parity[] = $s[0][$i] ^ $s[1][$i] ^ $s[2][$i] ^ $s[3][$i] ^ $s[4][$i]; - } - $temp = [ - $parity[4] ^ static::rotateLeft64($parity[1], 1), - $parity[0] ^ static::rotateLeft64($parity[2], 1), - $parity[1] ^ static::rotateLeft64($parity[3], 1), - $parity[2] ^ static::rotateLeft64($parity[4], 1), - $parity[3] ^ static::rotateLeft64($parity[0], 1) - ]; - for ($i = 0; $i < 5; $i++) { - for ($j = 0; $j < 5; $j++) { - $s[$i][$j] ^= $temp[$j]; - } - } - - $st = $s; - - // rho and pi steps - for ($i = 0; $i < 5; $i++) { - for ($j = 0; $j < 5; $j++) { - $st[(2 * $i + 3 * $j) % 5][$j] = static::rotateLeft64($s[$j][$i], $rotationOffsets[$j][$i]); - } - } - - // chi step - for ($i = 0; $i < 5; $i++) { - $s[$i] = [ - $st[$i][0] ^ (~$st[$i][1] & $st[$i][2]), - $st[$i][1] ^ (~$st[$i][2] & $st[$i][3]), - $st[$i][2] ^ (~$st[$i][3] & $st[$i][4]), - $st[$i][3] ^ (~$st[$i][4] & $st[$i][0]), - $st[$i][4] ^ (~$st[$i][0] & $st[$i][1]) - ]; - } - - // iota step - $s[0][0] ^= $roundConstants[$round]; - } - } - - /** - * Left rotate 64-bit int - * - * @param int $x - * @param int $shift - */ - private static function rotateLeft64($x, $shift) - { - $mask = -1 ^ (-1 << $shift); - return ($x << $shift) | (($x >> (64 - $shift)) & $mask); - } - - /** - * Right rotate 64-bit int - * - * @param int $x - * @param int $shift - */ - private static function rotateRight64($x, $shift) - { - $mask = -1 ^ (-1 << (64 - $shift)); - return (($x >> $shift) & $mask) | ($x << (64 - $shift)); - } - - /** - * Pure-PHP implementation of SHA512 - * - * @param string $m - * @param array $hash - * @return string - */ - private static function sha512($m, $hash) - { - static $k; - - if (!isset($k)) { - // Initialize table of round constants - // (first 64 bits of the fractional parts of the cube roots of the first 80 primes 2..409) - $k = [ - '428a2f98d728ae22', '7137449123ef65cd', 'b5c0fbcfec4d3b2f', 'e9b5dba58189dbbc', - '3956c25bf348b538', '59f111f1b605d019', '923f82a4af194f9b', 'ab1c5ed5da6d8118', - 'd807aa98a3030242', '12835b0145706fbe', '243185be4ee4b28c', '550c7dc3d5ffb4e2', - '72be5d74f27b896f', '80deb1fe3b1696b1', '9bdc06a725c71235', 'c19bf174cf692694', - 'e49b69c19ef14ad2', 'efbe4786384f25e3', '0fc19dc68b8cd5b5', '240ca1cc77ac9c65', - '2de92c6f592b0275', '4a7484aa6ea6e483', '5cb0a9dcbd41fbd4', '76f988da831153b5', - '983e5152ee66dfab', 'a831c66d2db43210', 'b00327c898fb213f', 'bf597fc7beef0ee4', - 'c6e00bf33da88fc2', 'd5a79147930aa725', '06ca6351e003826f', '142929670a0e6e70', - '27b70a8546d22ffc', '2e1b21385c26c926', '4d2c6dfc5ac42aed', '53380d139d95b3df', - '650a73548baf63de', '766a0abb3c77b2a8', '81c2c92e47edaee6', '92722c851482353b', - 'a2bfe8a14cf10364', 'a81a664bbc423001', 'c24b8b70d0f89791', 'c76c51a30654be30', - 'd192e819d6ef5218', 'd69906245565a910', 'f40e35855771202a', '106aa07032bbd1b8', - '19a4c116b8d2d0c8', '1e376c085141ab53', '2748774cdf8eeb99', '34b0bcb5e19b48a8', - '391c0cb3c5c95a63', '4ed8aa4ae3418acb', '5b9cca4f7763e373', '682e6ff3d6b2b8a3', - '748f82ee5defb2fc', '78a5636f43172f60', '84c87814a1f0ab72', '8cc702081a6439ec', - '90befffa23631e28', 'a4506cebde82bde9', 'bef9a3f7b2c67915', 'c67178f2e372532b', - 'ca273eceea26619c', 'd186b8c721c0c207', 'eada7dd6cde0eb1e', 'f57d4f7fee6ed178', - '06f067aa72176fba', '0a637dc5a2c898a6', '113f9804bef90dae', '1b710b35131c471b', - '28db77f523047d84', '32caab7b40c72493', '3c9ebe0a15c9bebc', '431d67c49c100d4c', - '4cc5d4becb3e42b6', '597f299cfc657e2a', '5fcb6fab3ad6faec', '6c44198c4a475817' - ]; - - for ($i = 0; $i < 80; $i++) { - $k[$i] = new BigInteger($k[$i], 16); - } - } - - // Pre-processing - $length = strlen($m); - // to round to nearest 112 mod 128, we'll add 128 - (length + (128 - 112)) % 128 - $m .= str_repeat(chr(0), 128 - (($length + 16) & 0x7F)); - $m[$length] = chr(0x80); - // we don't support hashing strings 512MB long - $m .= pack('N4', 0, 0, 0, $length << 3); - - // Process the message in successive 1024-bit chunks - $chunks = str_split($m, 128); - foreach ($chunks as $chunk) { - $w = []; - for ($i = 0; $i < 16; $i++) { - $temp = new BigInteger(Strings::shift($chunk, 8), 256); - $temp->setPrecision(64); - $w[] = $temp; - } - - // Extend the sixteen 32-bit words into eighty 32-bit words - for ($i = 16; $i < 80; $i++) { - $temp = [ - $w[$i - 15]->bitwise_rightRotate(1), - $w[$i - 15]->bitwise_rightRotate(8), - $w[$i - 15]->bitwise_rightShift(7) - ]; - $s0 = $temp[0]->bitwise_xor($temp[1]); - $s0 = $s0->bitwise_xor($temp[2]); - $temp = [ - $w[$i - 2]->bitwise_rightRotate(19), - $w[$i - 2]->bitwise_rightRotate(61), - $w[$i - 2]->bitwise_rightShift(6) - ]; - $s1 = $temp[0]->bitwise_xor($temp[1]); - $s1 = $s1->bitwise_xor($temp[2]); - $w[$i] = clone $w[$i - 16]; - $w[$i] = $w[$i]->add($s0); - $w[$i] = $w[$i]->add($w[$i - 7]); - $w[$i] = $w[$i]->add($s1); - } - - // Initialize hash value for this chunk - $a = clone $hash[0]; - $b = clone $hash[1]; - $c = clone $hash[2]; - $d = clone $hash[3]; - $e = clone $hash[4]; - $f = clone $hash[5]; - $g = clone $hash[6]; - $h = clone $hash[7]; - - // Main loop - for ($i = 0; $i < 80; $i++) { - $temp = [ - $a->bitwise_rightRotate(28), - $a->bitwise_rightRotate(34), - $a->bitwise_rightRotate(39) - ]; - $s0 = $temp[0]->bitwise_xor($temp[1]); - $s0 = $s0->bitwise_xor($temp[2]); - $temp = [ - $a->bitwise_and($b), - $a->bitwise_and($c), - $b->bitwise_and($c) - ]; - $maj = $temp[0]->bitwise_xor($temp[1]); - $maj = $maj->bitwise_xor($temp[2]); - $t2 = $s0->add($maj); - - $temp = [ - $e->bitwise_rightRotate(14), - $e->bitwise_rightRotate(18), - $e->bitwise_rightRotate(41) - ]; - $s1 = $temp[0]->bitwise_xor($temp[1]); - $s1 = $s1->bitwise_xor($temp[2]); - $temp = [ - $e->bitwise_and($f), - $g->bitwise_and($e->bitwise_not()) - ]; - $ch = $temp[0]->bitwise_xor($temp[1]); - $t1 = $h->add($s1); - $t1 = $t1->add($ch); - $t1 = $t1->add($k[$i]); - $t1 = $t1->add($w[$i]); - - $h = clone $g; - $g = clone $f; - $f = clone $e; - $e = $d->add($t1); - $d = clone $c; - $c = clone $b; - $b = clone $a; - $a = $t1->add($t2); - } - - // Add this chunk's hash to result so far - $hash = [ - $hash[0]->add($a), - $hash[1]->add($b), - $hash[2]->add($c), - $hash[3]->add($d), - $hash[4]->add($e), - $hash[5]->add($f), - $hash[6]->add($g), - $hash[7]->add($h) - ]; - } - - // Produce the final hash value (big-endian) - // (\phpseclib3\Crypt\Hash::hash() trims the output for hashes but not for HMACs. as such, we trim the output here) - $temp = $hash[0]->toBytes() . $hash[1]->toBytes() . $hash[2]->toBytes() . $hash[3]->toBytes() . - $hash[4]->toBytes() . $hash[5]->toBytes() . $hash[6]->toBytes() . $hash[7]->toBytes(); - - return $temp; - } - - /** - * Pure-PHP implementation of SHA512 - * - * @param string $m - * @param array $hash - * @return string - */ - private static function sha512_64($m, $hash) - { - static $k; - - if (!isset($k)) { - // Initialize table of round constants - // (first 64 bits of the fractional parts of the cube roots of the first 80 primes 2..409) - $k = [ - '428a2f98d728ae22', '7137449123ef65cd', 'b5c0fbcfec4d3b2f', 'e9b5dba58189dbbc', - '3956c25bf348b538', '59f111f1b605d019', '923f82a4af194f9b', 'ab1c5ed5da6d8118', - 'd807aa98a3030242', '12835b0145706fbe', '243185be4ee4b28c', '550c7dc3d5ffb4e2', - '72be5d74f27b896f', '80deb1fe3b1696b1', '9bdc06a725c71235', 'c19bf174cf692694', - 'e49b69c19ef14ad2', 'efbe4786384f25e3', '0fc19dc68b8cd5b5', '240ca1cc77ac9c65', - '2de92c6f592b0275', '4a7484aa6ea6e483', '5cb0a9dcbd41fbd4', '76f988da831153b5', - '983e5152ee66dfab', 'a831c66d2db43210', 'b00327c898fb213f', 'bf597fc7beef0ee4', - 'c6e00bf33da88fc2', 'd5a79147930aa725', '06ca6351e003826f', '142929670a0e6e70', - '27b70a8546d22ffc', '2e1b21385c26c926', '4d2c6dfc5ac42aed', '53380d139d95b3df', - '650a73548baf63de', '766a0abb3c77b2a8', '81c2c92e47edaee6', '92722c851482353b', - 'a2bfe8a14cf10364', 'a81a664bbc423001', 'c24b8b70d0f89791', 'c76c51a30654be30', - 'd192e819d6ef5218', 'd69906245565a910', 'f40e35855771202a', '106aa07032bbd1b8', - '19a4c116b8d2d0c8', '1e376c085141ab53', '2748774cdf8eeb99', '34b0bcb5e19b48a8', - '391c0cb3c5c95a63', '4ed8aa4ae3418acb', '5b9cca4f7763e373', '682e6ff3d6b2b8a3', - '748f82ee5defb2fc', '78a5636f43172f60', '84c87814a1f0ab72', '8cc702081a6439ec', - '90befffa23631e28', 'a4506cebde82bde9', 'bef9a3f7b2c67915', 'c67178f2e372532b', - 'ca273eceea26619c', 'd186b8c721c0c207', 'eada7dd6cde0eb1e', 'f57d4f7fee6ed178', - '06f067aa72176fba', '0a637dc5a2c898a6', '113f9804bef90dae', '1b710b35131c471b', - '28db77f523047d84', '32caab7b40c72493', '3c9ebe0a15c9bebc', '431d67c49c100d4c', - '4cc5d4becb3e42b6', '597f299cfc657e2a', '5fcb6fab3ad6faec', '6c44198c4a475817' - ]; - - for ($i = 0; $i < 80; $i++) { - list(, $k[$i]) = unpack('J', pack('H*', $k[$i])); - } - } - - // Pre-processing - $length = strlen($m); - // to round to nearest 112 mod 128, we'll add 128 - (length + (128 - 112)) % 128 - $m .= str_repeat(chr(0), 128 - (($length + 16) & 0x7F)); - $m[$length] = chr(0x80); - // we don't support hashing strings 512MB long - $m .= pack('N4', 0, 0, 0, $length << 3); - - // Process the message in successive 1024-bit chunks - $chunks = str_split($m, 128); - foreach ($chunks as $chunk) { - $w = []; - for ($i = 0; $i < 16; $i++) { - list(, $w[]) = unpack('J', Strings::shift($chunk, 8)); - } - - // Extend the sixteen 32-bit words into eighty 32-bit words - for ($i = 16; $i < 80; $i++) { - $temp = [ - self::rotateRight64($w[$i - 15], 1), - self::rotateRight64($w[$i - 15], 8), - ($w[$i - 15] >> 7) & 0x01FFFFFFFFFFFFFF, - ]; - $s0 = $temp[0] ^ $temp[1] ^ $temp[2]; - $temp = [ - self::rotateRight64($w[$i - 2], 19), - self::rotateRight64($w[$i - 2], 61), - ($w[$i - 2] >> 6) & 0x03FFFFFFFFFFFFFF, - ]; - $s1 = $temp[0] ^ $temp[1] ^ $temp[2]; - - $w[$i] = $w[$i - 16]; - $w[$i] = self::add64($w[$i], $s0); - $w[$i] = self::add64($w[$i], $w[$i - 7]); - $w[$i] = self::add64($w[$i], $s1); - } - - // Initialize hash value for this chunk - list($a, $b, $c, $d, $e, $f, $g, $h) = $hash; - - // Main loop - for ($i = 0; $i < 80; $i++) { - $temp = [ - self::rotateRight64($a, 28), - self::rotateRight64($a, 34), - self::rotateRight64($a, 39), - ]; - $s0 = $temp[0] ^ $temp[1] ^ $temp[2]; - $temp = [$a & $b, $a & $c, $b & $c]; - $maj = $temp[0] ^ $temp[1] ^ $temp[2]; - $t2 = self::add64($s0, $maj); - - $temp = [ - self::rotateRight64($e, 14), - self::rotateRight64($e, 18), - self::rotateRight64($e, 41), - ]; - $s1 = $temp[0] ^ $temp[1] ^ $temp[2]; - $ch = ($e & $f) ^ ($g & ~$e); - $t1 = self::add64($h, $s1); - $t1 = self::add64($t1, $ch); - $t1 = self::add64($t1, $k[$i]); - $t1 = self::add64($t1, $w[$i]); - - $h = $g; - $g = $f; - $f = $e; - $e = self::add64($d, $t1); - $d = $c; - $c = $b; - $b = $a; - $a = self::add64($t1, $t2); - } - - // Add this chunk's hash to result so far - $hash = [ - self::add64($hash[0], $a), - self::add64($hash[1], $b), - self::add64($hash[2], $c), - self::add64($hash[3], $d), - self::add64($hash[4], $e), - self::add64($hash[5], $f), - self::add64($hash[6], $g), - self::add64($hash[7], $h), - ]; - } - - // Produce the final hash value (big-endian) - // (\phpseclib3\Crypt\Hash::hash() trims the output for hashes but not for HMACs. as such, we trim the output here) - return pack('J*', ...$hash); - } - - /** - * OMAC Padding - * - * @link https://www.rfc-editor.org/rfc/rfc4493.html#section-2.4 - */ - private static function OMAC_padding($m, $length) - { - $count = $length - strlen($m) - 1; - return "$m\x80" . str_repeat("\0", $count); - } - - /** - * __toString() magic method - */ - public function __toString() - { - return $this->getHash(); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/PublicKeyLoader.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/PublicKeyLoader.php deleted file mode 100644 index 4c75bcc..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/PublicKeyLoader.php +++ /dev/null @@ -1,112 +0,0 @@ - - * @copyright 2009 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\AsymmetricKey; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\PrivateKey; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\PublicKey; -use OCA\Libresign\Vendor\phpseclib3\Exception\NoKeyLoadedException; -use OCA\Libresign\Vendor\phpseclib3\File\X509; - -/** - * PublicKeyLoader - * - * @author Jim Wigginton - */ -abstract class PublicKeyLoader -{ - /** - * Loads a public or private key - * - * @return AsymmetricKey - * @param string|array $key - * @param string $password optional - * @throws NoKeyLoadedException if key is not valid - */ - public static function load($key, $password = false) - { - try { - return EC::load($key, $password); - } catch (NoKeyLoadedException $e) { - } - - try { - return RSA::load($key, $password); - } catch (NoKeyLoadedException $e) { - } - - try { - return DSA::load($key, $password); - } catch (NoKeyLoadedException $e) { - } - - try { - $x509 = new X509(); - $x509->loadX509($key); - $key = $x509->getPublicKey(); - if ($key) { - return $key; - } - } catch (\Exception $e) { - } - - throw new NoKeyLoadedException('Unable to read key'); - } - - /** - * Loads a private key - * - * @return PrivateKey - * @param string|array $key - * @param string $password optional - */ - public static function loadPrivateKey($key, $password = false) - { - $key = self::load($key, $password); - if (!$key instanceof PrivateKey) { - throw new NoKeyLoadedException('The key that was loaded was not a private key'); - } - return $key; - } - - /** - * Loads a public key - * - * @return PublicKey - * @param string|array $key - */ - public static function loadPublicKey($key) - { - $key = self::load($key); - if (!$key instanceof PublicKey) { - throw new NoKeyLoadedException('The key that was loaded was not a public key'); - } - return $key; - } - - /** - * Loads parameters - * - * @return AsymmetricKey - * @param string|array $key - */ - public static function loadParameters($key) - { - $key = self::load($key); - if (!$key instanceof PrivateKey && !$key instanceof PublicKey) { - throw new NoKeyLoadedException('The key that was loaded was not a parameter'); - } - return $key; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/RC2.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/RC2.php deleted file mode 100644 index 95f03a2..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/RC2.php +++ /dev/null @@ -1,640 +0,0 @@ - - * setKey('abcdefgh'); - * - * $plaintext = str_repeat('a', 1024); - * - * echo $rc2->decrypt($rc2->encrypt($plaintext)); - * ?> - * - * - * @author Patrick Monnerat - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\BlockCipher; -use OCA\Libresign\Vendor\phpseclib3\Exception\BadModeException; - -/** - * Pure-PHP implementation of RC2. - * - */ -class RC2 extends BlockCipher -{ - /** - * Block Length of the cipher - * - * @see Common\SymmetricKey::block_size - * @var int - */ - protected $block_size = 8; - - /** - * The Key - * - * @see Common\SymmetricKey::key - * @see self::setKey() - * @var string - */ - protected $key; - - /** - * The Original (unpadded) Key - * - * @see Common\SymmetricKey::key - * @see self::setKey() - * @see self::encrypt() - * @see self::decrypt() - * @var string - */ - private $orig_key; - - /** - * Key Length (in bytes) - * - * @see \phpseclib3\Crypt\RC2::setKeyLength() - * @var int - */ - protected $key_length = 16; // = 128 bits - - /** - * The mcrypt specific name of the cipher - * - * @see Common\SymmetricKey::cipher_name_mcrypt - * @var string - */ - protected $cipher_name_mcrypt = 'rc2'; - - /** - * Optimizing value while CFB-encrypting - * - * @see Common\SymmetricKey::cfb_init_len - * @var int - */ - protected $cfb_init_len = 500; - - /** - * The key length in bits. - * - * {@internal Should be in range [1..1024].} - * - * {@internal Changing this value after setting the key has no effect.} - * - * @see self::setKeyLength() - * @see self::setKey() - * @var int - */ - private $default_key_length = 1024; - - /** - * The key length in bits. - * - * {@internal Should be in range [1..1024].} - * - * @see self::isValidEnine() - * @see self::setKey() - * @var int - */ - private $current_key_length; - - /** - * The Key Schedule - * - * @see self::setupKey() - * @var array - */ - private $keys; - - /** - * Key expansion randomization table. - * Twice the same 256-value sequence to save a modulus in key expansion. - * - * @see self::setKey() - * @var array - */ - private static $pitable = [ - 0xD9, 0x78, 0xF9, 0xC4, 0x19, 0xDD, 0xB5, 0xED, - 0x28, 0xE9, 0xFD, 0x79, 0x4A, 0xA0, 0xD8, 0x9D, - 0xC6, 0x7E, 0x37, 0x83, 0x2B, 0x76, 0x53, 0x8E, - 0x62, 0x4C, 0x64, 0x88, 0x44, 0x8B, 0xFB, 0xA2, - 0x17, 0x9A, 0x59, 0xF5, 0x87, 0xB3, 0x4F, 0x13, - 0x61, 0x45, 0x6D, 0x8D, 0x09, 0x81, 0x7D, 0x32, - 0xBD, 0x8F, 0x40, 0xEB, 0x86, 0xB7, 0x7B, 0x0B, - 0xF0, 0x95, 0x21, 0x22, 0x5C, 0x6B, 0x4E, 0x82, - 0x54, 0xD6, 0x65, 0x93, 0xCE, 0x60, 0xB2, 0x1C, - 0x73, 0x56, 0xC0, 0x14, 0xA7, 0x8C, 0xF1, 0xDC, - 0x12, 0x75, 0xCA, 0x1F, 0x3B, 0xBE, 0xE4, 0xD1, - 0x42, 0x3D, 0xD4, 0x30, 0xA3, 0x3C, 0xB6, 0x26, - 0x6F, 0xBF, 0x0E, 0xDA, 0x46, 0x69, 0x07, 0x57, - 0x27, 0xF2, 0x1D, 0x9B, 0xBC, 0x94, 0x43, 0x03, - 0xF8, 0x11, 0xC7, 0xF6, 0x90, 0xEF, 0x3E, 0xE7, - 0x06, 0xC3, 0xD5, 0x2F, 0xC8, 0x66, 0x1E, 0xD7, - 0x08, 0xE8, 0xEA, 0xDE, 0x80, 0x52, 0xEE, 0xF7, - 0x84, 0xAA, 0x72, 0xAC, 0x35, 0x4D, 0x6A, 0x2A, - 0x96, 0x1A, 0xD2, 0x71, 0x5A, 0x15, 0x49, 0x74, - 0x4B, 0x9F, 0xD0, 0x5E, 0x04, 0x18, 0xA4, 0xEC, - 0xC2, 0xE0, 0x41, 0x6E, 0x0F, 0x51, 0xCB, 0xCC, - 0x24, 0x91, 0xAF, 0x50, 0xA1, 0xF4, 0x70, 0x39, - 0x99, 0x7C, 0x3A, 0x85, 0x23, 0xB8, 0xB4, 0x7A, - 0xFC, 0x02, 0x36, 0x5B, 0x25, 0x55, 0x97, 0x31, - 0x2D, 0x5D, 0xFA, 0x98, 0xE3, 0x8A, 0x92, 0xAE, - 0x05, 0xDF, 0x29, 0x10, 0x67, 0x6C, 0xBA, 0xC9, - 0xD3, 0x00, 0xE6, 0xCF, 0xE1, 0x9E, 0xA8, 0x2C, - 0x63, 0x16, 0x01, 0x3F, 0x58, 0xE2, 0x89, 0xA9, - 0x0D, 0x38, 0x34, 0x1B, 0xAB, 0x33, 0xFF, 0xB0, - 0xBB, 0x48, 0x0C, 0x5F, 0xB9, 0xB1, 0xCD, 0x2E, - 0xC5, 0xF3, 0xDB, 0x47, 0xE5, 0xA5, 0x9C, 0x77, - 0x0A, 0xA6, 0x20, 0x68, 0xFE, 0x7F, 0xC1, 0xAD, - 0xD9, 0x78, 0xF9, 0xC4, 0x19, 0xDD, 0xB5, 0xED, - 0x28, 0xE9, 0xFD, 0x79, 0x4A, 0xA0, 0xD8, 0x9D, - 0xC6, 0x7E, 0x37, 0x83, 0x2B, 0x76, 0x53, 0x8E, - 0x62, 0x4C, 0x64, 0x88, 0x44, 0x8B, 0xFB, 0xA2, - 0x17, 0x9A, 0x59, 0xF5, 0x87, 0xB3, 0x4F, 0x13, - 0x61, 0x45, 0x6D, 0x8D, 0x09, 0x81, 0x7D, 0x32, - 0xBD, 0x8F, 0x40, 0xEB, 0x86, 0xB7, 0x7B, 0x0B, - 0xF0, 0x95, 0x21, 0x22, 0x5C, 0x6B, 0x4E, 0x82, - 0x54, 0xD6, 0x65, 0x93, 0xCE, 0x60, 0xB2, 0x1C, - 0x73, 0x56, 0xC0, 0x14, 0xA7, 0x8C, 0xF1, 0xDC, - 0x12, 0x75, 0xCA, 0x1F, 0x3B, 0xBE, 0xE4, 0xD1, - 0x42, 0x3D, 0xD4, 0x30, 0xA3, 0x3C, 0xB6, 0x26, - 0x6F, 0xBF, 0x0E, 0xDA, 0x46, 0x69, 0x07, 0x57, - 0x27, 0xF2, 0x1D, 0x9B, 0xBC, 0x94, 0x43, 0x03, - 0xF8, 0x11, 0xC7, 0xF6, 0x90, 0xEF, 0x3E, 0xE7, - 0x06, 0xC3, 0xD5, 0x2F, 0xC8, 0x66, 0x1E, 0xD7, - 0x08, 0xE8, 0xEA, 0xDE, 0x80, 0x52, 0xEE, 0xF7, - 0x84, 0xAA, 0x72, 0xAC, 0x35, 0x4D, 0x6A, 0x2A, - 0x96, 0x1A, 0xD2, 0x71, 0x5A, 0x15, 0x49, 0x74, - 0x4B, 0x9F, 0xD0, 0x5E, 0x04, 0x18, 0xA4, 0xEC, - 0xC2, 0xE0, 0x41, 0x6E, 0x0F, 0x51, 0xCB, 0xCC, - 0x24, 0x91, 0xAF, 0x50, 0xA1, 0xF4, 0x70, 0x39, - 0x99, 0x7C, 0x3A, 0x85, 0x23, 0xB8, 0xB4, 0x7A, - 0xFC, 0x02, 0x36, 0x5B, 0x25, 0x55, 0x97, 0x31, - 0x2D, 0x5D, 0xFA, 0x98, 0xE3, 0x8A, 0x92, 0xAE, - 0x05, 0xDF, 0x29, 0x10, 0x67, 0x6C, 0xBA, 0xC9, - 0xD3, 0x00, 0xE6, 0xCF, 0xE1, 0x9E, 0xA8, 0x2C, - 0x63, 0x16, 0x01, 0x3F, 0x58, 0xE2, 0x89, 0xA9, - 0x0D, 0x38, 0x34, 0x1B, 0xAB, 0x33, 0xFF, 0xB0, - 0xBB, 0x48, 0x0C, 0x5F, 0xB9, 0xB1, 0xCD, 0x2E, - 0xC5, 0xF3, 0xDB, 0x47, 0xE5, 0xA5, 0x9C, 0x77, - 0x0A, 0xA6, 0x20, 0x68, 0xFE, 0x7F, 0xC1, 0xAD - ]; - - /** - * Inverse key expansion randomization table. - * - * @see self::setKey() - * @var array - */ - private static $invpitable = [ - 0xD1, 0xDA, 0xB9, 0x6F, 0x9C, 0xC8, 0x78, 0x66, - 0x80, 0x2C, 0xF8, 0x37, 0xEA, 0xE0, 0x62, 0xA4, - 0xCB, 0x71, 0x50, 0x27, 0x4B, 0x95, 0xD9, 0x20, - 0x9D, 0x04, 0x91, 0xE3, 0x47, 0x6A, 0x7E, 0x53, - 0xFA, 0x3A, 0x3B, 0xB4, 0xA8, 0xBC, 0x5F, 0x68, - 0x08, 0xCA, 0x8F, 0x14, 0xD7, 0xC0, 0xEF, 0x7B, - 0x5B, 0xBF, 0x2F, 0xE5, 0xE2, 0x8C, 0xBA, 0x12, - 0xE1, 0xAF, 0xB2, 0x54, 0x5D, 0x59, 0x76, 0xDB, - 0x32, 0xA2, 0x58, 0x6E, 0x1C, 0x29, 0x64, 0xF3, - 0xE9, 0x96, 0x0C, 0x98, 0x19, 0x8D, 0x3E, 0x26, - 0xAB, 0xA5, 0x85, 0x16, 0x40, 0xBD, 0x49, 0x67, - 0xDC, 0x22, 0x94, 0xBB, 0x3C, 0xC1, 0x9B, 0xEB, - 0x45, 0x28, 0x18, 0xD8, 0x1A, 0x42, 0x7D, 0xCC, - 0xFB, 0x65, 0x8E, 0x3D, 0xCD, 0x2A, 0xA3, 0x60, - 0xAE, 0x93, 0x8A, 0x48, 0x97, 0x51, 0x15, 0xF7, - 0x01, 0x0B, 0xB7, 0x36, 0xB1, 0x2E, 0x11, 0xFD, - 0x84, 0x2D, 0x3F, 0x13, 0x88, 0xB3, 0x34, 0x24, - 0x1B, 0xDE, 0xC5, 0x1D, 0x4D, 0x2B, 0x17, 0x31, - 0x74, 0xA9, 0xC6, 0x43, 0x6D, 0x39, 0x90, 0xBE, - 0xC3, 0xB0, 0x21, 0x6B, 0xF6, 0x0F, 0xD5, 0x99, - 0x0D, 0xAC, 0x1F, 0x5C, 0x9E, 0xF5, 0xF9, 0x4C, - 0xD6, 0xDF, 0x89, 0xE4, 0x8B, 0xFF, 0xC7, 0xAA, - 0xE7, 0xED, 0x46, 0x25, 0xB6, 0x06, 0x5E, 0x35, - 0xB5, 0xEC, 0xCE, 0xE8, 0x6C, 0x30, 0x55, 0x61, - 0x4A, 0xFE, 0xA0, 0x79, 0x03, 0xF0, 0x10, 0x72, - 0x7C, 0xCF, 0x52, 0xA6, 0xA7, 0xEE, 0x44, 0xD3, - 0x9A, 0x57, 0x92, 0xD0, 0x5A, 0x7A, 0x41, 0x7F, - 0x0E, 0x00, 0x63, 0xF2, 0x4F, 0x05, 0x83, 0xC9, - 0xA1, 0xD4, 0xDD, 0xC4, 0x56, 0xF4, 0xD2, 0x77, - 0x81, 0x09, 0x82, 0x33, 0x9F, 0x07, 0x86, 0x75, - 0x38, 0x4E, 0x69, 0xF1, 0xAD, 0x23, 0x73, 0x87, - 0x70, 0x02, 0xC2, 0x1E, 0xB8, 0x0A, 0xFC, 0xE6 - ]; - - /** - * Default Constructor. - * - * @param string $mode - * @throws \InvalidArgumentException if an invalid / unsupported mode is provided - */ - public function __construct($mode) - { - parent::__construct($mode); - - if ($this->mode == self::MODE_STREAM) { - throw new BadModeException('Block ciphers cannot be ran in stream mode'); - } - } - - /** - * Test for engine validity - * - * This is mainly just a wrapper to set things up for \phpseclib3\Crypt\Common\SymmetricKey::isValidEngine() - * - * @see Common\SymmetricKey::__construct() - * @param int $engine - * @return bool - */ - protected function isValidEngineHelper($engine) - { - switch ($engine) { - case self::ENGINE_OPENSSL: - if ($this->current_key_length != 128 || strlen($this->orig_key) < 16) { - return false; - } - // quoting https://www.openssl.org/news/openssl-3.0-notes.html, OpenSSL 3.0.1 - // "Moved all variations of the EVP ciphers CAST5, BF, IDEA, SEED, RC2, RC4, RC5, and DES to the legacy provider" - // in theory openssl_get_cipher_methods() should catch this but, on GitHub Actions, at least, it does not - if (defined('OPENSSL_VERSION_TEXT') && version_compare(preg_replace('#OpenSSL (\d+\.\d+\.\d+) .*#', '$1', OPENSSL_VERSION_TEXT), '3.0.1', '>=')) { - return false; - } - $this->cipher_name_openssl_ecb = 'rc2-ecb'; - $this->cipher_name_openssl = 'rc2-' . $this->openssl_translate_mode(); - } - - return parent::isValidEngineHelper($engine); - } - - /** - * Sets the key length. - * - * Valid key lengths are 8 to 1024. - * Calling this function after setting the key has no effect until the next - * \phpseclib3\Crypt\RC2::setKey() call. - * - * @param int $length in bits - * @throws \LengthException if the key length isn't supported - */ - public function setKeyLength($length) - { - if ($length < 8 || $length > 1024) { - throw new \LengthException('Key size of ' . $length . ' bits is not supported by this algorithm. Only keys between 1 and 1024 bits, inclusive, are supported'); - } - - $this->default_key_length = $this->current_key_length = $length; - $this->explicit_key_length = $length >> 3; - } - - /** - * Returns the current key length - * - * @return int - */ - public function getKeyLength() - { - return $this->current_key_length; - } - - /** - * Sets the key. - * - * Keys can be of any length. RC2, itself, uses 8 to 1024 bit keys (eg. - * strlen($key) <= 128), however, we only use the first 128 bytes if $key - * has more then 128 bytes in it, and set $key to a single null byte if - * it is empty. - * - * @see Common\SymmetricKey::setKey() - * @param string $key - * @param int|boolean $t1 optional Effective key length in bits. - * @throws \LengthException if the key length isn't supported - */ - public function setKey($key, $t1 = false) - { - $this->orig_key = $key; - - if ($t1 === false) { - $t1 = $this->default_key_length; - } - - if ($t1 < 1 || $t1 > 1024) { - throw new \LengthException('Key size of ' . $length . ' bits is not supported by this algorithm. Only keys between 1 and 1024 bits, inclusive, are supported'); - } - - $this->current_key_length = $t1; - if (strlen($key) < 1 || strlen($key) > 128) { - throw new \LengthException('Key of size ' . strlen($key) . ' not supported by this algorithm. Only keys of sizes between 8 and 1024 bits, inclusive, are supported'); - } - - $t = strlen($key); - - // The mcrypt RC2 implementation only supports effective key length - // of 1024 bits. It is however possible to handle effective key - // lengths in range 1..1024 by expanding the key and applying - // inverse pitable mapping to the first byte before submitting it - // to mcrypt. - - // Key expansion. - $l = array_values(unpack('C*', $key)); - $t8 = ($t1 + 7) >> 3; - $tm = 0xFF >> (8 * $t8 - $t1); - - // Expand key. - $pitable = self::$pitable; - for ($i = $t; $i < 128; $i++) { - $l[$i] = $pitable[$l[$i - 1] + $l[$i - $t]]; - } - $i = 128 - $t8; - $l[$i] = $pitable[$l[$i] & $tm]; - while ($i--) { - $l[$i] = $pitable[$l[$i + 1] ^ $l[$i + $t8]]; - } - - // Prepare the key for mcrypt. - $l[0] = self::$invpitable[$l[0]]; - array_unshift($l, 'C*'); - - $this->key = pack(...$l); - $this->key_length = strlen($this->key); - $this->changed = $this->nonIVChanged = true; - $this->setEngine(); - } - - /** - * Encrypts a message. - * - * Mostly a wrapper for \phpseclib3\Crypt\Common\SymmetricKey::encrypt, with some additional OpenSSL handling code - * - * @see self::decrypt() - * @param string $plaintext - * @return string $ciphertext - */ - public function encrypt($plaintext) - { - if ($this->engine == self::ENGINE_OPENSSL) { - $temp = $this->key; - $this->key = $this->orig_key; - $result = parent::encrypt($plaintext); - $this->key = $temp; - return $result; - } - - return parent::encrypt($plaintext); - } - - /** - * Decrypts a message. - * - * Mostly a wrapper for \phpseclib3\Crypt\Common\SymmetricKey::decrypt, with some additional OpenSSL handling code - * - * @see self::encrypt() - * @param string $ciphertext - * @return string $plaintext - */ - public function decrypt($ciphertext) - { - if ($this->engine == self::ENGINE_OPENSSL) { - $temp = $this->key; - $this->key = $this->orig_key; - $result = parent::decrypt($ciphertext); - $this->key = $temp; - return $result; - } - - return parent::decrypt($ciphertext); - } - - /** - * Encrypts a block - * - * @see Common\SymmetricKey::encryptBlock() - * @see Common\SymmetricKey::encrypt() - * @param string $in - * @return string - */ - protected function encryptBlock($in) - { - list($r0, $r1, $r2, $r3) = array_values(unpack('v*', $in)); - $keys = $this->keys; - $limit = 20; - $actions = [$limit => 44, 44 => 64]; - $j = 0; - - for (;;) { - // Mixing round. - $r0 = (($r0 + $keys[$j++] + ((($r1 ^ $r2) & $r3) ^ $r1)) & 0xFFFF) << 1; - $r0 |= $r0 >> 16; - $r1 = (($r1 + $keys[$j++] + ((($r2 ^ $r3) & $r0) ^ $r2)) & 0xFFFF) << 2; - $r1 |= $r1 >> 16; - $r2 = (($r2 + $keys[$j++] + ((($r3 ^ $r0) & $r1) ^ $r3)) & 0xFFFF) << 3; - $r2 |= $r2 >> 16; - $r3 = (($r3 + $keys[$j++] + ((($r0 ^ $r1) & $r2) ^ $r0)) & 0xFFFF) << 5; - $r3 |= $r3 >> 16; - - if ($j === $limit) { - if ($limit === 64) { - break; - } - - // Mashing round. - $r0 += $keys[$r3 & 0x3F]; - $r1 += $keys[$r0 & 0x3F]; - $r2 += $keys[$r1 & 0x3F]; - $r3 += $keys[$r2 & 0x3F]; - $limit = $actions[$limit]; - } - } - - return pack('vvvv', $r0, $r1, $r2, $r3); - } - - /** - * Decrypts a block - * - * @see Common\SymmetricKey::decryptBlock() - * @see Common\SymmetricKey::decrypt() - * @param string $in - * @return string - */ - protected function decryptBlock($in) - { - list($r0, $r1, $r2, $r3) = array_values(unpack('v*', $in)); - $keys = $this->keys; - $limit = 44; - $actions = [$limit => 20, 20 => 0]; - $j = 64; - - for (;;) { - // R-mixing round. - $r3 = ($r3 | ($r3 << 16)) >> 5; - $r3 = ($r3 - $keys[--$j] - ((($r0 ^ $r1) & $r2) ^ $r0)) & 0xFFFF; - $r2 = ($r2 | ($r2 << 16)) >> 3; - $r2 = ($r2 - $keys[--$j] - ((($r3 ^ $r0) & $r1) ^ $r3)) & 0xFFFF; - $r1 = ($r1 | ($r1 << 16)) >> 2; - $r1 = ($r1 - $keys[--$j] - ((($r2 ^ $r3) & $r0) ^ $r2)) & 0xFFFF; - $r0 = ($r0 | ($r0 << 16)) >> 1; - $r0 = ($r0 - $keys[--$j] - ((($r1 ^ $r2) & $r3) ^ $r1)) & 0xFFFF; - - if ($j === $limit) { - if ($limit === 0) { - break; - } - - // R-mashing round. - $r3 = ($r3 - $keys[$r2 & 0x3F]) & 0xFFFF; - $r2 = ($r2 - $keys[$r1 & 0x3F]) & 0xFFFF; - $r1 = ($r1 - $keys[$r0 & 0x3F]) & 0xFFFF; - $r0 = ($r0 - $keys[$r3 & 0x3F]) & 0xFFFF; - $limit = $actions[$limit]; - } - } - - return pack('vvvv', $r0, $r1, $r2, $r3); - } - - /** - * Creates the key schedule - * - * @see Common\SymmetricKey::setupKey() - */ - protected function setupKey() - { - if (!isset($this->key)) { - $this->setKey(''); - } - - // Key has already been expanded in \phpseclib3\Crypt\RC2::setKey(): - // Only the first value must be altered. - $l = unpack('Ca/Cb/v*', $this->key); - array_unshift($l, self::$pitable[$l['a']] | ($l['b'] << 8)); - unset($l['a']); - unset($l['b']); - $this->keys = $l; - } - - /** - * Setup the performance-optimized function for de/encrypt() - * - * @see Common\SymmetricKey::setupInlineCrypt() - */ - protected function setupInlineCrypt() - { - // Init code for both, encrypt and decrypt. - $init_crypt = '$keys = $this->keys;'; - - $keys = $this->keys; - - // $in is the current 8 bytes block which has to be en/decrypt - $encrypt_block = $decrypt_block = ' - $in = unpack("v4", $in); - $r0 = $in[1]; - $r1 = $in[2]; - $r2 = $in[3]; - $r3 = $in[4]; - '; - - // Create code for encryption. - $limit = 20; - $actions = [$limit => 44, 44 => 64]; - $j = 0; - - for (;;) { - // Mixing round. - $encrypt_block .= ' - $r0 = (($r0 + ' . $keys[$j++] . ' + - ((($r1 ^ $r2) & $r3) ^ $r1)) & 0xFFFF) << 1; - $r0 |= $r0 >> 16; - $r1 = (($r1 + ' . $keys[$j++] . ' + - ((($r2 ^ $r3) & $r0) ^ $r2)) & 0xFFFF) << 2; - $r1 |= $r1 >> 16; - $r2 = (($r2 + ' . $keys[$j++] . ' + - ((($r3 ^ $r0) & $r1) ^ $r3)) & 0xFFFF) << 3; - $r2 |= $r2 >> 16; - $r3 = (($r3 + ' . $keys[$j++] . ' + - ((($r0 ^ $r1) & $r2) ^ $r0)) & 0xFFFF) << 5; - $r3 |= $r3 >> 16;'; - - if ($j === $limit) { - if ($limit === 64) { - break; - } - - // Mashing round. - $encrypt_block .= ' - $r0 += $keys[$r3 & 0x3F]; - $r1 += $keys[$r0 & 0x3F]; - $r2 += $keys[$r1 & 0x3F]; - $r3 += $keys[$r2 & 0x3F];'; - $limit = $actions[$limit]; - } - } - - $encrypt_block .= '$in = pack("v4", $r0, $r1, $r2, $r3);'; - - // Create code for decryption. - $limit = 44; - $actions = [$limit => 20, 20 => 0]; - $j = 64; - - for (;;) { - // R-mixing round. - $decrypt_block .= ' - $r3 = ($r3 | ($r3 << 16)) >> 5; - $r3 = ($r3 - ' . $keys[--$j] . ' - - ((($r0 ^ $r1) & $r2) ^ $r0)) & 0xFFFF; - $r2 = ($r2 | ($r2 << 16)) >> 3; - $r2 = ($r2 - ' . $keys[--$j] . ' - - ((($r3 ^ $r0) & $r1) ^ $r3)) & 0xFFFF; - $r1 = ($r1 | ($r1 << 16)) >> 2; - $r1 = ($r1 - ' . $keys[--$j] . ' - - ((($r2 ^ $r3) & $r0) ^ $r2)) & 0xFFFF; - $r0 = ($r0 | ($r0 << 16)) >> 1; - $r0 = ($r0 - ' . $keys[--$j] . ' - - ((($r1 ^ $r2) & $r3) ^ $r1)) & 0xFFFF;'; - - if ($j === $limit) { - if ($limit === 0) { - break; - } - - // R-mashing round. - $decrypt_block .= ' - $r3 = ($r3 - $keys[$r2 & 0x3F]) & 0xFFFF; - $r2 = ($r2 - $keys[$r1 & 0x3F]) & 0xFFFF; - $r1 = ($r1 - $keys[$r0 & 0x3F]) & 0xFFFF; - $r0 = ($r0 - $keys[$r3 & 0x3F]) & 0xFFFF;'; - $limit = $actions[$limit]; - } - } - - $decrypt_block .= '$in = pack("v4", $r0, $r1, $r2, $r3);'; - - // Creates the inline-crypt function - $this->inline_crypt = $this->createInlineCryptFunction( - [ - 'init_crypt' => $init_crypt, - 'encrypt_block' => $encrypt_block, - 'decrypt_block' => $decrypt_block - ] - ); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/RC4.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/RC4.php deleted file mode 100644 index 9761d36..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/RC4.php +++ /dev/null @@ -1,280 +0,0 @@ - - * setKey('abcdefgh'); - * - * $size = 10 * 1024; - * $plaintext = ''; - * for ($i = 0; $i < $size; $i++) { - * $plaintext.= 'a'; - * } - * - * echo $rc4->decrypt($rc4->encrypt($plaintext)); - * ?> - * - * - * @author Jim Wigginton - * @copyright 2007 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\StreamCipher; - -/** - * Pure-PHP implementation of RC4. - * - * @author Jim Wigginton - */ -class RC4 extends StreamCipher -{ - /** - * @see \phpseclib3\Crypt\RC4::_crypt() - */ - const ENCRYPT = 0; - - /** - * @see \phpseclib3\Crypt\RC4::_crypt() - */ - const DECRYPT = 1; - - /** - * Key Length (in bytes) - * - * @see \phpseclib3\Crypt\RC4::setKeyLength() - * @var int - */ - protected $key_length = 128; // = 1024 bits - - /** - * The mcrypt specific name of the cipher - * - * @see Common\SymmetricKey::cipher_name_mcrypt - * @var string - */ - protected $cipher_name_mcrypt = 'arcfour'; - - /** - * The Key - * - * @see self::setKey() - * @var string - */ - protected $key; - - /** - * The Key Stream for decryption and encryption - * - * @see self::setKey() - * @var array - */ - private $stream; - - /** - * Test for engine validity - * - * This is mainly just a wrapper to set things up for \phpseclib3\Crypt\Common\SymmetricKey::isValidEngine() - * - * @see Common\SymmetricKey::__construct() - * @param int $engine - * @return bool - */ - protected function isValidEngineHelper($engine) - { - if ($engine == self::ENGINE_OPENSSL) { - if ($this->continuousBuffer) { - return false; - } - // quoting https://www.openssl.org/news/openssl-3.0-notes.html, OpenSSL 3.0.1 - // "Moved all variations of the EVP ciphers CAST5, BF, IDEA, SEED, RC2, RC4, RC5, and DES to the legacy provider" - // in theory openssl_get_cipher_methods() should catch this but, on GitHub Actions, at least, it does not - if (defined('OPENSSL_VERSION_TEXT') && version_compare(preg_replace('#OpenSSL (\d+\.\d+\.\d+) .*#', '$1', OPENSSL_VERSION_TEXT), '3.0.1', '>=')) { - return false; - } - $this->cipher_name_openssl = 'rc4-40'; - } - - return parent::isValidEngineHelper($engine); - } - - /** - * Sets the key length - * - * Keys can be between 1 and 256 bytes long. - * - * @param int $length - * @throws \LengthException if the key length is invalid - */ - public function setKeyLength($length) - { - if ($length < 8 || $length > 2048) { - throw new \LengthException('Key size of ' . $length . ' bits is not supported by this algorithm. Only keys between 1 and 256 bytes are supported'); - } - - $this->key_length = $length >> 3; - - parent::setKeyLength($length); - } - - /** - * Sets the key length - * - * Keys can be between 1 and 256 bytes long. - * - * @param string $key - */ - public function setKey($key) - { - $length = strlen($key); - if ($length < 1 || $length > 256) { - throw new \LengthException('Key size of ' . $length . ' bytes is not supported by RC4. Keys must be between 1 and 256 bytes long'); - } - - parent::setKey($key); - } - - /** - * Encrypts a message. - * - * @see Common\SymmetricKey::decrypt() - * @see self::crypt() - * @param string $plaintext - * @return string $ciphertext - */ - public function encrypt($plaintext) - { - if ($this->engine != self::ENGINE_INTERNAL) { - return parent::encrypt($plaintext); - } - return $this->crypt($plaintext, self::ENCRYPT); - } - - /** - * Decrypts a message. - * - * $this->decrypt($this->encrypt($plaintext)) == $this->encrypt($this->encrypt($plaintext)). - * At least if the continuous buffer is disabled. - * - * @see Common\SymmetricKey::encrypt() - * @see self::crypt() - * @param string $ciphertext - * @return string $plaintext - */ - public function decrypt($ciphertext) - { - if ($this->engine != self::ENGINE_INTERNAL) { - return parent::decrypt($ciphertext); - } - return $this->crypt($ciphertext, self::DECRYPT); - } - - /** - * Encrypts a block - * - * @param string $in - */ - protected function encryptBlock($in) - { - // RC4 does not utilize this method - } - - /** - * Decrypts a block - * - * @param string $in - */ - protected function decryptBlock($in) - { - // RC4 does not utilize this method - } - - /** - * Setup the key (expansion) - * - * @see Common\SymmetricKey::_setupKey() - */ - protected function setupKey() - { - $key = $this->key; - $keyLength = strlen($key); - $keyStream = range(0, 255); - $j = 0; - for ($i = 0; $i < 256; $i++) { - $j = ($j + $keyStream[$i] + ord($key[$i % $keyLength])) & 255; - $temp = $keyStream[$i]; - $keyStream[$i] = $keyStream[$j]; - $keyStream[$j] = $temp; - } - - $this->stream = []; - $this->stream[self::DECRYPT] = $this->stream[self::ENCRYPT] = [ - 0, // index $i - 0, // index $j - $keyStream - ]; - } - - /** - * Encrypts or decrypts a message. - * - * @see self::encrypt() - * @see self::decrypt() - * @param string $text - * @param int $mode - * @return string $text - */ - private function crypt($text, $mode) - { - if ($this->changed) { - $this->setup(); - } - - $stream = &$this->stream[$mode]; - if ($this->continuousBuffer) { - $i = &$stream[0]; - $j = &$stream[1]; - $keyStream = &$stream[2]; - } else { - $i = $stream[0]; - $j = $stream[1]; - $keyStream = $stream[2]; - } - - $len = strlen($text); - for ($k = 0; $k < $len; ++$k) { - $i = ($i + 1) & 255; - $ksi = $keyStream[$i]; - $j = ($j + $ksi) & 255; - $ksj = $keyStream[$j]; - - $keyStream[$i] = $ksj; - $keyStream[$j] = $ksi; - $text[$k] = $text[$k] ^ chr($keyStream[($ksj + $ksi) & 255]); - } - - return $text; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA.php deleted file mode 100644 index 5d840e3..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA.php +++ /dev/null @@ -1,933 +0,0 @@ - - * getPublicKey(); - * - * $plaintext = 'terrafrost'; - * - * $ciphertext = $public->encrypt($plaintext); - * - * echo $private->decrypt($ciphertext); - * ?> - * - * - * Here's an example of how to create signatures and verify signatures with this library: - * - * getPublicKey(); - * - * $plaintext = 'terrafrost'; - * - * $signature = $private->sign($plaintext); - * - * echo $public->verify($plaintext, $signature) ? 'verified' : 'unverified'; - * ?> - * - * - * One thing to consider when using this: so phpseclib uses PSS mode by default. - * Technically, id-RSASSA-PSS has a different key format than rsaEncryption. So - * should phpseclib save to the id-RSASSA-PSS format by default or the - * rsaEncryption format? For stand-alone keys I figure rsaEncryption is better - * because SSH doesn't use PSS and idk how many SSH servers would be able to - * decode an id-RSASSA-PSS key. For X.509 certificates the id-RSASSA-PSS - * format is used by default (unless you change it up to use PKCS1 instead) - * - * @author Jim Wigginton - * @copyright 2009 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\AsymmetricKey; -use OCA\Libresign\Vendor\phpseclib3\Crypt\RSA\Formats\Keys\PSS; -use OCA\Libresign\Vendor\phpseclib3\Crypt\RSA\PrivateKey; -use OCA\Libresign\Vendor\phpseclib3\Crypt\RSA\PublicKey; -use OCA\Libresign\Vendor\phpseclib3\Exception\InconsistentSetupException; -use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedAlgorithmException; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * Pure-PHP PKCS#1 compliant implementation of RSA. - * - * @author Jim Wigginton - */ -abstract class RSA extends AsymmetricKey -{ - /** - * Algorithm Name - * - * @var string - */ - const ALGORITHM = 'RSA'; - - /** - * Use {@link http://en.wikipedia.org/wiki/Optimal_Asymmetric_Encryption_Padding Optimal Asymmetric Encryption Padding} - * (OAEP) for encryption / decryption. - * - * Uses sha256 by default - * - * @see self::setHash() - * @see self::setMGFHash() - * @see self::encrypt() - * @see self::decrypt() - */ - const ENCRYPTION_OAEP = 1; - - /** - * Use PKCS#1 padding. - * - * Although self::PADDING_OAEP / self::PADDING_PSS offers more security, including PKCS#1 padding is necessary for purposes of backwards - * compatibility with protocols (like SSH-1) written before OAEP's introduction. - * - * @see self::encrypt() - * @see self::decrypt() - */ - const ENCRYPTION_PKCS1 = 2; - - /** - * Do not use any padding - * - * Although this method is not recommended it can none-the-less sometimes be useful if you're trying to decrypt some legacy - * stuff, if you're trying to diagnose why an encrypted message isn't decrypting, etc. - * - * @see self::encrypt() - * @see self::decrypt() - */ - const ENCRYPTION_NONE = 4; - - /** - * Use the Probabilistic Signature Scheme for signing - * - * Uses sha256 and 0 as the salt length - * - * @see self::setSaltLength() - * @see self::setMGFHash() - * @see self::setHash() - * @see self::sign() - * @see self::verify() - * @see self::setHash() - */ - const SIGNATURE_PSS = 16; - - /** - * Use a relaxed version of PKCS#1 padding for signature verification - * - * @see self::sign() - * @see self::verify() - * @see self::setHash() - */ - const SIGNATURE_RELAXED_PKCS1 = 32; - - /** - * Use PKCS#1 padding for signature verification - * - * @see self::sign() - * @see self::verify() - * @see self::setHash() - */ - const SIGNATURE_PKCS1 = 64; - - /** - * Encryption padding mode - * - * @var int - */ - protected $encryptionPadding = self::ENCRYPTION_OAEP; - - /** - * Signature padding mode - * - * @var int - */ - protected $signaturePadding = self::SIGNATURE_PSS; - - /** - * Length of hash function output - * - * @var int - */ - protected $hLen; - - /** - * Length of salt - * - * @var int - */ - protected $sLen; - - /** - * Label - * - * @var string - */ - protected $label = ''; - - /** - * Hash function for the Mask Generation Function - * - * @var Hash - */ - protected $mgfHash; - - /** - * Length of MGF hash function output - * - * @var int - */ - protected $mgfHLen; - - /** - * Modulus (ie. n) - * - * @var Math\BigInteger - */ - protected $modulus; - - /** - * Modulus length - * - * @var Math\BigInteger - */ - protected $k; - - /** - * Exponent (ie. e or d) - * - * @var Math\BigInteger - */ - protected $exponent; - - /** - * Default public exponent - * - * @var int - * @link http://en.wikipedia.org/wiki/65537_%28number%29 - */ - private static $defaultExponent = 65537; - - /** - * Enable Blinding? - * - * @var bool - */ - protected static $enableBlinding = true; - - /** - * OpenSSL configuration file name. - * - * @see self::createKey() - * @var ?string - */ - protected static $configFile; - - /** - * Smallest Prime - * - * Per , this number ought not result in primes smaller - * than 256 bits. As a consequence if the key you're trying to create is 1024 bits and you've set smallestPrime - * to 384 bits then you're going to get a 384 bit prime and a 640 bit prime (384 + 1024 % 384). At least if - * engine is set to self::ENGINE_INTERNAL. If Engine is set to self::ENGINE_OPENSSL then smallest Prime is - * ignored (ie. multi-prime RSA support is more intended as a way to speed up RSA key generation when there's - * a chance neither gmp nor OpenSSL are installed) - * - * @var int - */ - private static $smallestPrime = 4096; - - /** - * Public Exponent - * - * @var Math\BigInteger - */ - protected $publicExponent; - - /** - * Sets the public exponent for key generation - * - * This will be 65537 unless changed. - * - * @param int $val - */ - public static function setExponent($val) - { - self::$defaultExponent = $val; - } - - /** - * Sets the smallest prime number in bits. Used for key generation - * - * This will be 4096 unless changed. - * - * @param int $val - */ - public static function setSmallestPrime($val) - { - self::$smallestPrime = $val; - } - - /** - * Sets the OpenSSL config file path - * - * Set to the empty string to use the default config file - * - * @param string $val - */ - public static function setOpenSSLConfigPath($val) - { - self::$configFile = $val; - } - - /** - * Create a private key - * - * The public key can be extracted from the private key - * - * @return PrivateKey - * @param int $bits - */ - public static function createKey($bits = 2048) - { - self::initialize_static_variables(); - - $class = new \ReflectionClass(static::class); - if ($class->isFinal()) { - throw new \RuntimeException('createKey() should not be called from final classes (' . static::class . ')'); - } - - $regSize = $bits >> 1; // divide by two to see how many bits P and Q would be - if ($regSize > self::$smallestPrime) { - $num_primes = floor($bits / self::$smallestPrime); - $regSize = self::$smallestPrime; - } else { - $num_primes = 2; - } - - if ($num_primes == 2 && $bits >= 384 && self::$defaultExponent == 65537) { - if (!isset(self::$engines['PHP'])) { - self::useBestEngine(); - } - - // OpenSSL uses 65537 as the exponent and requires RSA keys be 384 bits minimum - if (self::$engines['OpenSSL']) { - $config = []; - if (self::$configFile) { - $config['config'] = self::$configFile; - } - $rsa = openssl_pkey_new(['private_key_bits' => $bits] + $config); - openssl_pkey_export($rsa, $privatekeystr, null, $config); - - // clear the buffer of error strings stemming from a minimalistic openssl.cnf - // https://github.com/php/php-src/issues/11054 talks about other errors this'll pick up - while (openssl_error_string() !== false) { - } - - return RSA::load($privatekeystr); - } - } - - static $e; - if (!isset($e)) { - $e = new BigInteger(self::$defaultExponent); - } - - $n = clone self::$one; - $exponents = $coefficients = $primes = []; - $lcm = [ - 'top' => clone self::$one, - 'bottom' => false - ]; - - do { - for ($i = 1; $i <= $num_primes; $i++) { - if ($i != $num_primes) { - $primes[$i] = BigInteger::randomPrime($regSize); - } else { - $minMax = BigInteger::minMaxBits($bits); - $min = $minMax['min']; - $max = $minMax['max']; - list($min) = $min->divide($n); - $min = $min->add(self::$one); - list($max) = $max->divide($n); - $primes[$i] = BigInteger::randomRangePrime($min, $max); - } - - // the first coefficient is calculated differently from the rest - // ie. instead of being $primes[1]->modInverse($primes[2]), it's $primes[2]->modInverse($primes[1]) - if ($i > 2) { - $coefficients[$i] = $n->modInverse($primes[$i]); - } - - $n = $n->multiply($primes[$i]); - - $temp = $primes[$i]->subtract(self::$one); - - // textbook RSA implementations use Euler's totient function instead of the least common multiple. - // see http://en.wikipedia.org/wiki/Euler%27s_totient_function - $lcm['top'] = $lcm['top']->multiply($temp); - $lcm['bottom'] = $lcm['bottom'] === false ? $temp : $lcm['bottom']->gcd($temp); - } - - list($temp) = $lcm['top']->divide($lcm['bottom']); - $gcd = $temp->gcd($e); - $i0 = 1; - } while (!$gcd->equals(self::$one)); - - $coefficients[2] = $primes[2]->modInverse($primes[1]); - - $d = $e->modInverse($temp); - - foreach ($primes as $i => $prime) { - $temp = $prime->subtract(self::$one); - $exponents[$i] = $e->modInverse($temp); - } - - // from : - // RSAPrivateKey ::= SEQUENCE { - // version Version, - // modulus INTEGER, -- n - // publicExponent INTEGER, -- e - // privateExponent INTEGER, -- d - // prime1 INTEGER, -- p - // prime2 INTEGER, -- q - // exponent1 INTEGER, -- d mod (p-1) - // exponent2 INTEGER, -- d mod (q-1) - // coefficient INTEGER, -- (inverse of q) mod p - // otherPrimeInfos OtherPrimeInfos OPTIONAL - // } - $privatekey = new PrivateKey(); - $privatekey->modulus = $n; - $privatekey->k = $bits >> 3; - $privatekey->publicExponent = $e; - $privatekey->exponent = $d; - $privatekey->primes = $primes; - $privatekey->exponents = $exponents; - $privatekey->coefficients = $coefficients; - - /* - $publickey = new PublicKey; - $publickey->modulus = $n; - $publickey->k = $bits >> 3; - $publickey->exponent = $e; - $publickey->publicExponent = $e; - $publickey->isPublic = true; - */ - - return $privatekey; - } - - /** - * OnLoad Handler - * - * @return bool - */ - protected static function onLoad(array $components) - { - $key = $components['isPublicKey'] ? - new PublicKey() : - new PrivateKey(); - - $key->modulus = $components['modulus']; - $key->publicExponent = $components['publicExponent']; - $key->k = $key->modulus->getLengthInBytes(); - - if ($components['isPublicKey'] || !isset($components['privateExponent'])) { - $key->exponent = $key->publicExponent; - } else { - $key->privateExponent = $components['privateExponent']; - $key->exponent = $key->privateExponent; - $key->primes = $components['primes']; - $key->exponents = $components['exponents']; - $key->coefficients = $components['coefficients']; - } - - if ($components['format'] == PSS::class) { - // in the X509 world RSA keys are assumed to use PKCS1 padding by default. only if the key is - // explicitly a PSS key is the use of PSS assumed. phpseclib does not work like this. phpseclib - // uses PSS padding by default. it assumes the more secure method by default and altho it provides - // for the less secure PKCS1 method you have to go out of your way to use it. this is consistent - // with the latest trends in crypto. libsodium (NaCl) is actually a little more extreme in that - // not only does it defaults to the most secure methods - it doesn't even let you choose less - // secure methods - //$key = $key->withPadding(self::SIGNATURE_PSS); - if (isset($components['hash'])) { - $key = $key->withHash($components['hash']); - } - if (isset($components['MGFHash'])) { - $key = $key->withMGFHash($components['MGFHash']); - } - if (isset($components['saltLength'])) { - $key = $key->withSaltLength($components['saltLength']); - } - } - - return $key; - } - - /** - * Initialize static variables - */ - protected static function initialize_static_variables() - { - if (!isset(self::$configFile)) { - self::$configFile = dirname(__FILE__) . '/../openssl.cnf'; - } - - parent::initialize_static_variables(); - } - - /** - * Constructor - * - * PublicKey and PrivateKey objects can only be created from abstract RSA class - */ - protected function __construct() - { - parent::__construct(); - - $this->hLen = $this->hash->getLengthInBytes(); - $this->mgfHash = new Hash('sha256'); - $this->mgfHLen = $this->mgfHash->getLengthInBytes(); - } - - /** - * Integer-to-Octet-String primitive - * - * See {@link http://tools.ietf.org/html/rfc3447#section-4.1 RFC3447#section-4.1}. - * - * @param bool|Math\BigInteger $x - * @param int $xLen - * @return bool|string - */ - protected function i2osp($x, $xLen) - { - if ($x === false) { - return false; - } - $x = $x->toBytes(); - if (strlen($x) > $xLen) { - throw new \OutOfRangeException('Resultant string length out of range'); - } - return str_pad($x, $xLen, chr(0), STR_PAD_LEFT); - } - - /** - * Octet-String-to-Integer primitive - * - * See {@link http://tools.ietf.org/html/rfc3447#section-4.2 RFC3447#section-4.2}. - * - * @param string $x - * @return Math\BigInteger - */ - protected function os2ip($x) - { - return new BigInteger($x, 256); - } - - /** - * EMSA-PKCS1-V1_5-ENCODE - * - * See {@link http://tools.ietf.org/html/rfc3447#section-9.2 RFC3447#section-9.2}. - * - * @param string $m - * @param int $emLen - * @throws \LengthException if the intended encoded message length is too short - * @return string - */ - protected function emsa_pkcs1_v1_5_encode($m, $emLen) - { - $h = $this->hash->hash($m); - - // see http://tools.ietf.org/html/rfc3447#page-43 - switch ($this->hash->getHash()) { - case 'md2': - $t = "\x30\x20\x30\x0c\x06\x08\x2a\x86\x48\x86\xf7\x0d\x02\x02\x05\x00\x04\x10"; - break; - case 'md5': - $t = "\x30\x20\x30\x0c\x06\x08\x2a\x86\x48\x86\xf7\x0d\x02\x05\x05\x00\x04\x10"; - break; - case 'sha1': - $t = "\x30\x21\x30\x09\x06\x05\x2b\x0e\x03\x02\x1a\x05\x00\x04\x14"; - break; - case 'sha256': - $t = "\x30\x31\x30\x0d\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x01\x05\x00\x04\x20"; - break; - case 'sha384': - $t = "\x30\x41\x30\x0d\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x02\x05\x00\x04\x30"; - break; - case 'sha512': - $t = "\x30\x51\x30\x0d\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x03\x05\x00\x04\x40"; - break; - // from https://www.emc.com/collateral/white-papers/h11300-pkcs-1v2-2-rsa-cryptography-standard-wp.pdf#page=40 - case 'sha224': - $t = "\x30\x2d\x30\x0d\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x04\x05\x00\x04\x1c"; - break; - case 'sha512/224': - $t = "\x30\x2d\x30\x0d\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x05\x05\x00\x04\x1c"; - break; - case 'sha512/256': - $t = "\x30\x31\x30\x0d\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x06\x05\x00\x04\x20"; - } - $t .= $h; - $tLen = strlen($t); - - if ($emLen < $tLen + 11) { - throw new \LengthException('Intended encoded message length too short'); - } - - $ps = str_repeat(chr(0xFF), $emLen - $tLen - 3); - - $em = "\0\1$ps\0$t"; - - return $em; - } - - /** - * EMSA-PKCS1-V1_5-ENCODE (without NULL) - * - * Quoting https://tools.ietf.org/html/rfc8017#page-65, - * - * "The parameters field associated with id-sha1, id-sha224, id-sha256, - * id-sha384, id-sha512, id-sha512/224, and id-sha512/256 should - * generally be omitted, but if present, it shall have a value of type - * NULL" - * - * @param string $m - * @param int $emLen - * @return string - */ - protected function emsa_pkcs1_v1_5_encode_without_null($m, $emLen) - { - $h = $this->hash->hash($m); - - // see http://tools.ietf.org/html/rfc3447#page-43 - switch ($this->hash->getHash()) { - case 'sha1': - $t = "\x30\x1f\x30\x07\x06\x05\x2b\x0e\x03\x02\x1a\x04\x14"; - break; - case 'sha256': - $t = "\x30\x2f\x30\x0b\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x01\x04\x20"; - break; - case 'sha384': - $t = "\x30\x3f\x30\x0b\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x02\x04\x30"; - break; - case 'sha512': - $t = "\x30\x4f\x30\x0b\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x03\x04\x40"; - break; - // from https://www.emc.com/collateral/white-papers/h11300-pkcs-1v2-2-rsa-cryptography-standard-wp.pdf#page=40 - case 'sha224': - $t = "\x30\x2b\x30\x0b\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x04\x04\x1c"; - break; - case 'sha512/224': - $t = "\x30\x2b\x30\x0b\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x05\x04\x1c"; - break; - case 'sha512/256': - $t = "\x30\x2f\x30\x0b\x06\x09\x60\x86\x48\x01\x65\x03\x04\x02\x06\x04\x20"; - break; - default: - throw new UnsupportedAlgorithmException('md2 and md5 require NULLs'); - } - $t .= $h; - $tLen = strlen($t); - - if ($emLen < $tLen + 11) { - throw new \LengthException('Intended encoded message length too short'); - } - - $ps = str_repeat(chr(0xFF), $emLen - $tLen - 3); - - $em = "\0\1$ps\0$t"; - - return $em; - } - - /** - * MGF1 - * - * See {@link http://tools.ietf.org/html/rfc3447#appendix-B.2.1 RFC3447#appendix-B.2.1}. - * - * @param string $mgfSeed - * @param int $maskLen - * @return string - */ - protected function mgf1($mgfSeed, $maskLen) - { - // if $maskLen would yield strings larger than 4GB, PKCS#1 suggests a "Mask too long" error be output. - - $t = ''; - $count = ceil($maskLen / $this->mgfHLen); - for ($i = 0; $i < $count; $i++) { - $c = pack('N', $i); - $t .= $this->mgfHash->hash($mgfSeed . $c); - } - - return substr($t, 0, $maskLen); - } - - /** - * Returns the key size - * - * More specifically, this returns the size of the modulo in bits. - * - * @return int - */ - public function getLength() - { - return !isset($this->modulus) ? 0 : $this->modulus->getLength(); - } - - /** - * Determines which hashing function should be used - * - * Used with signature production / verification and (if the encryption mode is self::PADDING_OAEP) encryption and - * decryption. - * - * @param string $hash - */ - public function withHash($hash) - { - $new = clone $this; - - // Crypt\Hash supports algorithms that PKCS#1 doesn't support. md5-96 and sha1-96, for example. - switch (strtolower($hash)) { - case 'md2': - case 'md5': - case 'sha1': - case 'sha256': - case 'sha384': - case 'sha512': - case 'sha224': - case 'sha512/224': - case 'sha512/256': - $new->hash = new Hash($hash); - break; - default: - throw new UnsupportedAlgorithmException( - 'The only supported hash algorithms are: md2, md5, sha1, sha256, sha384, sha512, sha224, sha512/224, sha512/256' - ); - } - $new->hLen = $new->hash->getLengthInBytes(); - - return $new; - } - - /** - * Determines which hashing function should be used for the mask generation function - * - * The mask generation function is used by self::PADDING_OAEP and self::PADDING_PSS and although it's - * best if Hash and MGFHash are set to the same thing this is not a requirement. - * - * @param string $hash - */ - public function withMGFHash($hash) - { - $new = clone $this; - - // Crypt\Hash supports algorithms that PKCS#1 doesn't support. md5-96 and sha1-96, for example. - switch (strtolower($hash)) { - case 'md2': - case 'md5': - case 'sha1': - case 'sha256': - case 'sha384': - case 'sha512': - case 'sha224': - case 'sha512/224': - case 'sha512/256': - $new->mgfHash = new Hash($hash); - break; - default: - throw new UnsupportedAlgorithmException( - 'The only supported hash algorithms are: md2, md5, sha1, sha256, sha384, sha512, sha224, sha512/224, sha512/256' - ); - } - $new->mgfHLen = $new->mgfHash->getLengthInBytes(); - - return $new; - } - - /** - * Returns the MGF hash algorithm currently being used - * - */ - public function getMGFHash() - { - return clone $this->mgfHash; - } - - /** - * Determines the salt length - * - * Used by RSA::PADDING_PSS - * - * To quote from {@link http://tools.ietf.org/html/rfc3447#page-38 RFC3447#page-38}: - * - * Typical salt lengths in octets are hLen (the length of the output - * of the hash function Hash) and 0. - * - * @param int $sLen - */ - public function withSaltLength($sLen) - { - $new = clone $this; - $new->sLen = $sLen; - return $new; - } - - /** - * Returns the salt length currently being used - * - */ - public function getSaltLength() - { - return $this->sLen !== null ? $this->sLen : $this->hLen; - } - - /** - * Determines the label - * - * Used by RSA::PADDING_OAEP - * - * To quote from {@link http://tools.ietf.org/html/rfc3447#page-17 RFC3447#page-17}: - * - * Both the encryption and the decryption operations of RSAES-OAEP take - * the value of a label L as input. In this version of PKCS #1, L is - * the empty string; other uses of the label are outside the scope of - * this document. - * - * @param string $label - */ - public function withLabel($label) - { - $new = clone $this; - $new->label = $label; - return $new; - } - - /** - * Returns the label currently being used - * - */ - public function getLabel() - { - return $this->label; - } - - /** - * Determines the padding modes - * - * Example: $key->withPadding(RSA::ENCRYPTION_PKCS1 | RSA::SIGNATURE_PKCS1); - * - * @param int $padding - */ - public function withPadding($padding) - { - $masks = [ - self::ENCRYPTION_OAEP, - self::ENCRYPTION_PKCS1, - self::ENCRYPTION_NONE - ]; - $encryptedCount = 0; - $selected = 0; - foreach ($masks as $mask) { - if ($padding & $mask) { - $selected = $mask; - $encryptedCount++; - } - } - if ($encryptedCount > 1) { - throw new InconsistentSetupException('Multiple encryption padding modes have been selected; at most only one should be selected'); - } - $encryptionPadding = $selected; - - $masks = [ - self::SIGNATURE_PSS, - self::SIGNATURE_RELAXED_PKCS1, - self::SIGNATURE_PKCS1 - ]; - $signatureCount = 0; - $selected = 0; - foreach ($masks as $mask) { - if ($padding & $mask) { - $selected = $mask; - $signatureCount++; - } - } - if ($signatureCount > 1) { - throw new InconsistentSetupException('Multiple signature padding modes have been selected; at most only one should be selected'); - } - $signaturePadding = $selected; - - $new = clone $this; - if ($encryptedCount) { - $new->encryptionPadding = $encryptionPadding; - } - if ($signatureCount) { - $new->signaturePadding = $signaturePadding; - } - return $new; - } - - /** - * Returns the padding currently being used - * - */ - public function getPadding() - { - return $this->signaturePadding | $this->encryptionPadding; - } - - /** - * Returns the current engine being used - * - * OpenSSL is only used in this class (and it's subclasses) for key generation - * Even then it depends on the parameters you're using. It's not used for - * multi-prime RSA nor is it used if the key length is outside of the range - * supported by OpenSSL - * - * @see self::useInternalEngine() - * @see self::useBestEngine() - * @return string - */ - public function getEngine() - { - if (!isset(self::$engines['PHP'])) { - self::useBestEngine(); - } - return self::$engines['OpenSSL'] && self::$defaultExponent == 65537 ? - 'OpenSSL' : - 'PHP'; - } - - /** - * Enable RSA Blinding - * - */ - public static function enableBlinding() - { - static::$enableBlinding = true; - } - - /** - * Disable RSA Blinding - * - */ - public static function disableBlinding() - { - static::$enableBlinding = false; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/JWK.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/JWK.php deleted file mode 100644 index f1116c0..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/JWK.php +++ /dev/null @@ -1,142 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\RSA\Formats\Keys; - -use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Keys\JWK as Progenitor; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * JWK Formatted RSA Handler - * - * @author Jim Wigginton - */ -abstract class JWK extends Progenitor -{ - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - $key = parent::load($key, $password); - - if ($key->kty != 'RSA') { - throw new \RuntimeException('Only RSA JWK keys are supported'); - } - - $count = $publicCount = 0; - $vars = ['n', 'e', 'd', 'p', 'q', 'dp', 'dq', 'qi']; - foreach ($vars as $var) { - if (!isset($key->$var) || !is_string($key->$var)) { - continue; - } - $count++; - $value = new BigInteger(Strings::base64url_decode($key->$var), 256); - switch ($var) { - case 'n': - $publicCount++; - $components['modulus'] = $value; - break; - case 'e': - $publicCount++; - $components['publicExponent'] = $value; - break; - case 'd': - $components['privateExponent'] = $value; - break; - case 'p': - $components['primes'][1] = $value; - break; - case 'q': - $components['primes'][2] = $value; - break; - case 'dp': - $components['exponents'][1] = $value; - break; - case 'dq': - $components['exponents'][2] = $value; - break; - case 'qi': - $components['coefficients'][2] = $value; - } - } - - if ($count == count($vars)) { - return $components + ['isPublicKey' => false]; - } - - if ($count == 2 && $publicCount == 2) { - return $components + ['isPublicKey' => true]; - } - - throw new \UnexpectedValueException('Key does not have an appropriate number of RSA parameters'); - } - - /** - * Convert a private key to the appropriate format. - * - * @param BigInteger $n - * @param BigInteger $e - * @param BigInteger $d - * @param array $primes - * @param array $exponents - * @param array $coefficients - * @param string $password optional - * @param array $options optional - * @return string - */ - public static function savePrivateKey(BigInteger $n, BigInteger $e, BigInteger $d, array $primes, array $exponents, array $coefficients, $password = '', array $options = []) - { - if (count($primes) != 2) { - throw new \InvalidArgumentException('JWK does not support multi-prime RSA keys'); - } - - $key = [ - 'kty' => 'RSA', - 'n' => Strings::base64url_encode($n->toBytes()), - 'e' => Strings::base64url_encode($e->toBytes()), - 'd' => Strings::base64url_encode($d->toBytes()), - 'p' => Strings::base64url_encode($primes[1]->toBytes()), - 'q' => Strings::base64url_encode($primes[2]->toBytes()), - 'dp' => Strings::base64url_encode($exponents[1]->toBytes()), - 'dq' => Strings::base64url_encode($exponents[2]->toBytes()), - 'qi' => Strings::base64url_encode($coefficients[2]->toBytes()) - ]; - - return self::wrapKey($key, $options); - } - - /** - * Convert a public key to the appropriate format - * - * @param BigInteger $n - * @param BigInteger $e - * @param array $options optional - * @return string - */ - public static function savePublicKey(BigInteger $n, BigInteger $e, array $options = []) - { - $key = [ - 'kty' => 'RSA', - 'n' => Strings::base64url_encode($n->toBytes()), - 'e' => Strings::base64url_encode($e->toBytes()) - ]; - - return self::wrapKey($key, $options); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/MSBLOB.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/MSBLOB.php deleted file mode 100644 index f390302..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/MSBLOB.php +++ /dev/null @@ -1,224 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\RSA\Formats\Keys; - -use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; -use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedFormatException; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * Microsoft BLOB Formatted RSA Key Handler - * - * @author Jim Wigginton - */ -abstract class MSBLOB -{ - /** - * Public/Private Key Pair - * - */ - const PRIVATEKEYBLOB = 0x7; - /** - * Public Key - * - */ - const PUBLICKEYBLOB = 0x6; - /** - * Public Key - * - */ - const PUBLICKEYBLOBEX = 0xA; - /** - * RSA public key exchange algorithm - * - */ - const CALG_RSA_KEYX = 0x0000A400; - /** - * RSA public key exchange algorithm - * - */ - const CALG_RSA_SIGN = 0x00002400; - /** - * Public Key - * - */ - const RSA1 = 0x31415352; - /** - * Private Key - * - */ - const RSA2 = 0x32415352; - - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - if (!Strings::is_stringable($key)) { - throw new \UnexpectedValueException('Key should be a string - not a ' . gettype($key)); - } - - $key = Strings::base64_decode($key); - - if (!is_string($key)) { - throw new \UnexpectedValueException('Base64 decoding produced an error'); - } - if (strlen($key) < 20) { - throw new \UnexpectedValueException('Key appears to be malformed'); - } - - // PUBLICKEYSTRUC publickeystruc - // https://msdn.microsoft.com/en-us/library/windows/desktop/aa387453(v=vs.85).aspx - $unpacked = unpack('atype/aversion/vreserved/Valgo', Strings::shift($key, 8)); - $type = $unpacked['type']; - $version = $unpacked['version']; - $reserved = $unpacked['reserved']; - $algo = $unpacked['algo']; - switch (ord($type)) { - case self::PUBLICKEYBLOB: - case self::PUBLICKEYBLOBEX: - $publickey = true; - break; - case self::PRIVATEKEYBLOB: - $publickey = false; - break; - default: - throw new \UnexpectedValueException('Key appears to be malformed'); - } - - $components = ['isPublicKey' => $publickey]; - - // https://msdn.microsoft.com/en-us/library/windows/desktop/aa375549(v=vs.85).aspx - switch ($algo) { - case self::CALG_RSA_KEYX: - case self::CALG_RSA_SIGN: - break; - default: - throw new \UnexpectedValueException('Key appears to be malformed'); - } - - // RSAPUBKEY rsapubkey - // https://msdn.microsoft.com/en-us/library/windows/desktop/aa387685(v=vs.85).aspx - // could do V for pubexp but that's unsigned 32-bit whereas some PHP installs only do signed 32-bit - $unpacked = unpack('Vmagic/Vbitlen/a4pubexp', Strings::shift($key, 12)); - $magic = $unpacked['magic']; - $bitlen = $unpacked['bitlen']; - $pubexp = $unpacked['pubexp']; - switch ($magic) { - case self::RSA2: - $components['isPublicKey'] = false; - // fall-through - case self::RSA1: - break; - default: - throw new \UnexpectedValueException('Key appears to be malformed'); - } - - $baseLength = $bitlen / 16; - if (strlen($key) != 2 * $baseLength && strlen($key) != 9 * $baseLength) { - throw new \UnexpectedValueException('Key appears to be malformed'); - } - - $components[$components['isPublicKey'] ? 'publicExponent' : 'privateExponent'] = new BigInteger(strrev($pubexp), 256); - // BYTE modulus[rsapubkey.bitlen/8] - $components['modulus'] = new BigInteger(strrev(Strings::shift($key, $bitlen / 8)), 256); - - if ($publickey) { - return $components; - } - - $components['isPublicKey'] = false; - - // BYTE prime1[rsapubkey.bitlen/16] - $components['primes'] = [1 => new BigInteger(strrev(Strings::shift($key, $bitlen / 16)), 256)]; - // BYTE prime2[rsapubkey.bitlen/16] - $components['primes'][] = new BigInteger(strrev(Strings::shift($key, $bitlen / 16)), 256); - // BYTE exponent1[rsapubkey.bitlen/16] - $components['exponents'] = [1 => new BigInteger(strrev(Strings::shift($key, $bitlen / 16)), 256)]; - // BYTE exponent2[rsapubkey.bitlen/16] - $components['exponents'][] = new BigInteger(strrev(Strings::shift($key, $bitlen / 16)), 256); - // BYTE coefficient[rsapubkey.bitlen/16] - $components['coefficients'] = [2 => new BigInteger(strrev(Strings::shift($key, $bitlen / 16)), 256)]; - if (isset($components['privateExponent'])) { - $components['publicExponent'] = $components['privateExponent']; - } - // BYTE privateExponent[rsapubkey.bitlen/8] - $components['privateExponent'] = new BigInteger(strrev(Strings::shift($key, $bitlen / 8)), 256); - - return $components; - } - - /** - * Convert a private key to the appropriate format. - * - * @param BigInteger $n - * @param BigInteger $e - * @param BigInteger $d - * @param array $primes - * @param array $exponents - * @param array $coefficients - * @param string $password optional - * @return string - */ - public static function savePrivateKey(BigInteger $n, BigInteger $e, BigInteger $d, array $primes, array $exponents, array $coefficients, $password = '') - { - if (count($primes) != 2) { - throw new \InvalidArgumentException('MSBLOB does not support multi-prime RSA keys'); - } - - if (!empty($password) && is_string($password)) { - throw new UnsupportedFormatException('MSBLOB private keys do not support encryption'); - } - - $n = strrev($n->toBytes()); - $e = str_pad(strrev($e->toBytes()), 4, "\0"); - $key = pack('aavV', chr(self::PRIVATEKEYBLOB), chr(2), 0, self::CALG_RSA_KEYX); - $key .= pack('VVa*', self::RSA2, 8 * strlen($n), $e); - $key .= $n; - $key .= strrev($primes[1]->toBytes()); - $key .= strrev($primes[2]->toBytes()); - $key .= strrev($exponents[1]->toBytes()); - $key .= strrev($exponents[2]->toBytes()); - $key .= strrev($coefficients[2]->toBytes()); - $key .= strrev($d->toBytes()); - - return Strings::base64_encode($key); - } - - /** - * Convert a public key to the appropriate format - * - * @param BigInteger $n - * @param BigInteger $e - * @return string - */ - public static function savePublicKey(BigInteger $n, BigInteger $e) - { - $n = strrev($n->toBytes()); - $e = str_pad(strrev($e->toBytes()), 4, "\0"); - $key = pack('aavV', chr(self::PUBLICKEYBLOB), chr(2), 0, self::CALG_RSA_KEYX); - $key .= pack('VVa*', self::RSA1, 8 * strlen($n), $e); - $key .= $n; - - return Strings::base64_encode($key); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/OpenSSH.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/OpenSSH.php deleted file mode 100644 index fb262cf..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/OpenSSH.php +++ /dev/null @@ -1,132 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\RSA\Formats\Keys; - -use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Keys\OpenSSH as Progenitor; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * OpenSSH Formatted RSA Key Handler - * - * @author Jim Wigginton - */ -abstract class OpenSSH extends Progenitor -{ - /** - * Supported Key Types - * - * @var array - */ - protected static $types = ['ssh-rsa']; - - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - static $one; - if (!isset($one)) { - $one = new BigInteger(1); - } - - $parsed = parent::load($key, $password); - - if (isset($parsed['paddedKey'])) { - list($type) = Strings::unpackSSH2('s', $parsed['paddedKey']); - if ($type != $parsed['type']) { - throw new \RuntimeException("The public and private keys are not of the same type ($type vs $parsed[type])"); - } - - $primes = $coefficients = []; - - list( - $modulus, - $publicExponent, - $privateExponent, - $coefficients[2], - $primes[1], - $primes[2], - $comment, - ) = Strings::unpackSSH2('i6s', $parsed['paddedKey']); - - $temp = $primes[1]->subtract($one); - $exponents = [1 => $publicExponent->modInverse($temp)]; - $temp = $primes[2]->subtract($one); - $exponents[] = $publicExponent->modInverse($temp); - - $isPublicKey = false; - - return compact('publicExponent', 'modulus', 'privateExponent', 'primes', 'coefficients', 'exponents', 'comment', 'isPublicKey'); - } - - list($publicExponent, $modulus) = Strings::unpackSSH2('ii', $parsed['publicKey']); - - return [ - 'isPublicKey' => true, - 'modulus' => $modulus, - 'publicExponent' => $publicExponent, - 'comment' => $parsed['comment'] - ]; - } - - /** - * Convert a public key to the appropriate format - * - * @param BigInteger $n - * @param BigInteger $e - * @param array $options optional - * @return string - */ - public static function savePublicKey(BigInteger $n, BigInteger $e, array $options = []) - { - $RSAPublicKey = Strings::packSSH2('sii', 'ssh-rsa', $e, $n); - - if (isset($options['binary']) ? $options['binary'] : self::$binary) { - return $RSAPublicKey; - } - - $comment = isset($options['comment']) ? $options['comment'] : self::$comment; - $RSAPublicKey = 'ssh-rsa ' . base64_encode($RSAPublicKey) . ' ' . $comment; - - return $RSAPublicKey; - } - - /** - * Convert a private key to the appropriate format. - * - * @param BigInteger $n - * @param BigInteger $e - * @param BigInteger $d - * @param array $primes - * @param array $exponents - * @param array $coefficients - * @param string $password optional - * @param array $options optional - * @return string - */ - public static function savePrivateKey(BigInteger $n, BigInteger $e, BigInteger $d, array $primes, array $exponents, array $coefficients, $password = '', array $options = []) - { - $publicKey = self::savePublicKey($n, $e, ['binary' => true]); - $privateKey = Strings::packSSH2('si6', 'ssh-rsa', $n, $e, $d, $coefficients[2], $primes[1], $primes[2]); - - return self::wrapPrivateKey($publicKey, $privateKey, $password, $options); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PKCS1.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PKCS1.php deleted file mode 100644 index 097541b..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PKCS1.php +++ /dev/null @@ -1,187 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\RSA\Formats\Keys; - -use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Keys\PKCS1 as Progenitor; -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; -use OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * PKCS#1 Formatted RSA Key Handler - * - * @author Jim Wigginton - */ -abstract class PKCS1 extends Progenitor -{ - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - if (!Strings::is_stringable($key)) { - throw new \UnexpectedValueException('Key should be a string - not a ' . gettype($key)); - } - - if (strpos($key, 'PUBLIC') !== false) { - $components = ['isPublicKey' => true]; - } elseif (strpos($key, 'PRIVATE') !== false) { - $components = ['isPublicKey' => false]; - } else { - $components = []; - } - - $key = parent::load($key, $password); - - $decoded = ASN1::decodeBER($key); - if (!$decoded) { - throw new \RuntimeException('Unable to decode BER'); - } - - $key = ASN1::asn1map($decoded[0], Maps\RSAPrivateKey::MAP); - if (is_array($key)) { - $components += [ - 'modulus' => $key['modulus'], - 'publicExponent' => $key['publicExponent'], - 'privateExponent' => $key['privateExponent'], - 'primes' => [1 => $key['prime1'], $key['prime2']], - 'exponents' => [1 => $key['exponent1'], $key['exponent2']], - 'coefficients' => [2 => $key['coefficient']] - ]; - if ($key['version'] == 'multi') { - foreach ($key['otherPrimeInfos'] as $primeInfo) { - $components['primes'][] = $primeInfo['prime']; - $components['exponents'][] = $primeInfo['exponent']; - $components['coefficients'][] = $primeInfo['coefficient']; - } - } - if (!isset($components['isPublicKey'])) { - $components['isPublicKey'] = false; - } - return $components; - } - - $key = ASN1::asn1map($decoded[0], Maps\RSAPublicKey::MAP); - - if (!is_array($key)) { - throw new \RuntimeException('Unable to perform ASN1 mapping'); - } - - if (!isset($components['isPublicKey'])) { - $components['isPublicKey'] = true; - } - - $components = $components + $key; - foreach ($components as &$val) { - if ($val instanceof BigInteger) { - $val = self::makePositive($val); - } - if (is_array($val)) { - foreach ($val as &$subval) { - if ($subval instanceof BigInteger) { - $subval = self::makePositive($subval); - } - } - } - } - - return $components + $key; - } - - /** - * Convert a private key to the appropriate format. - * - * @param BigInteger $n - * @param BigInteger $e - * @param BigInteger $d - * @param array $primes - * @param array $exponents - * @param array $coefficients - * @param string $password optional - * @param array $options optional - * @return string - */ - public static function savePrivateKey(BigInteger $n, BigInteger $e, BigInteger $d, array $primes, array $exponents, array $coefficients, $password = '', array $options = []) - { - $num_primes = count($primes); - $key = [ - 'version' => $num_primes == 2 ? 'two-prime' : 'multi', - 'modulus' => $n, - 'publicExponent' => $e, - 'privateExponent' => $d, - 'prime1' => $primes[1], - 'prime2' => $primes[2], - 'exponent1' => $exponents[1], - 'exponent2' => $exponents[2], - 'coefficient' => $coefficients[2] - ]; - for ($i = 3; $i <= $num_primes; $i++) { - $key['otherPrimeInfos'][] = [ - 'prime' => $primes[$i], - 'exponent' => $exponents[$i], - 'coefficient' => $coefficients[$i] - ]; - } - - $key = ASN1::encodeDER($key, Maps\RSAPrivateKey::MAP); - - return self::wrapPrivateKey($key, 'RSA', $password, $options); - } - - /** - * Convert a public key to the appropriate format - * - * @param BigInteger $n - * @param BigInteger $e - * @return string - */ - public static function savePublicKey(BigInteger $n, BigInteger $e) - { - $key = [ - 'modulus' => $n, - 'publicExponent' => $e - ]; - - $key = ASN1::encodeDER($key, Maps\RSAPublicKey::MAP); - - return self::wrapPublicKey($key, 'RSA'); - } - - /** - * Negative numbers make no sense in RSA so convert them to positive - * - * @param BigInteger $x - * @return string - */ - private static function makePositive(BigInteger $x) - { - return $x->isNegative() ? - new BigInteger($x->toBytes(true), 256) : - $x; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PKCS8.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PKCS8.php deleted file mode 100644 index 0460767..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PKCS8.php +++ /dev/null @@ -1,122 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\RSA\Formats\Keys; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Keys\PKCS8 as Progenitor; -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * PKCS#8 Formatted RSA Key Handler - * - * @author Jim Wigginton - */ -abstract class PKCS8 extends Progenitor -{ - /** - * OID Name - * - * @var string - */ - const OID_NAME = 'rsaEncryption'; - - /** - * OID Value - * - * @var string - */ - const OID_VALUE = '1.2.840.113549.1.1.1'; - - /** - * Child OIDs loaded - * - * @var bool - */ - protected static $childOIDsLoaded = false; - - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - $key = parent::load($key, $password); - - if (isset($key['privateKey'])) { - $components['isPublicKey'] = false; - $type = 'private'; - } else { - $components['isPublicKey'] = true; - $type = 'public'; - } - - $result = $components + PKCS1::load($key[$type . 'Key']); - - if (isset($key['meta'])) { - $result['meta'] = $key['meta']; - } - - return $result; - } - - /** - * Convert a private key to the appropriate format. - * - * @param BigInteger $n - * @param BigInteger $e - * @param BigInteger $d - * @param array $primes - * @param array $exponents - * @param array $coefficients - * @param string $password optional - * @param array $options optional - * @return string - */ - public static function savePrivateKey(BigInteger $n, BigInteger $e, BigInteger $d, array $primes, array $exponents, array $coefficients, $password = '', array $options = []) - { - $key = PKCS1::savePrivateKey($n, $e, $d, $primes, $exponents, $coefficients); - $key = ASN1::extractBER($key); - return self::wrapPrivateKey($key, [], null, $password, null, '', $options); - } - - /** - * Convert a public key to the appropriate format - * - * @param BigInteger $n - * @param BigInteger $e - * @param array $options optional - * @return string - */ - public static function savePublicKey(BigInteger $n, BigInteger $e, array $options = []) - { - $key = PKCS1::savePublicKey($n, $e); - $key = ASN1::extractBER($key); - return self::wrapPublicKey($key, null, null, $options); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PSS.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PSS.php deleted file mode 100644 index c781b5f..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PSS.php +++ /dev/null @@ -1,238 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\RSA\Formats\Keys; - -use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Keys\PKCS8 as Progenitor; -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; -use OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * PKCS#8 Formatted RSA-PSS Key Handler - * - * @author Jim Wigginton - */ -abstract class PSS extends Progenitor -{ - /** - * OID Name - * - * @var string - */ - const OID_NAME = 'id-RSASSA-PSS'; - - /** - * OID Value - * - * @var string - */ - const OID_VALUE = '1.2.840.113549.1.1.10'; - - /** - * OIDs loaded - * - * @var bool - */ - private static $oidsLoaded = false; - - /** - * Child OIDs loaded - * - * @var bool - */ - protected static $childOIDsLoaded = false; - - /** - * Initialize static variables - */ - private static function initialize_static_variables() - { - if (!self::$oidsLoaded) { - ASN1::loadOIDs([ - 'md2' => '1.2.840.113549.2.2', - 'md4' => '1.2.840.113549.2.4', - 'md5' => '1.2.840.113549.2.5', - 'id-sha1' => '1.3.14.3.2.26', - 'id-sha256' => '2.16.840.1.101.3.4.2.1', - 'id-sha384' => '2.16.840.1.101.3.4.2.2', - 'id-sha512' => '2.16.840.1.101.3.4.2.3', - 'id-sha224' => '2.16.840.1.101.3.4.2.4', - 'id-sha512/224' => '2.16.840.1.101.3.4.2.5', - 'id-sha512/256' => '2.16.840.1.101.3.4.2.6', - - 'id-mgf1' => '1.2.840.113549.1.1.8' - ]); - self::$oidsLoaded = true; - } - } - - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - self::initialize_static_variables(); - - if (!Strings::is_stringable($key)) { - throw new \UnexpectedValueException('Key should be a string - not a ' . gettype($key)); - } - - $components = ['isPublicKey' => strpos($key, 'PUBLIC') !== false]; - - $key = parent::load($key, $password); - - $type = isset($key['privateKey']) ? 'private' : 'public'; - - $result = $components + PKCS1::load($key[$type . 'Key']); - - if (isset($key[$type . 'KeyAlgorithm']['parameters'])) { - $decoded = ASN1::decodeBER($key[$type . 'KeyAlgorithm']['parameters']); - if ($decoded === false) { - throw new \UnexpectedValueException('Unable to decode parameters'); - } - $params = ASN1::asn1map($decoded[0], Maps\RSASSA_PSS_params::MAP); - } else { - $params = []; - } - - if (isset($params['maskGenAlgorithm']['parameters'])) { - $decoded = ASN1::decodeBER($params['maskGenAlgorithm']['parameters']); - if ($decoded === false) { - throw new \UnexpectedValueException('Unable to decode parameters'); - } - $params['maskGenAlgorithm']['parameters'] = ASN1::asn1map($decoded[0], Maps\HashAlgorithm::MAP); - } else { - $params['maskGenAlgorithm'] = [ - 'algorithm' => 'id-mgf1', - 'parameters' => ['algorithm' => 'id-sha1'] - ]; - } - - if (!isset($params['hashAlgorithm']['algorithm'])) { - $params['hashAlgorithm']['algorithm'] = 'id-sha1'; - } - - $result['hash'] = str_replace('id-', '', $params['hashAlgorithm']['algorithm']); - $result['MGFHash'] = str_replace('id-', '', $params['maskGenAlgorithm']['parameters']['algorithm']); - if (isset($params['saltLength'])) { - $result['saltLength'] = (int) $params['saltLength']->toString(); - } - - if (isset($key['meta'])) { - $result['meta'] = $key['meta']; - } - - return $result; - } - - /** - * Convert a private key to the appropriate format. - * - * @param BigInteger $n - * @param BigInteger $e - * @param BigInteger $d - * @param array $primes - * @param array $exponents - * @param array $coefficients - * @param string $password optional - * @param array $options optional - * @return string - */ - public static function savePrivateKey(BigInteger $n, BigInteger $e, BigInteger $d, array $primes, array $exponents, array $coefficients, $password = '', array $options = []) - { - self::initialize_static_variables(); - - $key = PKCS1::savePrivateKey($n, $e, $d, $primes, $exponents, $coefficients); - $key = ASN1::extractBER($key); - $params = self::savePSSParams($options); - return self::wrapPrivateKey($key, [], $params, $password, null, '', $options); - } - - /** - * Convert a public key to the appropriate format - * - * @param BigInteger $n - * @param BigInteger $e - * @param array $options optional - * @return string - */ - public static function savePublicKey(BigInteger $n, BigInteger $e, array $options = []) - { - self::initialize_static_variables(); - - $key = PKCS1::savePublicKey($n, $e); - $key = ASN1::extractBER($key); - $params = self::savePSSParams($options); - return self::wrapPublicKey($key, $params); - } - - /** - * Encodes PSS parameters - * - * @param array $options - * @return string - */ - public static function savePSSParams(array $options) - { - /* - The trailerField field is an integer. It provides - compatibility with IEEE Std 1363a-2004 [P1363A]. The value - MUST be 1, which represents the trailer field with hexadecimal - value 0xBC. Other trailer fields, including the trailer field - composed of HashID concatenated with 0xCC that is specified in - IEEE Std 1363a, are not supported. Implementations that - perform signature generation MUST omit the trailerField field, - indicating that the default trailer field value was used. - Implementations that perform signature validation MUST - recognize both a present trailerField field with value 1 and an - absent trailerField field. - - source: https://tools.ietf.org/html/rfc4055#page-9 - */ - $params = [ - 'trailerField' => new BigInteger(1) - ]; - if (isset($options['hash'])) { - $params['hashAlgorithm']['algorithm'] = 'id-' . $options['hash']; - } - if (isset($options['MGFHash'])) { - $temp = ['algorithm' => 'id-' . $options['MGFHash']]; - $temp = ASN1::encodeDER($temp, Maps\HashAlgorithm::MAP); - $params['maskGenAlgorithm'] = [ - 'algorithm' => 'id-mgf1', - 'parameters' => new ASN1\Element($temp) - ]; - } - if (isset($options['saltLength'])) { - $params['saltLength'] = new BigInteger($options['saltLength']); - } - - return new ASN1\Element(ASN1::encodeDER($params, Maps\RSASSA_PSS_params::MAP)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PuTTY.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PuTTY.php deleted file mode 100644 index 694c3b2..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/PuTTY.php +++ /dev/null @@ -1,124 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\RSA\Formats\Keys; - -use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\Formats\Keys\PuTTY as Progenitor; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * PuTTY Formatted RSA Key Handler - * - * @author Jim Wigginton - */ -abstract class PuTTY extends Progenitor -{ - /** - * Public Handler - * - * @var string - */ - const PUBLIC_HANDLER = '\OCA\Libresign\Vendor\phpseclib3\Crypt\RSA\Formats\Keys\OpenSSH'; - - /** - * Algorithm Identifier - * - * @var array - */ - protected static $types = ['ssh-rsa']; - - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - static $one; - if (!isset($one)) { - $one = new BigInteger(1); - } - - $components = parent::load($key, $password); - if (!isset($components['private'])) { - return $components; - } - $type = $components['type']; - $comment = $components['comment']; - $public = $components['public']; - $private = $components['private']; - unset($components['public'], $components['private']); - - $isPublicKey = false; - - $result = Strings::unpackSSH2('ii', $public); - if ($result === false) { - throw new \UnexpectedValueException('Key appears to be malformed'); - } - list($publicExponent, $modulus) = $result; - - $result = Strings::unpackSSH2('iiii', $private); - if ($result === false) { - throw new \UnexpectedValueException('Key appears to be malformed'); - } - $primes = $coefficients = []; - list($privateExponent, $primes[1], $primes[2], $coefficients[2]) = $result; - - $temp = $primes[1]->subtract($one); - $exponents = [1 => $publicExponent->modInverse($temp)]; - $temp = $primes[2]->subtract($one); - $exponents[] = $publicExponent->modInverse($temp); - - return compact('publicExponent', 'modulus', 'privateExponent', 'primes', 'coefficients', 'exponents', 'comment', 'isPublicKey'); - } - - /** - * Convert a private key to the appropriate format. - * - * @param BigInteger $n - * @param BigInteger $e - * @param BigInteger $d - * @param array $primes - * @param array $exponents - * @param array $coefficients - * @param string $password optional - * @param array $options optional - * @return string - */ - public static function savePrivateKey(BigInteger $n, BigInteger $e, BigInteger $d, array $primes, array $exponents, array $coefficients, $password = '', array $options = []) - { - if (count($primes) != 2) { - throw new \InvalidArgumentException('PuTTY does not support multi-prime RSA keys'); - } - - $public = Strings::packSSH2('ii', $e, $n); - $private = Strings::packSSH2('iiii', $d, $primes[1], $primes[2], $coefficients[2]); - - return self::wrapPrivateKey($public, $private, 'ssh-rsa', $password, $options); - } - - /** - * Convert a public key to the appropriate format - * - * @param BigInteger $n - * @param BigInteger $e - * @return string - */ - public static function savePublicKey(BigInteger $n, BigInteger $e) - { - return self::wrapPublicKey(Strings::packSSH2('ii', $e, $n), 'ssh-rsa'); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/Raw.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/Raw.php deleted file mode 100644 index 93663eb..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/Raw.php +++ /dev/null @@ -1,184 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\RSA\Formats\Keys; - -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * Raw RSA Key Handler - * - * @author Jim Wigginton - */ -abstract class Raw -{ - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - if (!is_array($key)) { - throw new \UnexpectedValueException('Key should be a array - not a ' . gettype($key)); - } - - $key = array_change_key_case($key, CASE_LOWER); - - $components = ['isPublicKey' => false]; - - foreach (['e', 'exponent', 'publicexponent', 0, 'privateexponent', 'd'] as $index) { - if (isset($key[$index])) { - $components['publicExponent'] = $key[$index]; - break; - } - } - - foreach (['n', 'modulo', 'modulus', 1] as $index) { - if (isset($key[$index])) { - $components['modulus'] = $key[$index]; - break; - } - } - - if (!isset($components['publicExponent']) || !isset($components['modulus'])) { - throw new \UnexpectedValueException('Modulus / exponent not present'); - } - - if (isset($key['primes'])) { - $components['primes'] = $key['primes']; - } elseif (isset($key['p']) && isset($key['q'])) { - $indices = [ - ['p', 'q'], - ['prime1', 'prime2'] - ]; - foreach ($indices as $index) { - list($i0, $i1) = $index; - if (isset($key[$i0]) && isset($key[$i1])) { - $components['primes'] = [1 => $key[$i0], $key[$i1]]; - } - } - } - - if (isset($key['exponents'])) { - $components['exponents'] = $key['exponents']; - } else { - $indices = [ - ['dp', 'dq'], - ['exponent1', 'exponent2'] - ]; - foreach ($indices as $index) { - list($i0, $i1) = $index; - if (isset($key[$i0]) && isset($key[$i1])) { - $components['exponents'] = [1 => $key[$i0], $key[$i1]]; - } - } - } - - if (isset($key['coefficients'])) { - $components['coefficients'] = $key['coefficients']; - } else { - foreach (['inverseq', 'q\'', 'coefficient'] as $index) { - if (isset($key[$index])) { - $components['coefficients'] = [2 => $key[$index]]; - } - } - } - - if (!isset($components['primes'])) { - $components['isPublicKey'] = true; - return $components; - } - - if (!isset($components['exponents'])) { - $one = new BigInteger(1); - $temp = $components['primes'][1]->subtract($one); - $exponents = [1 => $components['publicExponent']->modInverse($temp)]; - $temp = $components['primes'][2]->subtract($one); - $exponents[] = $components['publicExponent']->modInverse($temp); - $components['exponents'] = $exponents; - } - - if (!isset($components['coefficients'])) { - $components['coefficients'] = [2 => $components['primes'][2]->modInverse($components['primes'][1])]; - } - - foreach (['privateexponent', 'd'] as $index) { - if (isset($key[$index])) { - $components['privateExponent'] = $key[$index]; - break; - } - } - - return $components; - } - - /** - * Convert a private key to the appropriate format. - * - * @param BigInteger $n - * @param BigInteger $e - * @param BigInteger $d - * @param array $primes - * @param array $exponents - * @param array $coefficients - * @param string $password optional - * @param array $options optional - * @return array - */ - public static function savePrivateKey(BigInteger $n, BigInteger $e, BigInteger $d, array $primes, array $exponents, array $coefficients, $password = '', array $options = []) - { - if (!empty($password) && is_string($password)) { - throw new UnsupportedFormatException('Raw private keys do not support encryption'); - } - - return [ - 'e' => clone $e, - 'n' => clone $n, - 'd' => clone $d, - 'primes' => array_map(function ($var) { - return clone $var; - }, $primes), - 'exponents' => array_map(function ($var) { - return clone $var; - }, $exponents), - 'coefficients' => array_map(function ($var) { - return clone $var; - }, $coefficients) - ]; - } - - /** - * Convert a public key to the appropriate format - * - * @param BigInteger $n - * @param BigInteger $e - * @return array - */ - public static function savePublicKey(BigInteger $n, BigInteger $e) - { - return ['e' => clone $e, 'n' => clone $n]; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/XML.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/XML.php deleted file mode 100644 index 6fea77f..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/Formats/Keys/XML.php +++ /dev/null @@ -1,171 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\RSA\Formats\Keys; - -use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; -use OCA\Libresign\Vendor\phpseclib3\Exception\BadConfigurationException; -use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedFormatException; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * XML Formatted RSA Key Handler - * - * @author Jim Wigginton - */ -abstract class XML -{ - /** - * Break a public or private key down into its constituent components - * - * @param string $key - * @param string $password optional - * @return array - */ - public static function load($key, $password = '') - { - if (!Strings::is_stringable($key)) { - throw new \UnexpectedValueException('Key should be a string - not a ' . gettype($key)); - } - - if (!class_exists('DOMDocument')) { - throw new BadConfigurationException('The dom extension is not setup correctly on this system'); - } - - $components = [ - 'isPublicKey' => false, - 'primes' => [], - 'exponents' => [], - 'coefficients' => [] - ]; - - $use_errors = libxml_use_internal_errors(true); - - $dom = new \DOMDocument(); - if (substr($key, 0, 5) != '' . $key . ''; - } - if (!$dom->loadXML($key)) { - libxml_use_internal_errors($use_errors); - throw new \UnexpectedValueException('Key does not appear to contain XML'); - } - $xpath = new \DOMXPath($dom); - $keys = ['modulus', 'exponent', 'p', 'q', 'dp', 'dq', 'inverseq', 'd']; - foreach ($keys as $key) { - // $dom->getElementsByTagName($key) is case-sensitive - $temp = $xpath->query("//*[translate(local-name(), 'ABCDEFGHIJKLMNOPQRSTUVWXYZ','abcdefghijklmnopqrstuvwxyz')='$key']"); - if (!$temp->length) { - continue; - } - $value = new BigInteger(Strings::base64_decode($temp->item(0)->nodeValue), 256); - switch ($key) { - case 'modulus': - $components['modulus'] = $value; - break; - case 'exponent': - $components['publicExponent'] = $value; - break; - case 'p': - $components['primes'][1] = $value; - break; - case 'q': - $components['primes'][2] = $value; - break; - case 'dp': - $components['exponents'][1] = $value; - break; - case 'dq': - $components['exponents'][2] = $value; - break; - case 'inverseq': - $components['coefficients'][2] = $value; - break; - case 'd': - $components['privateExponent'] = $value; - } - } - - libxml_use_internal_errors($use_errors); - - foreach ($components as $key => $value) { - if (is_array($value) && !count($value)) { - unset($components[$key]); - } - } - - if (isset($components['modulus']) && isset($components['publicExponent'])) { - if (count($components) == 3) { - $components['isPublicKey'] = true; - } - return $components; - } - - throw new \UnexpectedValueException('Modulus / exponent not present'); - } - - /** - * Convert a private key to the appropriate format. - * - * @param BigInteger $n - * @param BigInteger $e - * @param BigInteger $d - * @param array $primes - * @param array $exponents - * @param array $coefficients - * @param string $password optional - * @return string - */ - public static function savePrivateKey(BigInteger $n, BigInteger $e, BigInteger $d, array $primes, array $exponents, array $coefficients, $password = '') - { - if (count($primes) != 2) { - throw new \InvalidArgumentException('XML does not support multi-prime RSA keys'); - } - - if (!empty($password) && is_string($password)) { - throw new UnsupportedFormatException('XML private keys do not support encryption'); - } - - return "\r\n" . - ' ' . Strings::base64_encode($n->toBytes()) . "\r\n" . - ' ' . Strings::base64_encode($e->toBytes()) . "\r\n" . - '

' . Strings::base64_encode($primes[1]->toBytes()) . "

\r\n" . - ' ' . Strings::base64_encode($primes[2]->toBytes()) . "\r\n" . - ' ' . Strings::base64_encode($exponents[1]->toBytes()) . "\r\n" . - ' ' . Strings::base64_encode($exponents[2]->toBytes()) . "\r\n" . - ' ' . Strings::base64_encode($coefficients[2]->toBytes()) . "\r\n" . - ' ' . Strings::base64_encode($d->toBytes()) . "\r\n" . - '
'; - } - - /** - * Convert a public key to the appropriate format - * - * @param BigInteger $n - * @param BigInteger $e - * @return string - */ - public static function savePublicKey(BigInteger $n, BigInteger $e) - { - return "\r\n" . - ' ' . Strings::base64_encode($n->toBytes()) . "\r\n" . - ' ' . Strings::base64_encode($e->toBytes()) . "\r\n" . - ''; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/PrivateKey.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/PrivateKey.php deleted file mode 100644 index 1ad76e4..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/PrivateKey.php +++ /dev/null @@ -1,530 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\RSA; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Random; -use OCA\Libresign\Vendor\phpseclib3\Crypt\RSA; -use OCA\Libresign\Vendor\phpseclib3\Crypt\RSA\Formats\Keys\PSS; -use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedFormatException; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * Raw RSA Key Handler - * - * @author Jim Wigginton - */ -final class PrivateKey extends RSA implements Common\PrivateKey -{ - use Common\Traits\PasswordProtected; - - /** - * Primes for Chinese Remainder Theorem (ie. p and q) - * - * @var array - */ - protected $primes; - - /** - * Exponents for Chinese Remainder Theorem (ie. dP and dQ) - * - * @var array - */ - protected $exponents; - - /** - * Coefficients for Chinese Remainder Theorem (ie. qInv) - * - * @var array - */ - protected $coefficients; - - /** - * Private Exponent - * - * @var BigInteger - */ - protected $privateExponent; - - /** - * RSADP - * - * See {@link http://tools.ietf.org/html/rfc3447#section-5.1.2 RFC3447#section-5.1.2}. - * - * @return bool|BigInteger - */ - private function rsadp(BigInteger $c) - { - if ($c->compare(self::$zero) < 0 || $c->compare($this->modulus) > 0) { - throw new \OutOfRangeException('Ciphertext representative out of range'); - } - return $this->exponentiate($c); - } - - /** - * RSASP1 - * - * See {@link http://tools.ietf.org/html/rfc3447#section-5.2.1 RFC3447#section-5.2.1}. - * - * @return bool|BigInteger - */ - private function rsasp1(BigInteger $m) - { - if ($m->compare(self::$zero) < 0 || $m->compare($this->modulus) > 0) { - throw new \OutOfRangeException('Signature representative out of range'); - } - return $this->exponentiate($m); - } - - /** - * Exponentiate - * - * @param BigInteger $x - * @return BigInteger - */ - protected function exponentiate(BigInteger $x) - { - switch (true) { - case empty($this->primes): - case $this->primes[1]->equals(self::$zero): - case empty($this->coefficients): - case $this->coefficients[2]->equals(self::$zero): - case empty($this->exponents): - case $this->exponents[1]->equals(self::$zero): - return $x->modPow($this->exponent, $this->modulus); - } - - $num_primes = count($this->primes); - - if (!static::$enableBlinding) { - $m_i = [ - 1 => $x->modPow($this->exponents[1], $this->primes[1]), - 2 => $x->modPow($this->exponents[2], $this->primes[2]) - ]; - $h = $m_i[1]->subtract($m_i[2]); - $h = $h->multiply($this->coefficients[2]); - list(, $h) = $h->divide($this->primes[1]); - $m = $m_i[2]->add($h->multiply($this->primes[2])); - - $r = $this->primes[1]; - for ($i = 3; $i <= $num_primes; $i++) { - $m_i = $x->modPow($this->exponents[$i], $this->primes[$i]); - - $r = $r->multiply($this->primes[$i - 1]); - - $h = $m_i->subtract($m); - $h = $h->multiply($this->coefficients[$i]); - list(, $h) = $h->divide($this->primes[$i]); - - $m = $m->add($r->multiply($h)); - } - } else { - $smallest = $this->primes[1]; - for ($i = 2; $i <= $num_primes; $i++) { - if ($smallest->compare($this->primes[$i]) > 0) { - $smallest = $this->primes[$i]; - } - } - - $r = BigInteger::randomRange(self::$one, $smallest->subtract(self::$one)); - - $m_i = [ - 1 => $this->blind($x, $r, 1), - 2 => $this->blind($x, $r, 2) - ]; - $h = $m_i[1]->subtract($m_i[2]); - $h = $h->multiply($this->coefficients[2]); - list(, $h) = $h->divide($this->primes[1]); - $m = $m_i[2]->add($h->multiply($this->primes[2])); - - $r = $this->primes[1]; - for ($i = 3; $i <= $num_primes; $i++) { - $m_i = $this->blind($x, $r, $i); - - $r = $r->multiply($this->primes[$i - 1]); - - $h = $m_i->subtract($m); - $h = $h->multiply($this->coefficients[$i]); - list(, $h) = $h->divide($this->primes[$i]); - - $m = $m->add($r->multiply($h)); - } - } - - return $m; - } - - /** - * Performs RSA Blinding - * - * Protects against timing attacks by employing RSA Blinding. - * Returns $x->modPow($this->exponents[$i], $this->primes[$i]) - * - * @param BigInteger $x - * @param BigInteger $r - * @param int $i - * @return BigInteger - */ - private function blind(BigInteger $x, BigInteger $r, $i) - { - $x = $x->multiply($r->modPow($this->publicExponent, $this->primes[$i])); - $x = $x->modPow($this->exponents[$i], $this->primes[$i]); - - $r = $r->modInverse($this->primes[$i]); - $x = $x->multiply($r); - list(, $x) = $x->divide($this->primes[$i]); - - return $x; - } - - /** - * EMSA-PSS-ENCODE - * - * See {@link http://tools.ietf.org/html/rfc3447#section-9.1.1 RFC3447#section-9.1.1}. - * - * @return string - * @param string $m - * @throws \RuntimeException on encoding error - * @param int $emBits - */ - private function emsa_pss_encode($m, $emBits) - { - // if $m is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error - // be output. - - $emLen = ($emBits + 1) >> 3; // ie. ceil($emBits / 8) - $sLen = $this->sLen !== null ? $this->sLen : $this->hLen; - - $mHash = $this->hash->hash($m); - if ($emLen < $this->hLen + $sLen + 2) { - throw new \LengthException('RSA modulus too short'); - } - - $salt = Random::string($sLen); - $m2 = "\0\0\0\0\0\0\0\0" . $mHash . $salt; - $h = $this->hash->hash($m2); - $ps = str_repeat(chr(0), $emLen - $sLen - $this->hLen - 2); - $db = $ps . chr(1) . $salt; - $dbMask = $this->mgf1($h, $emLen - $this->hLen - 1); // ie. stlren($db) - $maskedDB = $db ^ $dbMask; - $maskedDB[0] = ~chr(0xFF << ($emBits & 7)) & $maskedDB[0]; - $em = $maskedDB . $h . chr(0xBC); - - return $em; - } - - /** - * RSASSA-PSS-SIGN - * - * See {@link http://tools.ietf.org/html/rfc3447#section-8.1.1 RFC3447#section-8.1.1}. - * - * @param string $m - * @return bool|string - */ - private function rsassa_pss_sign($m) - { - // EMSA-PSS encoding - - $em = $this->emsa_pss_encode($m, 8 * $this->k - 1); - - // RSA signature - - $m = $this->os2ip($em); - $s = $this->rsasp1($m); - $s = $this->i2osp($s, $this->k); - - // Output the signature S - - return $s; - } - - /** - * RSASSA-PKCS1-V1_5-SIGN - * - * See {@link http://tools.ietf.org/html/rfc3447#section-8.2.1 RFC3447#section-8.2.1}. - * - * @param string $m - * @throws \LengthException if the RSA modulus is too short - * @return bool|string - */ - private function rsassa_pkcs1_v1_5_sign($m) - { - // EMSA-PKCS1-v1_5 encoding - - // If the encoding operation outputs "intended encoded message length too short," output "RSA modulus - // too short" and stop. - try { - $em = $this->emsa_pkcs1_v1_5_encode($m, $this->k); - } catch (\LengthException $e) { - throw new \LengthException('RSA modulus too short'); - } - - // RSA signature - - $m = $this->os2ip($em); - $s = $this->rsasp1($m); - $s = $this->i2osp($s, $this->k); - - // Output the signature S - - return $s; - } - - /** - * Create a signature - * - * @see self::verify() - * @param string $message - * @return string - */ - public function sign($message) - { - switch ($this->signaturePadding) { - case self::SIGNATURE_PKCS1: - case self::SIGNATURE_RELAXED_PKCS1: - return $this->rsassa_pkcs1_v1_5_sign($message); - //case self::SIGNATURE_PSS: - default: - return $this->rsassa_pss_sign($message); - } - } - - /** - * RSAES-PKCS1-V1_5-DECRYPT - * - * See {@link http://tools.ietf.org/html/rfc3447#section-7.2.2 RFC3447#section-7.2.2}. - * - * @param string $c - * @return bool|string - */ - private function rsaes_pkcs1_v1_5_decrypt($c) - { - // Length checking - - if (strlen($c) != $this->k) { // or if k < 11 - throw new \LengthException('Ciphertext representative too long'); - } - - // RSA decryption - - $c = $this->os2ip($c); - $m = $this->rsadp($c); - $em = $this->i2osp($m, $this->k); - - // EME-PKCS1-v1_5 decoding - - if (ord($em[0]) != 0 || ord($em[1]) > 2) { - throw new \RuntimeException('Decryption error'); - } - - $ps = substr($em, 2, strpos($em, chr(0), 2) - 2); - $m = substr($em, strlen($ps) + 3); - - if (strlen($ps) < 8) { - throw new \RuntimeException('Decryption error'); - } - - // Output M - - return $m; - } - - /** - * RSAES-OAEP-DECRYPT - * - * See {@link http://tools.ietf.org/html/rfc3447#section-7.1.2 RFC3447#section-7.1.2}. The fact that the error - * messages aren't distinguishable from one another hinders debugging, but, to quote from RFC3447#section-7.1.2: - * - * Note. Care must be taken to ensure that an opponent cannot - * distinguish the different error conditions in Step 3.g, whether by - * error message or timing, or, more generally, learn partial - * information about the encoded message EM. Otherwise an opponent may - * be able to obtain useful information about the decryption of the - * ciphertext C, leading to a chosen-ciphertext attack such as the one - * observed by Manger [36]. - * - * @param string $c - * @return bool|string - */ - private function rsaes_oaep_decrypt($c) - { - // Length checking - - // if $l is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error - // be output. - - if (strlen($c) != $this->k || $this->k < 2 * $this->hLen + 2) { - throw new \LengthException('Ciphertext representative too long'); - } - - // RSA decryption - - $c = $this->os2ip($c); - $m = $this->rsadp($c); - $em = $this->i2osp($m, $this->k); - - // EME-OAEP decoding - - $lHash = $this->hash->hash($this->label); - $y = ord($em[0]); - $maskedSeed = substr($em, 1, $this->hLen); - $maskedDB = substr($em, $this->hLen + 1); - $seedMask = $this->mgf1($maskedDB, $this->hLen); - $seed = $maskedSeed ^ $seedMask; - $dbMask = $this->mgf1($seed, $this->k - $this->hLen - 1); - $db = $maskedDB ^ $dbMask; - $lHash2 = substr($db, 0, $this->hLen); - $m = substr($db, $this->hLen); - $hashesMatch = hash_equals($lHash, $lHash2); - $leadingZeros = 1; - $patternMatch = 0; - $offset = 0; - for ($i = 0; $i < strlen($m); $i++) { - $patternMatch |= $leadingZeros & ($m[$i] === "\1"); - $leadingZeros &= $m[$i] === "\0"; - $offset += $patternMatch ? 0 : 1; - } - - // we do | instead of || to avoid https://en.wikipedia.org/wiki/Short-circuit_evaluation - // to protect against timing attacks - if (!$hashesMatch | !$patternMatch) { - throw new \RuntimeException('Decryption error'); - } - - // Output the message M - - return substr($m, $offset + 1); - } - - /** - * Raw Encryption / Decryption - * - * Doesn't use padding and is not recommended. - * - * @param string $m - * @return bool|string - * @throws \LengthException if strlen($m) > $this->k - */ - private function raw_encrypt($m) - { - if (strlen($m) > $this->k) { - throw new \LengthException('Ciphertext representative too long'); - } - - $temp = $this->os2ip($m); - $temp = $this->rsadp($temp); - return $this->i2osp($temp, $this->k); - } - - /** - * Decryption - * - * @see self::encrypt() - * @param string $ciphertext - * @return bool|string - */ - public function decrypt($ciphertext) - { - switch ($this->encryptionPadding) { - case self::ENCRYPTION_NONE: - return $this->raw_encrypt($ciphertext); - case self::ENCRYPTION_PKCS1: - return $this->rsaes_pkcs1_v1_5_decrypt($ciphertext); - //case self::ENCRYPTION_OAEP: - default: - return $this->rsaes_oaep_decrypt($ciphertext); - } - } - - /** - * Returns the public key - * - * @return mixed - */ - public function getPublicKey() - { - $type = self::validatePlugin('Keys', 'PKCS8', 'savePublicKey'); - if (empty($this->modulus) || empty($this->publicExponent)) { - throw new \RuntimeException('Public key components not found'); - } - - $key = $type::savePublicKey($this->modulus, $this->publicExponent); - return RSA::loadFormat('PKCS8', $key) - ->withHash($this->hash->getHash()) - ->withMGFHash($this->mgfHash->getHash()) - ->withSaltLength($this->sLen) - ->withLabel($this->label) - ->withPadding($this->signaturePadding | $this->encryptionPadding); - } - - /** - * Returns the private key - * - * @param string $type - * @param array $options optional - * @return string - */ - public function toString($type, array $options = []) - { - $type = self::validatePlugin( - 'Keys', - $type, - empty($this->primes) ? 'savePublicKey' : 'savePrivateKey' - ); - - if ($type == PSS::class) { - if ($this->signaturePadding == self::SIGNATURE_PSS) { - $options += [ - 'hash' => $this->hash->getHash(), - 'MGFHash' => $this->mgfHash->getHash(), - 'saltLength' => $this->getSaltLength() - ]; - } else { - throw new UnsupportedFormatException('The PSS format can only be used when the signature method has been explicitly set to PSS'); - } - } - - if (empty($this->primes)) { - return $type::savePublicKey($this->modulus, $this->exponent, $options); - } - - return $type::savePrivateKey($this->modulus, $this->publicExponent, $this->exponent, $this->primes, $this->exponents, $this->coefficients, $this->password, $options); - - /* - $key = $type::savePrivateKey($this->modulus, $this->publicExponent, $this->exponent, $this->primes, $this->exponents, $this->coefficients, $this->password, $options); - if ($key !== false || count($this->primes) == 2) { - return $key; - } - - $nSize = $this->getSize() >> 1; - - $primes = [1 => clone self::$one, clone self::$one]; - $i = 1; - foreach ($this->primes as $prime) { - $primes[$i] = $primes[$i]->multiply($prime); - if ($primes[$i]->getLength() >= $nSize) { - $i++; - } - } - - $exponents = []; - $coefficients = [2 => $primes[2]->modInverse($primes[1])]; - - foreach ($primes as $i => $prime) { - $temp = $prime->subtract(self::$one); - $exponents[$i] = $this->modulus->modInverse($temp); - } - - return $type::savePrivateKey($this->modulus, $this->publicExponent, $this->exponent, $primes, $exponents, $coefficients, $this->password, $options); - */ - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/PublicKey.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/PublicKey.php deleted file mode 100644 index 4bbccfc..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/RSA/PublicKey.php +++ /dev/null @@ -1,513 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt\RSA; - -use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Hash; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Random; -use OCA\Libresign\Vendor\phpseclib3\Crypt\RSA; -use OCA\Libresign\Vendor\phpseclib3\Crypt\RSA\Formats\Keys\PSS; -use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedAlgorithmException; -use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedFormatException; -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; -use OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps\DigestInfo; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * Raw RSA Key Handler - * - * @author Jim Wigginton - */ -final class PublicKey extends RSA implements Common\PublicKey -{ - use Common\Traits\Fingerprint; - - /** - * Exponentiate - * - * @param BigInteger $x - * @return BigInteger - */ - private function exponentiate(BigInteger $x) - { - return $x->modPow($this->exponent, $this->modulus); - } - - /** - * RSAVP1 - * - * See {@link http://tools.ietf.org/html/rfc3447#section-5.2.2 RFC3447#section-5.2.2}. - * - * @param BigInteger $s - * @return bool|BigInteger - */ - private function rsavp1($s) - { - if ($s->compare(self::$zero) < 0 || $s->compare($this->modulus) > 0) { - return false; - } - return $this->exponentiate($s); - } - - /** - * RSASSA-PKCS1-V1_5-VERIFY - * - * See {@link http://tools.ietf.org/html/rfc3447#section-8.2.2 RFC3447#section-8.2.2}. - * - * @param string $m - * @param string $s - * @throws \LengthException if the RSA modulus is too short - * @return bool - */ - private function rsassa_pkcs1_v1_5_verify($m, $s) - { - // Length checking - - if (strlen($s) != $this->k) { - return false; - } - - // RSA verification - - $s = $this->os2ip($s); - $m2 = $this->rsavp1($s); - if ($m2 === false) { - return false; - } - $em = $this->i2osp($m2, $this->k); - if ($em === false) { - return false; - } - - // EMSA-PKCS1-v1_5 encoding - - $exception = false; - - // If the encoding operation outputs "intended encoded message length too short," output "RSA modulus - // too short" and stop. - try { - $em2 = $this->emsa_pkcs1_v1_5_encode($m, $this->k); - $r1 = hash_equals($em, $em2); - } catch (\LengthException $e) { - $exception = true; - } - - try { - $em3 = $this->emsa_pkcs1_v1_5_encode_without_null($m, $this->k); - $r2 = hash_equals($em, $em3); - } catch (\LengthException $e) { - $exception = true; - } catch (UnsupportedAlgorithmException $e) { - $r2 = false; - } - - if ($exception) { - throw new \LengthException('RSA modulus too short'); - } - - // Compare - return $r1 || $r2; - } - - /** - * RSASSA-PKCS1-V1_5-VERIFY (relaxed matching) - * - * Per {@link http://tools.ietf.org/html/rfc3447#page-43 RFC3447#page-43} PKCS1 v1.5 - * specified the use BER encoding rather than DER encoding that PKCS1 v2.0 specified. - * This means that under rare conditions you can have a perfectly valid v1.5 signature - * that fails to validate with _rsassa_pkcs1_v1_5_verify(). PKCS1 v2.1 also recommends - * that if you're going to validate these types of signatures you "should indicate - * whether the underlying BER encoding is a DER encoding and hence whether the signature - * is valid with respect to the specification given in [PKCS1 v2.0+]". so if you do - * $rsa->getLastPadding() and get RSA::PADDING_RELAXED_PKCS1 back instead of - * RSA::PADDING_PKCS1... that means BER encoding was used. - * - * @param string $m - * @param string $s - * @return bool - */ - private function rsassa_pkcs1_v1_5_relaxed_verify($m, $s) - { - // Length checking - - if (strlen($s) != $this->k) { - return false; - } - - // RSA verification - - $s = $this->os2ip($s); - $m2 = $this->rsavp1($s); - if ($m2 === false) { - return false; - } - $em = $this->i2osp($m2, $this->k); - if ($em === false) { - return false; - } - - if (Strings::shift($em, 2) != "\0\1") { - return false; - } - - $em = ltrim($em, "\xFF"); - if (Strings::shift($em) != "\0") { - return false; - } - - $decoded = ASN1::decodeBER($em); - if (!is_array($decoded) || empty($decoded[0]) || strlen($em) > $decoded[0]['length']) { - return false; - } - - static $oids; - if (!isset($oids)) { - $oids = [ - 'md2' => '1.2.840.113549.2.2', - 'md4' => '1.2.840.113549.2.4', // from PKCS1 v1.5 - 'md5' => '1.2.840.113549.2.5', - 'id-sha1' => '1.3.14.3.2.26', - 'id-sha256' => '2.16.840.1.101.3.4.2.1', - 'id-sha384' => '2.16.840.1.101.3.4.2.2', - 'id-sha512' => '2.16.840.1.101.3.4.2.3', - // from PKCS1 v2.2 - 'id-sha224' => '2.16.840.1.101.3.4.2.4', - 'id-sha512/224' => '2.16.840.1.101.3.4.2.5', - 'id-sha512/256' => '2.16.840.1.101.3.4.2.6', - ]; - ASN1::loadOIDs($oids); - } - - $decoded = ASN1::asn1map($decoded[0], DigestInfo::MAP); - if (!isset($decoded) || $decoded === false) { - return false; - } - - if (!isset($oids[$decoded['digestAlgorithm']['algorithm']])) { - return false; - } - - if (isset($decoded['digestAlgorithm']['parameters']) && $decoded['digestAlgorithm']['parameters'] !== ['null' => '']) { - return false; - } - - $hash = $decoded['digestAlgorithm']['algorithm']; - $hash = substr($hash, 0, 3) == 'id-' ? - substr($hash, 3) : - $hash; - $hash = new Hash($hash); - $em = $hash->hash($m); - $em2 = $decoded['digest']; - - return hash_equals($em, $em2); - } - - /** - * EMSA-PSS-VERIFY - * - * See {@link http://tools.ietf.org/html/rfc3447#section-9.1.2 RFC3447#section-9.1.2}. - * - * @param string $m - * @param string $em - * @param int $emBits - * @return string - */ - private function emsa_pss_verify($m, $em, $emBits) - { - // if $m is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error - // be output. - - $emLen = ($emBits + 7) >> 3; // ie. ceil($emBits / 8); - $sLen = $this->sLen !== null ? $this->sLen : $this->hLen; - - $mHash = $this->hash->hash($m); - if ($emLen < $this->hLen + $sLen + 2) { - return false; - } - - if ($em[strlen($em) - 1] != chr(0xBC)) { - return false; - } - - $maskedDB = substr($em, 0, -$this->hLen - 1); - $h = substr($em, -$this->hLen - 1, $this->hLen); - $temp = chr(0xFF << ($emBits & 7)); - if ((~$maskedDB[0] & $temp) != $temp) { - return false; - } - $dbMask = $this->mgf1($h, $emLen - $this->hLen - 1); - $db = $maskedDB ^ $dbMask; - $db[0] = ~chr(0xFF << ($emBits & 7)) & $db[0]; - $temp = $emLen - $this->hLen - $sLen - 2; - if (substr($db, 0, $temp) != str_repeat(chr(0), $temp) || ord($db[$temp]) != 1) { - return false; - } - $salt = substr($db, $temp + 1); // should be $sLen long - $m2 = "\0\0\0\0\0\0\0\0" . $mHash . $salt; - $h2 = $this->hash->hash($m2); - return hash_equals($h, $h2); - } - - /** - * RSASSA-PSS-VERIFY - * - * See {@link http://tools.ietf.org/html/rfc3447#section-8.1.2 RFC3447#section-8.1.2}. - * - * @param string $m - * @param string $s - * @return bool|string - */ - private function rsassa_pss_verify($m, $s) - { - // Length checking - - if (strlen($s) != $this->k) { - return false; - } - - // RSA verification - - $modBits = strlen($this->modulus->toBits()); - - $s2 = $this->os2ip($s); - $m2 = $this->rsavp1($s2); - $em = $this->i2osp($m2, $this->k); - if ($em === false) { - return false; - } - - // EMSA-PSS verification - - return $this->emsa_pss_verify($m, $em, $modBits - 1); - } - - /** - * Verifies a signature - * - * @see self::sign() - * @param string $message - * @param string $signature - * @return bool - */ - public function verify($message, $signature) - { - switch ($this->signaturePadding) { - case self::SIGNATURE_RELAXED_PKCS1: - return $this->rsassa_pkcs1_v1_5_relaxed_verify($message, $signature); - case self::SIGNATURE_PKCS1: - return $this->rsassa_pkcs1_v1_5_verify($message, $signature); - //case self::SIGNATURE_PSS: - default: - return $this->rsassa_pss_verify($message, $signature); - } - } - - /** - * RSAES-PKCS1-V1_5-ENCRYPT - * - * See {@link http://tools.ietf.org/html/rfc3447#section-7.2.1 RFC3447#section-7.2.1}. - * - * @param string $m - * @param bool $pkcs15_compat optional - * @throws \LengthException if strlen($m) > $this->k - 11 - * @return bool|string - */ - private function rsaes_pkcs1_v1_5_encrypt($m, $pkcs15_compat = false) - { - $mLen = strlen($m); - - // Length checking - - if ($mLen > $this->k - 11) { - throw new \LengthException('Message too long'); - } - - // EME-PKCS1-v1_5 encoding - - $psLen = $this->k - $mLen - 3; - $ps = ''; - while (strlen($ps) != $psLen) { - $temp = Random::string($psLen - strlen($ps)); - $temp = str_replace("\x00", '', $temp); - $ps .= $temp; - } - $type = 2; - $em = chr(0) . chr($type) . $ps . chr(0) . $m; - - // RSA encryption - $m = $this->os2ip($em); - $c = $this->rsaep($m); - $c = $this->i2osp($c, $this->k); - - // Output the ciphertext C - - return $c; - } - - /** - * RSAES-OAEP-ENCRYPT - * - * See {@link http://tools.ietf.org/html/rfc3447#section-7.1.1 RFC3447#section-7.1.1} and - * {http://en.wikipedia.org/wiki/Optimal_Asymmetric_Encryption_Padding OAES}. - * - * @param string $m - * @throws \LengthException if strlen($m) > $this->k - 2 * $this->hLen - 2 - * @return string - */ - private function rsaes_oaep_encrypt($m) - { - $mLen = strlen($m); - - // Length checking - - // if $l is larger than two million terrabytes and you're using sha1, PKCS#1 suggests a "Label too long" error - // be output. - - if ($mLen > $this->k - 2 * $this->hLen - 2) { - throw new \LengthException('Message too long'); - } - - // EME-OAEP encoding - - $lHash = $this->hash->hash($this->label); - $ps = str_repeat(chr(0), $this->k - $mLen - 2 * $this->hLen - 2); - $db = $lHash . $ps . chr(1) . $m; - $seed = Random::string($this->hLen); - $dbMask = $this->mgf1($seed, $this->k - $this->hLen - 1); - $maskedDB = $db ^ $dbMask; - $seedMask = $this->mgf1($maskedDB, $this->hLen); - $maskedSeed = $seed ^ $seedMask; - $em = chr(0) . $maskedSeed . $maskedDB; - - // RSA encryption - - $m = $this->os2ip($em); - $c = $this->rsaep($m); - $c = $this->i2osp($c, $this->k); - - // Output the ciphertext C - - return $c; - } - - /** - * RSAEP - * - * See {@link http://tools.ietf.org/html/rfc3447#section-5.1.1 RFC3447#section-5.1.1}. - * - * @param BigInteger $m - * @return bool|BigInteger - */ - private function rsaep($m) - { - if ($m->compare(self::$zero) < 0 || $m->compare($this->modulus) > 0) { - throw new \OutOfRangeException('Message representative out of range'); - } - return $this->exponentiate($m); - } - - /** - * Raw Encryption / Decryption - * - * Doesn't use padding and is not recommended. - * - * @param string $m - * @return bool|string - * @throws \LengthException if strlen($m) > $this->k - */ - private function raw_encrypt($m) - { - if (strlen($m) > $this->k) { - throw new \LengthException('Message too long'); - } - - $temp = $this->os2ip($m); - $temp = $this->rsaep($temp); - return $this->i2osp($temp, $this->k); - } - - /** - * Encryption - * - * Both self::PADDING_OAEP and self::PADDING_PKCS1 both place limits on how long $plaintext can be. - * If $plaintext exceeds those limits it will be broken up so that it does and the resultant ciphertext's will - * be concatenated together. - * - * @see self::decrypt() - * @param string $plaintext - * @return bool|string - * @throws \LengthException if the RSA modulus is too short - */ - public function encrypt($plaintext) - { - switch ($this->encryptionPadding) { - case self::ENCRYPTION_NONE: - return $this->raw_encrypt($plaintext); - case self::ENCRYPTION_PKCS1: - return $this->rsaes_pkcs1_v1_5_encrypt($plaintext); - //case self::ENCRYPTION_OAEP: - default: - return $this->rsaes_oaep_encrypt($plaintext); - } - } - - /** - * Returns the public key - * - * The public key is only returned under two circumstances - if the private key had the public key embedded within it - * or if the public key was set via setPublicKey(). If the currently loaded key is supposed to be the public key this - * function won't return it since this library, for the most part, doesn't distinguish between public and private keys. - * - * @param string $type - * @param array $options optional - * @return mixed - */ - public function toString($type, array $options = []) - { - $type = self::validatePlugin('Keys', $type, 'savePublicKey'); - - if ($type == PSS::class) { - if ($this->signaturePadding == self::SIGNATURE_PSS) { - $options += [ - 'hash' => $this->hash->getHash(), - 'MGFHash' => $this->mgfHash->getHash(), - 'saltLength' => $this->getSaltLength() - ]; - } else { - throw new UnsupportedFormatException('The PSS format can only be used when the signature method has been explicitly set to PSS'); - } - } - - return $type::savePublicKey($this->modulus, $this->publicExponent, $options); - } - - /** - * Converts a public key to a private key - * - * @return RSA - */ - public function asPrivateKey() - { - $new = new PrivateKey(); - $new->exponent = $this->exponent; - $new->modulus = $this->modulus; - $new->k = $this->k; - $new->format = $this->format; - return $new - ->withHash($this->hash->getHash()) - ->withMGFHash($this->mgfHash->getHash()) - ->withSaltLength($this->sLen) - ->withLabel($this->label) - ->withPadding($this->signaturePadding | $this->encryptionPadding); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/Random.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/Random.php deleted file mode 100644 index ca64c54..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/Random.php +++ /dev/null @@ -1,222 +0,0 @@ - - * - * - * - * @author Jim Wigginton - * @copyright 2007 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt; - -/** - * Pure-PHP Random Number Generator - * - * @author Jim Wigginton - */ -abstract class Random -{ - /** - * Generate a random string. - * - * Although microoptimizations are generally discouraged as they impair readability this function is ripe with - * microoptimizations because this function has the potential of being called a huge number of times. - * eg. for RSA key generation. - * - * @param int $length - * @throws \RuntimeException if a symmetric cipher is needed but not loaded - * @return string - */ - public static function string($length) - { - if (!$length) { - return ''; - } - - try { - return random_bytes($length); - } catch (\Exception $e) { - // random_compat will throw an Exception, which in PHP 5 does not implement Throwable - } catch (\Throwable $e) { - // If a sufficient source of randomness is unavailable, random_bytes() will throw an - // object that implements the Throwable interface (Exception, TypeError, Error). - // We don't actually need to do anything here. The string() method should just continue - // as normal. Note, however, that if we don't have a sufficient source of randomness for - // random_bytes(), most of the other calls here will fail too, so we'll end up using - // the PHP implementation. - } - // at this point we have no choice but to use a pure-PHP CSPRNG - - // cascade entropy across multiple PHP instances by fixing the session and collecting all - // environmental variables, including the previous session data and the current session - // data. - // - // mt_rand seeds itself by looking at the PID and the time, both of which are (relatively) - // easy to guess at. linux uses mouse clicks, keyboard timings, etc, as entropy sources, but - // PHP isn't low level to be able to use those as sources and on a web server there's not likely - // going to be a ton of keyboard or mouse action. web servers do have one thing that we can use - // however, a ton of people visiting the website. obviously you don't want to base your seeding - // solely on parameters a potential attacker sends but (1) not everything in $_SERVER is controlled - // by the user and (2) this isn't just looking at the data sent by the current user - it's based - // on the data sent by all users. one user requests the page and a hash of their info is saved. - // another user visits the page and the serialization of their data is utilized along with the - // server environment stuff and a hash of the previous http request data (which itself utilizes - // a hash of the session data before that). certainly an attacker should be assumed to have - // full control over his own http requests. he, however, is not going to have control over - // everyone's http requests. - static $crypto = false, $v; - if ($crypto === false) { - // save old session data - $old_session_id = session_id(); - $old_use_cookies = ini_get('session.use_cookies'); - $old_session_cache_limiter = session_cache_limiter(); - $_OLD_SESSION = isset($_SESSION) ? $_SESSION : false; - if ($old_session_id != '') { - session_write_close(); - } - - session_id(1); - ini_set('session.use_cookies', 0); - session_cache_limiter(''); - session_start(); - - $v = (isset($_SERVER) ? self::safe_serialize($_SERVER) : '') . - (isset($_POST) ? self::safe_serialize($_POST) : '') . - (isset($_GET) ? self::safe_serialize($_GET) : '') . - (isset($_COOKIE) ? self::safe_serialize($_COOKIE) : '') . - // as of PHP 8.1 $GLOBALS can't be accessed by reference, which eliminates - // the need for phpseclib_safe_serialize. see https://wiki.php.net/rfc/restrict_globals_usage - // for more info - (version_compare(PHP_VERSION, '8.1.0', '>=') ? serialize($GLOBALS) : self::safe_serialize($GLOBALS)) . - self::safe_serialize($_SESSION) . - self::safe_serialize($_OLD_SESSION); - $v = $seed = $_SESSION['seed'] = sha1($v, true); - if (!isset($_SESSION['count'])) { - $_SESSION['count'] = 0; - } - $_SESSION['count']++; - - session_write_close(); - - // restore old session data - if ($old_session_id != '') { - session_id($old_session_id); - session_start(); - ini_set('session.use_cookies', $old_use_cookies); - session_cache_limiter($old_session_cache_limiter); - } else { - if ($_OLD_SESSION !== false) { - $_SESSION = $_OLD_SESSION; - unset($_OLD_SESSION); - } else { - unset($_SESSION); - } - } - - // in SSH2 a shared secret and an exchange hash are generated through the key exchange process. - // the IV client to server is the hash of that "nonce" with the letter A and for the encryption key it's the letter C. - // if the hash doesn't produce enough a key or an IV that's long enough concat successive hashes of the - // original hash and the current hash. we'll be emulating that. for more info see the following URL: - // - // http://tools.ietf.org/html/rfc4253#section-7.2 - // - // see the is_string($crypto) part for an example of how to expand the keys - $key = sha1($seed . 'A', true); - $iv = sha1($seed . 'C', true); - - // ciphers are used as per the nist.gov link below. also, see this link: - // - // http://en.wikipedia.org/wiki/Cryptographically_secure_pseudorandom_number_generator#Designs_based_on_cryptographic_primitives - switch (true) { - case class_exists('\phpseclib3\Crypt\AES'): - $crypto = new AES('ctr'); - break; - case class_exists('\phpseclib3\Crypt\Twofish'): - $crypto = new Twofish('ctr'); - break; - case class_exists('\phpseclib3\Crypt\Blowfish'): - $crypto = new Blowfish('ctr'); - break; - case class_exists('\phpseclib3\Crypt\TripleDES'): - $crypto = new TripleDES('ctr'); - break; - case class_exists('\phpseclib3\Crypt\DES'): - $crypto = new DES('ctr'); - break; - case class_exists('\phpseclib3\Crypt\RC4'): - $crypto = new RC4(); - break; - default: - throw new \RuntimeException(__CLASS__ . ' requires at least one symmetric cipher be loaded'); - } - - $crypto->setKey(substr($key, 0, $crypto->getKeyLength() >> 3)); - $crypto->setIV(substr($iv, 0, $crypto->getBlockLength() >> 3)); - $crypto->enableContinuousBuffer(); - } - - //return $crypto->encrypt(str_repeat("\0", $length)); - - // the following is based off of ANSI X9.31: - // - // http://csrc.nist.gov/groups/STM/cavp/documents/rng/931rngext.pdf - // - // OpenSSL uses that same standard for it's random numbers: - // - // http://www.opensource.apple.com/source/OpenSSL/OpenSSL-38/openssl/fips-1.0/rand/fips_rand.c - // (do a search for "ANS X9.31 A.2.4") - $result = ''; - while (strlen($result) < $length) { - $i = $crypto->encrypt(microtime()); // strlen(microtime()) == 21 - $r = $crypto->encrypt($i ^ $v); // strlen($v) == 20 - $v = $crypto->encrypt($r ^ $i); // strlen($r) == 20 - $result .= $r; - } - - return substr($result, 0, $length); - } - - /** - * Safely serialize variables - * - * If a class has a private __sleep() it'll emit a warning - * @return mixed - * @param mixed $arr - */ - private static function safe_serialize(&$arr) - { - if (is_object($arr)) { - return ''; - } - if (!is_array($arr)) { - return serialize($arr); - } - // prevent circular array recursion - if (isset($arr['__phpseclib_marker'])) { - return ''; - } - $safearr = []; - $arr['__phpseclib_marker'] = true; - foreach (array_keys($arr) as $key) { - // do not recurse on the '__phpseclib_marker' key itself, for smaller memory usage - if ($key !== '__phpseclib_marker') { - $safearr[$key] = self::safe_serialize($arr[$key]); - } - } - unset($arr['__phpseclib_marker']); - return serialize($safearr); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/Rijndael.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/Rijndael.php deleted file mode 100644 index 5d7d89a..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/Rijndael.php +++ /dev/null @@ -1,1036 +0,0 @@ - - * setKey('abcdefghijklmnop'); - * - * $size = 10 * 1024; - * $plaintext = ''; - * for ($i = 0; $i < $size; $i++) { - * $plaintext.= 'a'; - * } - * - * echo $rijndael->decrypt($rijndael->encrypt($plaintext)); - * ?> - * - * - * @author Jim Wigginton - * @copyright 2008 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt; - -use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\BlockCipher; -use OCA\Libresign\Vendor\phpseclib3\Exception\BadDecryptionException; -use OCA\Libresign\Vendor\phpseclib3\Exception\BadModeException; -use OCA\Libresign\Vendor\phpseclib3\Exception\InconsistentSetupException; -use OCA\Libresign\Vendor\phpseclib3\Exception\InsufficientSetupException; - -/** - * Pure-PHP implementation of Rijndael. - * - * @author Jim Wigginton - */ -class Rijndael extends BlockCipher -{ - /** - * The mcrypt specific name of the cipher - * - * Mcrypt is useable for 128/192/256-bit $block_size/$key_length. For 160/224 not. - * \phpseclib3\Crypt\Rijndael determines automatically whether mcrypt is useable - * or not for the current $block_size/$key_length. - * In case of, $cipher_name_mcrypt will be set dynamically at run time accordingly. - * - * @see Common\SymmetricKey::cipher_name_mcrypt - * @see Common\SymmetricKey::engine - * @see self::isValidEngine() - * @var string - */ - protected $cipher_name_mcrypt = 'rijndael-128'; - - /** - * The Key Schedule - * - * @see self::setup() - * @var array - */ - private $w; - - /** - * The Inverse Key Schedule - * - * @see self::setup() - * @var array - */ - private $dw; - - /** - * The Block Length divided by 32 - * - * {@internal The max value is 256 / 32 = 8, the min value is 128 / 32 = 4. Exists in conjunction with $block_size - * because the encryption / decryption / key schedule creation requires this number and not $block_size. We could - * derive this from $block_size or vice versa, but that'd mean we'd have to do multiple shift operations, so in lieu - * of that, we'll just precompute it once.} - * - * @see self::setBlockLength() - * @var int - */ - private $Nb = 4; - - /** - * The Key Length (in bytes) - * - * {@internal The max value is 256 / 8 = 32, the min value is 128 / 8 = 16. Exists in conjunction with $Nk - * because the encryption / decryption / key schedule creation requires this number and not $key_length. We could - * derive this from $key_length or vice versa, but that'd mean we'd have to do multiple shift operations, so in lieu - * of that, we'll just precompute it once.} - * - * @see self::setKeyLength() - * @var int - */ - protected $key_length = 16; - - /** - * The Key Length divided by 32 - * - * @see self::setKeyLength() - * @var int - * @internal The max value is 256 / 32 = 8, the min value is 128 / 32 = 4 - */ - private $Nk = 4; - - /** - * The Number of Rounds - * - * {@internal The max value is 14, the min value is 10.} - * - * @var int - */ - private $Nr; - - /** - * Shift offsets - * - * @var array - */ - private $c; - - /** - * Holds the last used key- and block_size information - * - * @var array - */ - private $kl; - - /** - * Default Constructor. - * - * @param string $mode - * @throws \InvalidArgumentException if an invalid / unsupported mode is provided - */ - public function __construct($mode) - { - parent::__construct($mode); - - if ($this->mode == self::MODE_STREAM) { - throw new BadModeException('Block ciphers cannot be ran in stream mode'); - } - } - - /** - * Sets the key length. - * - * Valid key lengths are 128, 160, 192, 224, and 256. - * - * Note: phpseclib extends Rijndael (and AES) for using 160- and 224-bit keys but they are officially not defined - * and the most (if not all) implementations are not able using 160/224-bit keys but round/pad them up to - * 192/256 bits as, for example, mcrypt will do. - * - * That said, if you want be compatible with other Rijndael and AES implementations, - * you should not setKeyLength(160) or setKeyLength(224). - * - * Additional: In case of 160- and 224-bit keys, phpseclib will/can, for that reason, not use - * the mcrypt php extension, even if available. - * This results then in slower encryption. - * - * @throws \LengthException if the key length is invalid - * @param int $length - */ - public function setKeyLength($length) - { - switch ($length) { - case 128: - case 160: - case 192: - case 224: - case 256: - $this->key_length = $length >> 3; - break; - default: - throw new \LengthException('Key size of ' . $length . ' bits is not supported by this algorithm. Only keys of sizes 128, 160, 192, 224 or 256 bits are supported'); - } - - parent::setKeyLength($length); - } - - /** - * Sets the key. - * - * Rijndael supports five different key lengths - * - * @see setKeyLength() - * @param string $key - * @throws \LengthException if the key length isn't supported - */ - public function setKey($key) - { - switch (strlen($key)) { - case 16: - case 20: - case 24: - case 28: - case 32: - break; - default: - throw new \LengthException('Key of size ' . strlen($key) . ' not supported by this algorithm. Only keys of sizes 16, 20, 24, 28 or 32 are supported'); - } - - parent::setKey($key); - } - - /** - * Sets the block length - * - * Valid block lengths are 128, 160, 192, 224, and 256. - * - * @param int $length - */ - public function setBlockLength($length) - { - switch ($length) { - case 128: - case 160: - case 192: - case 224: - case 256: - break; - default: - throw new \LengthException('Key size of ' . $length . ' bits is not supported by this algorithm. Only keys of sizes 128, 160, 192, 224 or 256 bits are supported'); - } - - $this->Nb = $length >> 5; - $this->block_size = $length >> 3; - $this->changed = $this->nonIVChanged = true; - $this->setEngine(); - } - - /** - * Test for engine validity - * - * This is mainly just a wrapper to set things up for \phpseclib3\Crypt\Common\SymmetricKey::isValidEngine() - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::__construct() - * @param int $engine - * @return bool - */ - protected function isValidEngineHelper($engine) - { - switch ($engine) { - case self::ENGINE_LIBSODIUM: - return function_exists('sodium_crypto_aead_aes256gcm_is_available') && - sodium_crypto_aead_aes256gcm_is_available() && - $this->mode == self::MODE_GCM && - $this->key_length == 32 && - $this->nonce && strlen($this->nonce) == 12 && - $this->block_size == 16; - case self::ENGINE_OPENSSL_GCM: - if (!extension_loaded('openssl')) { - return false; - } - $methods = openssl_get_cipher_methods(); - return $this->mode == self::MODE_GCM && - version_compare(PHP_VERSION, '7.1.0', '>=') && - in_array('aes-' . $this->getKeyLength() . '-gcm', $methods) && - $this->block_size == 16; - case self::ENGINE_OPENSSL: - if ($this->block_size != 16) { - return false; - } - $this->cipher_name_openssl_ecb = 'aes-' . ($this->key_length << 3) . '-ecb'; - $this->cipher_name_openssl = 'aes-' . ($this->key_length << 3) . '-' . $this->openssl_translate_mode(); - break; - case self::ENGINE_MCRYPT: - $this->cipher_name_mcrypt = 'rijndael-' . ($this->block_size << 3); - if ($this->key_length % 8) { // is it a 160/224-bit key? - // mcrypt is not usable for them, only for 128/192/256-bit keys - return false; - } - } - - return parent::isValidEngineHelper($engine); - } - - /** - * Encrypts a block - * - * @param string $in - * @return string - */ - protected function encryptBlock($in) - { - static $tables; - if (empty($tables)) { - $tables = &$this->getTables(); - } - $t0 = $tables[0]; - $t1 = $tables[1]; - $t2 = $tables[2]; - $t3 = $tables[3]; - $sbox = $tables[4]; - - $state = []; - $words = unpack('N*', $in); - - $c = $this->c; - $w = $this->w; - $Nb = $this->Nb; - $Nr = $this->Nr; - - // addRoundKey - $wc = $Nb - 1; - foreach ($words as $word) { - $state[] = $word ^ $w[++$wc]; - } - - // fips-197.pdf#page=19, "Figure 5. Pseudo Code for the Cipher", states that this loop has four components - - // subBytes, shiftRows, mixColumns, and addRoundKey. fips-197.pdf#page=30, "Implementation Suggestions Regarding - // Various Platforms" suggests that performs enhanced implementations are described in Rijndael-ammended.pdf. - // Rijndael-ammended.pdf#page=20, "Implementation aspects / 32-bit processor", discusses such an optimization. - // Unfortunately, the description given there is not quite correct. Per aes.spec.v316.pdf#page=19 [1], - // equation (7.4.7) is supposed to use addition instead of subtraction, so we'll do that here, as well. - - // [1] http://fp.gladman.plus.com/cryptography_technology/rijndael/aes.spec.v316.pdf - $temp = []; - for ($round = 1; $round < $Nr; ++$round) { - $i = 0; // $c[0] == 0 - $j = $c[1]; - $k = $c[2]; - $l = $c[3]; - - while ($i < $Nb) { - $temp[$i] = $t0[$state[$i] >> 24 & 0x000000FF] ^ - $t1[$state[$j] >> 16 & 0x000000FF] ^ - $t2[$state[$k] >> 8 & 0x000000FF] ^ - $t3[$state[$l] & 0x000000FF] ^ - $w[++$wc]; - ++$i; - $j = ($j + 1) % $Nb; - $k = ($k + 1) % $Nb; - $l = ($l + 1) % $Nb; - } - $state = $temp; - } - - // subWord - for ($i = 0; $i < $Nb; ++$i) { - $state[$i] = $sbox[$state[$i] & 0x000000FF] | - ($sbox[$state[$i] >> 8 & 0x000000FF] << 8) | - ($sbox[$state[$i] >> 16 & 0x000000FF] << 16) | - ($sbox[$state[$i] >> 24 & 0x000000FF] << 24); - } - - // shiftRows + addRoundKey - $i = 0; // $c[0] == 0 - $j = $c[1]; - $k = $c[2]; - $l = $c[3]; - while ($i < $Nb) { - $temp[$i] = ($state[$i] & intval(0xFF000000)) ^ - ($state[$j] & 0x00FF0000) ^ - ($state[$k] & 0x0000FF00) ^ - ($state[$l] & 0x000000FF) ^ - $w[$i]; - ++$i; - $j = ($j + 1) % $Nb; - $k = ($k + 1) % $Nb; - $l = ($l + 1) % $Nb; - } - - return pack('N*', ...$temp); - } - - /** - * Decrypts a block - * - * @param string $in - * @return string - */ - protected function decryptBlock($in) - { - static $invtables; - if (empty($invtables)) { - $invtables = &$this->getInvTables(); - } - $dt0 = $invtables[0]; - $dt1 = $invtables[1]; - $dt2 = $invtables[2]; - $dt3 = $invtables[3]; - $isbox = $invtables[4]; - - $state = []; - $words = unpack('N*', $in); - - $c = $this->c; - $dw = $this->dw; - $Nb = $this->Nb; - $Nr = $this->Nr; - - // addRoundKey - $wc = $Nb - 1; - foreach ($words as $word) { - $state[] = $word ^ $dw[++$wc]; - } - - $temp = []; - for ($round = $Nr - 1; $round > 0; --$round) { - $i = 0; // $c[0] == 0 - $j = $Nb - $c[1]; - $k = $Nb - $c[2]; - $l = $Nb - $c[3]; - - while ($i < $Nb) { - $temp[$i] = $dt0[$state[$i] >> 24 & 0x000000FF] ^ - $dt1[$state[$j] >> 16 & 0x000000FF] ^ - $dt2[$state[$k] >> 8 & 0x000000FF] ^ - $dt3[$state[$l] & 0x000000FF] ^ - $dw[++$wc]; - ++$i; - $j = ($j + 1) % $Nb; - $k = ($k + 1) % $Nb; - $l = ($l + 1) % $Nb; - } - $state = $temp; - } - - // invShiftRows + invSubWord + addRoundKey - $i = 0; // $c[0] == 0 - $j = $Nb - $c[1]; - $k = $Nb - $c[2]; - $l = $Nb - $c[3]; - - while ($i < $Nb) { - $word = ($state[$i] & intval(0xFF000000)) | - ($state[$j] & 0x00FF0000) | - ($state[$k] & 0x0000FF00) | - ($state[$l] & 0x000000FF); - - $temp[$i] = $dw[$i] ^ ($isbox[$word & 0x000000FF] | - ($isbox[$word >> 8 & 0x000000FF] << 8) | - ($isbox[$word >> 16 & 0x000000FF] << 16) | - ($isbox[$word >> 24 & 0x000000FF] << 24)); - ++$i; - $j = ($j + 1) % $Nb; - $k = ($k + 1) % $Nb; - $l = ($l + 1) % $Nb; - } - - return pack('N*', ...$temp); - } - - /** - * Setup the self::ENGINE_INTERNAL $engine - * - * (re)init, if necessary, the internal cipher $engine and flush all $buffers - * Used (only) if $engine == self::ENGINE_INTERNAL - * - * _setup() will be called each time if $changed === true - * typically this happens when using one or more of following public methods: - * - * - setKey() - * - * - setIV() - * - * - disableContinuousBuffer() - * - * - First run of encrypt() / decrypt() with no init-settings - * - * {@internal setup() is always called before en/decryption.} - * - * {@internal Could, but not must, extend by the child Crypt_* class} - * - * @see self::setKey() - * @see self::setIV() - * @see self::disableContinuousBuffer() - */ - protected function setup() - { - if (!$this->changed) { - return; - } - - parent::setup(); - - if (is_string($this->iv) && strlen($this->iv) != $this->block_size) { - throw new InconsistentSetupException('The IV length (' . strlen($this->iv) . ') does not match the block size (' . $this->block_size . ')'); - } - } - - /** - * Setup the key (expansion) - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::setupKey() - */ - protected function setupKey() - { - // Each number in $rcon is equal to the previous number multiplied by two in Rijndael's finite field. - // See http://en.wikipedia.org/wiki/Finite_field_arithmetic#Multiplicative_inverse - static $rcon; - - if (!isset($rcon)) { - $rcon = [0, - 0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000, - 0x20000000, 0x40000000, 0x80000000, 0x1B000000, 0x36000000, - 0x6C000000, 0xD8000000, 0xAB000000, 0x4D000000, 0x9A000000, - 0x2F000000, 0x5E000000, 0xBC000000, 0x63000000, 0xC6000000, - 0x97000000, 0x35000000, 0x6A000000, 0xD4000000, 0xB3000000, - 0x7D000000, 0xFA000000, 0xEF000000, 0xC5000000, 0x91000000 - ]; - $rcon = array_map('intval', $rcon); - } - - if (isset($this->kl['key']) && $this->key === $this->kl['key'] && $this->key_length === $this->kl['key_length'] && $this->block_size === $this->kl['block_size']) { - // already expanded - return; - } - $this->kl = ['key' => $this->key, 'key_length' => $this->key_length, 'block_size' => $this->block_size]; - - $this->Nk = $this->key_length >> 2; - // see Rijndael-ammended.pdf#page=44 - $this->Nr = max($this->Nk, $this->Nb) + 6; - - // shift offsets for Nb = 5, 7 are defined in Rijndael-ammended.pdf#page=44, - // "Table 8: Shift offsets in Shiftrow for the alternative block lengths" - // shift offsets for Nb = 4, 6, 8 are defined in Rijndael-ammended.pdf#page=14, - // "Table 2: Shift offsets for different block lengths" - switch ($this->Nb) { - case 4: - case 5: - case 6: - $this->c = [0, 1, 2, 3]; - break; - case 7: - $this->c = [0, 1, 2, 4]; - break; - case 8: - $this->c = [0, 1, 3, 4]; - } - - $w = array_values(unpack('N*words', $this->key)); - - $length = $this->Nb * ($this->Nr + 1); - for ($i = $this->Nk; $i < $length; $i++) { - $temp = $w[$i - 1]; - if ($i % $this->Nk == 0) { - // according to , "the size of an integer is platform-dependent". - // on a 32-bit machine, it's 32-bits, and on a 64-bit machine, it's 64-bits. on a 32-bit machine, - // 0xFFFFFFFF << 8 == 0xFFFFFF00, but on a 64-bit machine, it equals 0xFFFFFFFF00. as such, doing 'and' - // with 0xFFFFFFFF (or 0xFFFFFF00) on a 32-bit machine is unnecessary, but on a 64-bit machine, it is. - $temp = (($temp << 8) & intval(0xFFFFFF00)) | (($temp >> 24) & 0x000000FF); // rotWord - $temp = $this->subWord($temp) ^ $rcon[$i / $this->Nk]; - } elseif ($this->Nk > 6 && $i % $this->Nk == 4) { - $temp = $this->subWord($temp); - } - $w[$i] = $w[$i - $this->Nk] ^ $temp; - } - - // convert the key schedule from a vector of $Nb * ($Nr + 1) length to a matrix with $Nr + 1 rows and $Nb columns - // and generate the inverse key schedule. more specifically, - // according to (section 5.3.3), - // "The key expansion for the Inverse Cipher is defined as follows: - // 1. Apply the Key Expansion. - // 2. Apply InvMixColumn to all Round Keys except the first and the last one." - // also, see fips-197.pdf#page=27, "5.3.5 Equivalent Inverse Cipher" - list($dt0, $dt1, $dt2, $dt3) = $this->getInvTables(); - $temp = $this->w = $this->dw = []; - for ($i = $row = $col = 0; $i < $length; $i++, $col++) { - if ($col == $this->Nb) { - if ($row == 0) { - $this->dw[0] = $this->w[0]; - } else { - // subWord + invMixColumn + invSubWord = invMixColumn - $j = 0; - while ($j < $this->Nb) { - $dw = $this->subWord($this->w[$row][$j]); - $temp[$j] = $dt0[$dw >> 24 & 0x000000FF] ^ - $dt1[$dw >> 16 & 0x000000FF] ^ - $dt2[$dw >> 8 & 0x000000FF] ^ - $dt3[$dw & 0x000000FF]; - $j++; - } - $this->dw[$row] = $temp; - } - - $col = 0; - $row++; - } - $this->w[$row][$col] = $w[$i]; - } - - $this->dw[$row] = $this->w[$row]; - - // Converting to 1-dim key arrays (both ascending) - $this->dw = array_reverse($this->dw); - $w = array_pop($this->w); - $dw = array_pop($this->dw); - foreach ($this->w as $r => $wr) { - foreach ($wr as $c => $wc) { - $w[] = $wc; - $dw[] = $this->dw[$r][$c]; - } - } - $this->w = $w; - $this->dw = $dw; - } - - /** - * Performs S-Box substitutions - * - * @return array - * @param int $word - */ - private function subWord($word) - { - static $sbox; - if (empty($sbox)) { - list(, , , , $sbox) = self::getTables(); - } - - return $sbox[$word & 0x000000FF] | - ($sbox[$word >> 8 & 0x000000FF] << 8) | - ($sbox[$word >> 16 & 0x000000FF] << 16) | - ($sbox[$word >> 24 & 0x000000FF] << 24); - } - - /** - * Provides the mixColumns and sboxes tables - * - * @see self::encryptBlock() - * @see self::setupInlineCrypt() - * @see self::subWord() - * @return array &$tables - */ - protected function &getTables() - { - static $tables; - if (empty($tables)) { - // according to (section 5.2.1), - // precomputed tables can be used in the mixColumns phase. in that example, they're assigned t0...t3, so - // those are the names we'll use. - $t3 = array_map('intval', [ - // with array_map('intval', ...) we ensure we have only int's and not - // some slower floats converted by php automatically on high values - 0x6363A5C6, 0x7C7C84F8, 0x777799EE, 0x7B7B8DF6, 0xF2F20DFF, 0x6B6BBDD6, 0x6F6FB1DE, 0xC5C55491, - 0x30305060, 0x01010302, 0x6767A9CE, 0x2B2B7D56, 0xFEFE19E7, 0xD7D762B5, 0xABABE64D, 0x76769AEC, - 0xCACA458F, 0x82829D1F, 0xC9C94089, 0x7D7D87FA, 0xFAFA15EF, 0x5959EBB2, 0x4747C98E, 0xF0F00BFB, - 0xADADEC41, 0xD4D467B3, 0xA2A2FD5F, 0xAFAFEA45, 0x9C9CBF23, 0xA4A4F753, 0x727296E4, 0xC0C05B9B, - 0xB7B7C275, 0xFDFD1CE1, 0x9393AE3D, 0x26266A4C, 0x36365A6C, 0x3F3F417E, 0xF7F702F5, 0xCCCC4F83, - 0x34345C68, 0xA5A5F451, 0xE5E534D1, 0xF1F108F9, 0x717193E2, 0xD8D873AB, 0x31315362, 0x15153F2A, - 0x04040C08, 0xC7C75295, 0x23236546, 0xC3C35E9D, 0x18182830, 0x9696A137, 0x05050F0A, 0x9A9AB52F, - 0x0707090E, 0x12123624, 0x80809B1B, 0xE2E23DDF, 0xEBEB26CD, 0x2727694E, 0xB2B2CD7F, 0x75759FEA, - 0x09091B12, 0x83839E1D, 0x2C2C7458, 0x1A1A2E34, 0x1B1B2D36, 0x6E6EB2DC, 0x5A5AEEB4, 0xA0A0FB5B, - 0x5252F6A4, 0x3B3B4D76, 0xD6D661B7, 0xB3B3CE7D, 0x29297B52, 0xE3E33EDD, 0x2F2F715E, 0x84849713, - 0x5353F5A6, 0xD1D168B9, 0x00000000, 0xEDED2CC1, 0x20206040, 0xFCFC1FE3, 0xB1B1C879, 0x5B5BEDB6, - 0x6A6ABED4, 0xCBCB468D, 0xBEBED967, 0x39394B72, 0x4A4ADE94, 0x4C4CD498, 0x5858E8B0, 0xCFCF4A85, - 0xD0D06BBB, 0xEFEF2AC5, 0xAAAAE54F, 0xFBFB16ED, 0x4343C586, 0x4D4DD79A, 0x33335566, 0x85859411, - 0x4545CF8A, 0xF9F910E9, 0x02020604, 0x7F7F81FE, 0x5050F0A0, 0x3C3C4478, 0x9F9FBA25, 0xA8A8E34B, - 0x5151F3A2, 0xA3A3FE5D, 0x4040C080, 0x8F8F8A05, 0x9292AD3F, 0x9D9DBC21, 0x38384870, 0xF5F504F1, - 0xBCBCDF63, 0xB6B6C177, 0xDADA75AF, 0x21216342, 0x10103020, 0xFFFF1AE5, 0xF3F30EFD, 0xD2D26DBF, - 0xCDCD4C81, 0x0C0C1418, 0x13133526, 0xECEC2FC3, 0x5F5FE1BE, 0x9797A235, 0x4444CC88, 0x1717392E, - 0xC4C45793, 0xA7A7F255, 0x7E7E82FC, 0x3D3D477A, 0x6464ACC8, 0x5D5DE7BA, 0x19192B32, 0x737395E6, - 0x6060A0C0, 0x81819819, 0x4F4FD19E, 0xDCDC7FA3, 0x22226644, 0x2A2A7E54, 0x9090AB3B, 0x8888830B, - 0x4646CA8C, 0xEEEE29C7, 0xB8B8D36B, 0x14143C28, 0xDEDE79A7, 0x5E5EE2BC, 0x0B0B1D16, 0xDBDB76AD, - 0xE0E03BDB, 0x32325664, 0x3A3A4E74, 0x0A0A1E14, 0x4949DB92, 0x06060A0C, 0x24246C48, 0x5C5CE4B8, - 0xC2C25D9F, 0xD3D36EBD, 0xACACEF43, 0x6262A6C4, 0x9191A839, 0x9595A431, 0xE4E437D3, 0x79798BF2, - 0xE7E732D5, 0xC8C8438B, 0x3737596E, 0x6D6DB7DA, 0x8D8D8C01, 0xD5D564B1, 0x4E4ED29C, 0xA9A9E049, - 0x6C6CB4D8, 0x5656FAAC, 0xF4F407F3, 0xEAEA25CF, 0x6565AFCA, 0x7A7A8EF4, 0xAEAEE947, 0x08081810, - 0xBABAD56F, 0x787888F0, 0x25256F4A, 0x2E2E725C, 0x1C1C2438, 0xA6A6F157, 0xB4B4C773, 0xC6C65197, - 0xE8E823CB, 0xDDDD7CA1, 0x74749CE8, 0x1F1F213E, 0x4B4BDD96, 0xBDBDDC61, 0x8B8B860D, 0x8A8A850F, - 0x707090E0, 0x3E3E427C, 0xB5B5C471, 0x6666AACC, 0x4848D890, 0x03030506, 0xF6F601F7, 0x0E0E121C, - 0x6161A3C2, 0x35355F6A, 0x5757F9AE, 0xB9B9D069, 0x86869117, 0xC1C15899, 0x1D1D273A, 0x9E9EB927, - 0xE1E138D9, 0xF8F813EB, 0x9898B32B, 0x11113322, 0x6969BBD2, 0xD9D970A9, 0x8E8E8907, 0x9494A733, - 0x9B9BB62D, 0x1E1E223C, 0x87879215, 0xE9E920C9, 0xCECE4987, 0x5555FFAA, 0x28287850, 0xDFDF7AA5, - 0x8C8C8F03, 0xA1A1F859, 0x89898009, 0x0D0D171A, 0xBFBFDA65, 0xE6E631D7, 0x4242C684, 0x6868B8D0, - 0x4141C382, 0x9999B029, 0x2D2D775A, 0x0F0F111E, 0xB0B0CB7B, 0x5454FCA8, 0xBBBBD66D, 0x16163A2C - ]); - - foreach ($t3 as $t3i) { - $t0[] = (($t3i << 24) & intval(0xFF000000)) | (($t3i >> 8) & 0x00FFFFFF); - $t1[] = (($t3i << 16) & intval(0xFFFF0000)) | (($t3i >> 16) & 0x0000FFFF); - $t2[] = (($t3i << 8) & intval(0xFFFFFF00)) | (($t3i >> 24) & 0x000000FF); - } - - $tables = [ - // The Precomputed mixColumns tables t0 - t3 - $t0, - $t1, - $t2, - $t3, - // The SubByte S-Box - [ - 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76, - 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0, - 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15, - 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75, - 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84, - 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF, - 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8, - 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2, - 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73, - 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB, - 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79, - 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08, - 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A, - 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E, - 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF, - 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16 - ] - ]; - } - return $tables; - } - - /** - * Provides the inverse mixColumns and inverse sboxes tables - * - * @see self::decryptBlock() - * @see self::setupInlineCrypt() - * @see self::setupKey() - * @return array &$tables - */ - protected function &getInvTables() - { - static $tables; - if (empty($tables)) { - $dt3 = array_map('intval', [ - 0xF4A75051, 0x4165537E, 0x17A4C31A, 0x275E963A, 0xAB6BCB3B, 0x9D45F11F, 0xFA58ABAC, 0xE303934B, - 0x30FA5520, 0x766DF6AD, 0xCC769188, 0x024C25F5, 0xE5D7FC4F, 0x2ACBD7C5, 0x35448026, 0x62A38FB5, - 0xB15A49DE, 0xBA1B6725, 0xEA0E9845, 0xFEC0E15D, 0x2F7502C3, 0x4CF01281, 0x4697A38D, 0xD3F9C66B, - 0x8F5FE703, 0x929C9515, 0x6D7AEBBF, 0x5259DA95, 0xBE832DD4, 0x7421D358, 0xE0692949, 0xC9C8448E, - 0xC2896A75, 0x8E7978F4, 0x583E6B99, 0xB971DD27, 0xE14FB6BE, 0x88AD17F0, 0x20AC66C9, 0xCE3AB47D, - 0xDF4A1863, 0x1A3182E5, 0x51336097, 0x537F4562, 0x6477E0B1, 0x6BAE84BB, 0x81A01CFE, 0x082B94F9, - 0x48685870, 0x45FD198F, 0xDE6C8794, 0x7BF8B752, 0x73D323AB, 0x4B02E272, 0x1F8F57E3, 0x55AB2A66, - 0xEB2807B2, 0xB5C2032F, 0xC57B9A86, 0x3708A5D3, 0x2887F230, 0xBFA5B223, 0x036ABA02, 0x16825CED, - 0xCF1C2B8A, 0x79B492A7, 0x07F2F0F3, 0x69E2A14E, 0xDAF4CD65, 0x05BED506, 0x34621FD1, 0xA6FE8AC4, - 0x2E539D34, 0xF355A0A2, 0x8AE13205, 0xF6EB75A4, 0x83EC390B, 0x60EFAA40, 0x719F065E, 0x6E1051BD, - 0x218AF93E, 0xDD063D96, 0x3E05AEDD, 0xE6BD464D, 0x548DB591, 0xC45D0571, 0x06D46F04, 0x5015FF60, - 0x98FB2419, 0xBDE997D6, 0x4043CC89, 0xD99E7767, 0xE842BDB0, 0x898B8807, 0x195B38E7, 0xC8EEDB79, - 0x7C0A47A1, 0x420FE97C, 0x841EC9F8, 0x00000000, 0x80868309, 0x2BED4832, 0x1170AC1E, 0x5A724E6C, - 0x0EFFFBFD, 0x8538560F, 0xAED51E3D, 0x2D392736, 0x0FD9640A, 0x5CA62168, 0x5B54D19B, 0x362E3A24, - 0x0A67B10C, 0x57E70F93, 0xEE96D2B4, 0x9B919E1B, 0xC0C54F80, 0xDC20A261, 0x774B695A, 0x121A161C, - 0x93BA0AE2, 0xA02AE5C0, 0x22E0433C, 0x1B171D12, 0x090D0B0E, 0x8BC7ADF2, 0xB6A8B92D, 0x1EA9C814, - 0xF1198557, 0x75074CAF, 0x99DDBBEE, 0x7F60FDA3, 0x01269FF7, 0x72F5BC5C, 0x663BC544, 0xFB7E345B, - 0x4329768B, 0x23C6DCCB, 0xEDFC68B6, 0xE4F163B8, 0x31DCCAD7, 0x63851042, 0x97224013, 0xC6112084, - 0x4A247D85, 0xBB3DF8D2, 0xF93211AE, 0x29A16DC7, 0x9E2F4B1D, 0xB230F3DC, 0x8652EC0D, 0xC1E3D077, - 0xB3166C2B, 0x70B999A9, 0x9448FA11, 0xE9642247, 0xFC8CC4A8, 0xF03F1AA0, 0x7D2CD856, 0x3390EF22, - 0x494EC787, 0x38D1C1D9, 0xCAA2FE8C, 0xD40B3698, 0xF581CFA6, 0x7ADE28A5, 0xB78E26DA, 0xADBFA43F, - 0x3A9DE42C, 0x78920D50, 0x5FCC9B6A, 0x7E466254, 0x8D13C2F6, 0xD8B8E890, 0x39F75E2E, 0xC3AFF582, - 0x5D80BE9F, 0xD0937C69, 0xD52DA96F, 0x2512B3CF, 0xAC993BC8, 0x187DA710, 0x9C636EE8, 0x3BBB7BDB, - 0x267809CD, 0x5918F46E, 0x9AB701EC, 0x4F9AA883, 0x956E65E6, 0xFFE67EAA, 0xBCCF0821, 0x15E8E6EF, - 0xE79BD9BA, 0x6F36CE4A, 0x9F09D4EA, 0xB07CD629, 0xA4B2AF31, 0x3F23312A, 0xA59430C6, 0xA266C035, - 0x4EBC3774, 0x82CAA6FC, 0x90D0B0E0, 0xA7D81533, 0x04984AF1, 0xECDAF741, 0xCD500E7F, 0x91F62F17, - 0x4DD68D76, 0xEFB04D43, 0xAA4D54CC, 0x9604DFE4, 0xD1B5E39E, 0x6A881B4C, 0x2C1FB8C1, 0x65517F46, - 0x5EEA049D, 0x8C355D01, 0x877473FA, 0x0B412EFB, 0x671D5AB3, 0xDBD25292, 0x105633E9, 0xD647136D, - 0xD7618C9A, 0xA10C7A37, 0xF8148E59, 0x133C89EB, 0xA927EECE, 0x61C935B7, 0x1CE5EDE1, 0x47B13C7A, - 0xD2DF599C, 0xF2733F55, 0x14CE7918, 0xC737BF73, 0xF7CDEA53, 0xFDAA5B5F, 0x3D6F14DF, 0x44DB8678, - 0xAFF381CA, 0x68C43EB9, 0x24342C38, 0xA3405FC2, 0x1DC37216, 0xE2250CBC, 0x3C498B28, 0x0D9541FF, - 0xA8017139, 0x0CB3DE08, 0xB4E49CD8, 0x56C19064, 0xCB84617B, 0x32B670D5, 0x6C5C7448, 0xB85742D0 - ]); - - foreach ($dt3 as $dt3i) { - $dt0[] = (($dt3i << 24) & intval(0xFF000000)) | (($dt3i >> 8) & 0x00FFFFFF); - $dt1[] = (($dt3i << 16) & intval(0xFFFF0000)) | (($dt3i >> 16) & 0x0000FFFF); - $dt2[] = (($dt3i << 8) & intval(0xFFFFFF00)) | (($dt3i >> 24) & 0x000000FF); - }; - - $tables = [ - // The Precomputed inverse mixColumns tables dt0 - dt3 - $dt0, - $dt1, - $dt2, - $dt3, - // The inverse SubByte S-Box - [ - 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38, 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB, - 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87, 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB, - 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D, 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E, - 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2, 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25, - 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92, - 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA, 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84, - 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A, 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06, - 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02, 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B, - 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA, 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73, - 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85, 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E, - 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89, 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B, - 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20, 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4, - 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31, 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F, - 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D, 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF, - 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0, 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61, - 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26, 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D - ] - ]; - } - return $tables; - } - - /** - * Setup the performance-optimized function for de/encrypt() - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::setupInlineCrypt() - */ - protected function setupInlineCrypt() - { - $w = $this->w; - $dw = $this->dw; - $init_encrypt = ''; - $init_decrypt = ''; - - $Nr = $this->Nr; - $Nb = $this->Nb; - $c = $this->c; - - // Generating encrypt code: - $init_encrypt .= ' - if (empty($tables)) { - $tables = &$this->getTables(); - } - $t0 = $tables[0]; - $t1 = $tables[1]; - $t2 = $tables[2]; - $t3 = $tables[3]; - $sbox = $tables[4]; - '; - - $s = 'e'; - $e = 's'; - $wc = $Nb - 1; - - // Preround: addRoundKey - $encrypt_block = '$in = unpack("N*", $in);' . "\n"; - for ($i = 0; $i < $Nb; ++$i) { - $encrypt_block .= '$s' . $i . ' = $in[' . ($i + 1) . '] ^ ' . $w[++$wc] . ";\n"; - } - - // Mainrounds: shiftRows + subWord + mixColumns + addRoundKey - for ($round = 1; $round < $Nr; ++$round) { - list($s, $e) = [$e, $s]; - for ($i = 0; $i < $Nb; ++$i) { - $encrypt_block .= - '$' . $e . $i . ' = - $t0[($' . $s . $i . ' >> 24) & 0xff] ^ - $t1[($' . $s . (($i + $c[1]) % $Nb) . ' >> 16) & 0xff] ^ - $t2[($' . $s . (($i + $c[2]) % $Nb) . ' >> 8) & 0xff] ^ - $t3[ $' . $s . (($i + $c[3]) % $Nb) . ' & 0xff] ^ - ' . $w[++$wc] . ";\n"; - } - } - - // Finalround: subWord + shiftRows + addRoundKey - for ($i = 0; $i < $Nb; ++$i) { - $encrypt_block .= - '$' . $e . $i . ' = - $sbox[ $' . $e . $i . ' & 0xff] | - ($sbox[($' . $e . $i . ' >> 8) & 0xff] << 8) | - ($sbox[($' . $e . $i . ' >> 16) & 0xff] << 16) | - ($sbox[($' . $e . $i . ' >> 24) & 0xff] << 24);' . "\n"; - } - $encrypt_block .= '$in = pack("N*"' . "\n"; - for ($i = 0; $i < $Nb; ++$i) { - $encrypt_block .= ', - ($' . $e . $i . ' & ' . ((int)0xFF000000) . ') ^ - ($' . $e . (($i + $c[1]) % $Nb) . ' & 0x00FF0000 ) ^ - ($' . $e . (($i + $c[2]) % $Nb) . ' & 0x0000FF00 ) ^ - ($' . $e . (($i + $c[3]) % $Nb) . ' & 0x000000FF ) ^ - ' . $w[$i] . "\n"; - } - $encrypt_block .= ');'; - - // Generating decrypt code: - $init_decrypt .= ' - if (empty($invtables)) { - $invtables = &$this->getInvTables(); - } - $dt0 = $invtables[0]; - $dt1 = $invtables[1]; - $dt2 = $invtables[2]; - $dt3 = $invtables[3]; - $isbox = $invtables[4]; - '; - - $s = 'e'; - $e = 's'; - $wc = $Nb - 1; - - // Preround: addRoundKey - $decrypt_block = '$in = unpack("N*", $in);' . "\n"; - for ($i = 0; $i < $Nb; ++$i) { - $decrypt_block .= '$s' . $i . ' = $in[' . ($i + 1) . '] ^ ' . $dw[++$wc] . ';' . "\n"; - } - - // Mainrounds: shiftRows + subWord + mixColumns + addRoundKey - for ($round = 1; $round < $Nr; ++$round) { - list($s, $e) = [$e, $s]; - for ($i = 0; $i < $Nb; ++$i) { - $decrypt_block .= - '$' . $e . $i . ' = - $dt0[($' . $s . $i . ' >> 24) & 0xff] ^ - $dt1[($' . $s . (($Nb + $i - $c[1]) % $Nb) . ' >> 16) & 0xff] ^ - $dt2[($' . $s . (($Nb + $i - $c[2]) % $Nb) . ' >> 8) & 0xff] ^ - $dt3[ $' . $s . (($Nb + $i - $c[3]) % $Nb) . ' & 0xff] ^ - ' . $dw[++$wc] . ";\n"; - } - } - - // Finalround: subWord + shiftRows + addRoundKey - for ($i = 0; $i < $Nb; ++$i) { - $decrypt_block .= - '$' . $e . $i . ' = - $isbox[ $' . $e . $i . ' & 0xff] | - ($isbox[($' . $e . $i . ' >> 8) & 0xff] << 8) | - ($isbox[($' . $e . $i . ' >> 16) & 0xff] << 16) | - ($isbox[($' . $e . $i . ' >> 24) & 0xff] << 24);' . "\n"; - } - $decrypt_block .= '$in = pack("N*"' . "\n"; - for ($i = 0; $i < $Nb; ++$i) { - $decrypt_block .= ', - ($' . $e . $i . ' & ' . ((int)0xFF000000) . ') ^ - ($' . $e . (($Nb + $i - $c[1]) % $Nb) . ' & 0x00FF0000 ) ^ - ($' . $e . (($Nb + $i - $c[2]) % $Nb) . ' & 0x0000FF00 ) ^ - ($' . $e . (($Nb + $i - $c[3]) % $Nb) . ' & 0x000000FF ) ^ - ' . $dw[$i] . "\n"; - } - $decrypt_block .= ');'; - - $this->inline_crypt = $this->createInlineCryptFunction( - [ - 'init_crypt' => 'static $tables; static $invtables;', - 'init_encrypt' => $init_encrypt, - 'init_decrypt' => $init_decrypt, - 'encrypt_block' => $encrypt_block, - 'decrypt_block' => $decrypt_block - ] - ); - } - - /** - * Encrypts a message. - * - * @see self::decrypt() - * @see parent::encrypt() - * @param string $plaintext - * @return string - */ - public function encrypt($plaintext) - { - $this->setup(); - - switch ($this->engine) { - case self::ENGINE_LIBSODIUM: - $this->newtag = sodium_crypto_aead_aes256gcm_encrypt($plaintext, $this->aad, $this->nonce, $this->key); - return Strings::shift($this->newtag, strlen($plaintext)); - case self::ENGINE_OPENSSL_GCM: - return openssl_encrypt( - $plaintext, - 'aes-' . $this->getKeyLength() . '-gcm', - $this->key, - OPENSSL_RAW_DATA, - $this->nonce, - $this->newtag, - $this->aad - ); - } - - return parent::encrypt($plaintext); - } - - /** - * Decrypts a message. - * - * @see self::encrypt() - * @see parent::decrypt() - * @param string $ciphertext - * @return string - */ - public function decrypt($ciphertext) - { - $this->setup(); - - switch ($this->engine) { - case self::ENGINE_LIBSODIUM: - if ($this->oldtag === false) { - throw new InsufficientSetupException('Authentication Tag has not been set'); - } - if (strlen($this->oldtag) != 16) { - break; - } - $plaintext = sodium_crypto_aead_aes256gcm_decrypt($ciphertext . $this->oldtag, $this->aad, $this->nonce, $this->key); - if ($plaintext === false) { - $this->oldtag = false; - throw new BadDecryptionException('Error decrypting ciphertext with libsodium'); - } - return $plaintext; - case self::ENGINE_OPENSSL_GCM: - if ($this->oldtag === false) { - throw new InsufficientSetupException('Authentication Tag has not been set'); - } - $plaintext = openssl_decrypt( - $ciphertext, - 'aes-' . $this->getKeyLength() . '-gcm', - $this->key, - OPENSSL_RAW_DATA, - $this->nonce, - $this->oldtag, - $this->aad - ); - if ($plaintext === false) { - $this->oldtag = false; - throw new BadDecryptionException('Error decrypting ciphertext with OpenSSL'); - } - return $plaintext; - } - - return parent::decrypt($ciphertext); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/Salsa20.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/Salsa20.php deleted file mode 100644 index ef3e346..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/Salsa20.php +++ /dev/null @@ -1,528 +0,0 @@ - - * @copyright 2019 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt; - -use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\StreamCipher; -use OCA\Libresign\Vendor\phpseclib3\Exception\BadDecryptionException; -use OCA\Libresign\Vendor\phpseclib3\Exception\InsufficientSetupException; - -/** - * Pure-PHP implementation of Salsa20. - * - * @author Jim Wigginton - */ -class Salsa20 extends StreamCipher -{ - /** - * Part 1 of the state - * - * @var string|false - */ - protected $p1 = false; - - /** - * Part 2 of the state - * - * @var string|false - */ - protected $p2 = false; - - /** - * Key Length (in bytes) - * - * @var int - */ - protected $key_length = 32; // = 256 bits - - /** - * @see \phpseclib3\Crypt\Salsa20::crypt() - */ - const ENCRYPT = 0; - - /** - * @see \phpseclib3\Crypt\Salsa20::crypt() - */ - const DECRYPT = 1; - - /** - * Encryption buffer for continuous mode - * - * @var array - */ - protected $enbuffer; - - /** - * Decryption buffer for continuous mode - * - * @var array - */ - protected $debuffer; - - /** - * Counter - * - * @var int - */ - protected $counter = 0; - - /** - * Using Generated Poly1305 Key - * - * @var boolean - */ - protected $usingGeneratedPoly1305Key = false; - - /** - * Salsa20 uses a nonce - * - * @return bool - */ - public function usesNonce() - { - return true; - } - - /** - * Sets the key. - * - * @param string $key - * @throws \LengthException if the key length isn't supported - */ - public function setKey($key) - { - switch (strlen($key)) { - case 16: - case 32: - break; - default: - throw new \LengthException('Key of size ' . strlen($key) . ' not supported by this algorithm. Only keys of sizes 16 or 32 are supported'); - } - - parent::setKey($key); - } - - /** - * Sets the nonce. - * - * @param string $nonce - */ - public function setNonce($nonce) - { - if (strlen($nonce) != 8) { - throw new \LengthException('Nonce of size ' . strlen($key) . ' not supported by this algorithm. Only an 64-bit nonce is supported'); - } - - $this->nonce = $nonce; - $this->changed = true; - $this->setEngine(); - } - - /** - * Sets the counter. - * - * @param int $counter - */ - public function setCounter($counter) - { - $this->counter = $counter; - $this->setEngine(); - } - - /** - * Creates a Poly1305 key using the method discussed in RFC8439 - * - * See https://tools.ietf.org/html/rfc8439#section-2.6.1 - */ - protected function createPoly1305Key() - { - if ($this->nonce === false) { - throw new InsufficientSetupException('No nonce has been defined'); - } - - if ($this->key === false) { - throw new InsufficientSetupException('No key has been defined'); - } - - $c = clone $this; - $c->setCounter(0); - $c->usePoly1305 = false; - $block = $c->encrypt(str_repeat("\0", 256)); - $this->setPoly1305Key(substr($block, 0, 32)); - - if ($this->counter == 0) { - $this->counter++; - } - } - - /** - * Setup the self::ENGINE_INTERNAL $engine - * - * (re)init, if necessary, the internal cipher $engine - * - * _setup() will be called each time if $changed === true - * typically this happens when using one or more of following public methods: - * - * - setKey() - * - * - setNonce() - * - * - First run of encrypt() / decrypt() with no init-settings - * - * @see self::setKey() - * @see self::setNonce() - * @see self::disableContinuousBuffer() - */ - protected function setup() - { - if (!$this->changed) { - return; - } - - $this->enbuffer = $this->debuffer = ['ciphertext' => '', 'counter' => $this->counter]; - - $this->changed = $this->nonIVChanged = false; - - if ($this->nonce === false) { - throw new InsufficientSetupException('No nonce has been defined'); - } - - if ($this->key === false) { - throw new InsufficientSetupException('No key has been defined'); - } - - if ($this->usePoly1305 && !isset($this->poly1305Key)) { - $this->usingGeneratedPoly1305Key = true; - $this->createPoly1305Key(); - } - - $key = $this->key; - if (strlen($key) == 16) { - $constant = 'expand 16-byte k'; - $key .= $key; - } else { - $constant = 'expand 32-byte k'; - } - - $this->p1 = substr($constant, 0, 4) . - substr($key, 0, 16) . - substr($constant, 4, 4) . - $this->nonce . - "\0\0\0\0"; - $this->p2 = substr($constant, 8, 4) . - substr($key, 16, 16) . - substr($constant, 12, 4); - } - - /** - * Setup the key (expansion) - */ - protected function setupKey() - { - // Salsa20 does not utilize this method - } - - /** - * Encrypts a message. - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::decrypt() - * @see self::crypt() - * @param string $plaintext - * @return string $ciphertext - */ - public function encrypt($plaintext) - { - $ciphertext = $this->crypt($plaintext, self::ENCRYPT); - if (isset($this->poly1305Key)) { - $this->newtag = $this->poly1305($ciphertext); - } - return $ciphertext; - } - - /** - * Decrypts a message. - * - * $this->decrypt($this->encrypt($plaintext)) == $this->encrypt($this->encrypt($plaintext)). - * At least if the continuous buffer is disabled. - * - * @see \phpseclib3\Crypt\Common\SymmetricKey::encrypt() - * @see self::crypt() - * @param string $ciphertext - * @return string $plaintext - */ - public function decrypt($ciphertext) - { - if (isset($this->poly1305Key)) { - if ($this->oldtag === false) { - throw new InsufficientSetupException('Authentication Tag has not been set'); - } - $newtag = $this->poly1305($ciphertext); - if ($this->oldtag != substr($newtag, 0, strlen($this->oldtag))) { - $this->oldtag = false; - throw new BadDecryptionException('Derived authentication tag and supplied authentication tag do not match'); - } - $this->oldtag = false; - } - - return $this->crypt($ciphertext, self::DECRYPT); - } - - /** - * Encrypts a block - * - * @param string $in - */ - protected function encryptBlock($in) - { - // Salsa20 does not utilize this method - } - - /** - * Decrypts a block - * - * @param string $in - */ - protected function decryptBlock($in) - { - // Salsa20 does not utilize this method - } - - /** - * Encrypts or decrypts a message. - * - * @see self::encrypt() - * @see self::decrypt() - * @param string $text - * @param int $mode - * @return string $text - */ - private function crypt($text, $mode) - { - $this->setup(); - if (!$this->continuousBuffer) { - if ($this->engine == self::ENGINE_OPENSSL) { - $iv = pack('V', $this->counter) . $this->p2; - return openssl_encrypt( - $text, - $this->cipher_name_openssl, - $this->key, - OPENSSL_RAW_DATA, - $iv - ); - } - $i = $this->counter; - $blocks = str_split($text, 64); - foreach ($blocks as &$block) { - $block ^= static::salsa20($this->p1 . pack('V', $i++) . $this->p2); - } - unset($block); - return implode('', $blocks); - } - - if ($mode == self::ENCRYPT) { - $buffer = &$this->enbuffer; - } else { - $buffer = &$this->debuffer; - } - if (!strlen($buffer['ciphertext'])) { - $ciphertext = ''; - } else { - $ciphertext = $text ^ Strings::shift($buffer['ciphertext'], strlen($text)); - $text = substr($text, strlen($ciphertext)); - if (!strlen($text)) { - return $ciphertext; - } - } - - $overflow = strlen($text) % 64; // & 0x3F - if ($overflow) { - $text2 = Strings::pop($text, $overflow); - if ($this->engine == self::ENGINE_OPENSSL) { - $iv = pack('V', $buffer['counter']) . $this->p2; - // at this point $text should be a multiple of 64 - $buffer['counter'] += (strlen($text) >> 6) + 1; // ie. divide by 64 - $encrypted = openssl_encrypt( - $text . str_repeat("\0", 64), - $this->cipher_name_openssl, - $this->key, - OPENSSL_RAW_DATA, - $iv - ); - $temp = Strings::pop($encrypted, 64); - } else { - $blocks = str_split($text, 64); - if (strlen($text)) { - foreach ($blocks as &$block) { - $block ^= static::salsa20($this->p1 . pack('V', $buffer['counter']++) . $this->p2); - } - unset($block); - } - $encrypted = implode('', $blocks); - $temp = static::salsa20($this->p1 . pack('V', $buffer['counter']++) . $this->p2); - } - $ciphertext .= $encrypted . ($text2 ^ $temp); - $buffer['ciphertext'] = substr($temp, $overflow); - } elseif (!strlen($buffer['ciphertext'])) { - if ($this->engine == self::ENGINE_OPENSSL) { - $iv = pack('V', $buffer['counter']) . $this->p2; - $buffer['counter'] += (strlen($text) >> 6); - $ciphertext .= openssl_encrypt( - $text, - $this->cipher_name_openssl, - $this->key, - OPENSSL_RAW_DATA, - $iv - ); - } else { - $blocks = str_split($text, 64); - foreach ($blocks as &$block) { - $block ^= static::salsa20($this->p1 . pack('V', $buffer['counter']++) . $this->p2); - } - unset($block); - $ciphertext .= implode('', $blocks); - } - } - - return $ciphertext; - } - - /** - * Left Rotate - * - * @param int $x - * @param int $n - * @return int - */ - protected static function leftRotate($x, $n) - { - if (PHP_INT_SIZE == 8) { - $r1 = $x << $n; - $r1 &= 0xFFFFFFFF; - $r2 = ($x & 0xFFFFFFFF) >> (32 - $n); - } else { - $x = (int) $x; - $r1 = $x << $n; - $r2 = $x >> (32 - $n); - $r2 &= (1 << $n) - 1; - } - return $r1 | $r2; - } - - /** - * The quarterround function - * - * @param int $a - * @param int $b - * @param int $c - * @param int $d - */ - protected static function quarterRound(&$a, &$b, &$c, &$d) - { - $b ^= self::leftRotate($a + $d, 7); - $c ^= self::leftRotate($b + $a, 9); - $d ^= self::leftRotate($c + $b, 13); - $a ^= self::leftRotate($d + $c, 18); - } - - /** - * The doubleround function - * - * @param int $x0 (by reference) - * @param int $x1 (by reference) - * @param int $x2 (by reference) - * @param int $x3 (by reference) - * @param int $x4 (by reference) - * @param int $x5 (by reference) - * @param int $x6 (by reference) - * @param int $x7 (by reference) - * @param int $x8 (by reference) - * @param int $x9 (by reference) - * @param int $x10 (by reference) - * @param int $x11 (by reference) - * @param int $x12 (by reference) - * @param int $x13 (by reference) - * @param int $x14 (by reference) - * @param int $x15 (by reference) - */ - protected static function doubleRound(&$x0, &$x1, &$x2, &$x3, &$x4, &$x5, &$x6, &$x7, &$x8, &$x9, &$x10, &$x11, &$x12, &$x13, &$x14, &$x15) - { - // columnRound - static::quarterRound($x0, $x4, $x8, $x12); - static::quarterRound($x5, $x9, $x13, $x1); - static::quarterRound($x10, $x14, $x2, $x6); - static::quarterRound($x15, $x3, $x7, $x11); - // rowRound - static::quarterRound($x0, $x1, $x2, $x3); - static::quarterRound($x5, $x6, $x7, $x4); - static::quarterRound($x10, $x11, $x8, $x9); - static::quarterRound($x15, $x12, $x13, $x14); - } - - /** - * The Salsa20 hash function function - * - * @param string $x - */ - protected static function salsa20($x) - { - $z = $x = unpack('V*', $x); - for ($i = 0; $i < 10; $i++) { - static::doubleRound($z[1], $z[2], $z[3], $z[4], $z[5], $z[6], $z[7], $z[8], $z[9], $z[10], $z[11], $z[12], $z[13], $z[14], $z[15], $z[16]); - } - - for ($i = 1; $i <= 16; $i++) { - $x[$i] += $z[$i]; - } - - return pack('V*', ...$x); - } - - /** - * Calculates Poly1305 MAC - * - * @see self::decrypt() - * @see self::encrypt() - * @param string $ciphertext - * @return string - */ - protected function poly1305($ciphertext) - { - if (!$this->usingGeneratedPoly1305Key) { - return parent::poly1305($this->aad . $ciphertext); - } else { - /* - sodium_crypto_aead_chacha20poly1305_encrypt does not calculate the poly1305 tag - the same way sodium_crypto_aead_chacha20poly1305_ietf_encrypt does. you can see - how the latter encrypts it in Salsa20::encrypt(). here's how the former encrypts - it: - - $this->newtag = $this->poly1305( - $this->aad . - pack('V', strlen($this->aad)) . "\0\0\0\0" . - $ciphertext . - pack('V', strlen($ciphertext)) . "\0\0\0\0" - ); - - phpseclib opts to use the IETF construction, even when the nonce is 64-bits - instead of 96-bits - */ - return parent::poly1305( - self::nullPad128($this->aad) . - self::nullPad128($ciphertext) . - pack('V', strlen($this->aad)) . "\0\0\0\0" . - pack('V', strlen($ciphertext)) . "\0\0\0\0" - ); - } - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/TripleDES.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/TripleDES.php deleted file mode 100644 index 9a28457..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/TripleDES.php +++ /dev/null @@ -1,436 +0,0 @@ - - * setKey('abcdefghijklmnopqrstuvwx'); - * - * $size = 10 * 1024; - * $plaintext = ''; - * for ($i = 0; $i < $size; $i++) { - * $plaintext.= 'a'; - * } - * - * echo $des->decrypt($des->encrypt($plaintext)); - * ?> - * - * - * @author Jim Wigginton - * @copyright 2007 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt; - -/** - * Pure-PHP implementation of Triple DES. - * - * @author Jim Wigginton - */ -class TripleDES extends DES -{ - /** - * Encrypt / decrypt using inner chaining - * - * Inner chaining is used by SSH-1 and is generally considered to be less secure then outer chaining (self::MODE_CBC3). - */ - const MODE_3CBC = -2; - - /** - * Encrypt / decrypt using outer chaining - * - * Outer chaining is used by SSH-2 and when the mode is set to \phpseclib3\Crypt\Common\BlockCipher::MODE_CBC. - */ - const MODE_CBC3 = self::MODE_CBC; - - /** - * Key Length (in bytes) - * - * @see \phpseclib3\Crypt\TripleDES::setKeyLength() - * @var int - */ - protected $key_length = 24; - - /** - * The mcrypt specific name of the cipher - * - * @see DES::cipher_name_mcrypt - * @see Common\SymmetricKey::cipher_name_mcrypt - * @var string - */ - protected $cipher_name_mcrypt = 'tripledes'; - - /** - * Optimizing value while CFB-encrypting - * - * @see Common\SymmetricKey::cfb_init_len - * @var int - */ - protected $cfb_init_len = 750; - - /** - * max possible size of $key - * - * @see self::setKey() - * @see DES::setKey() - * @var string - */ - protected $key_length_max = 24; - - /** - * Internal flag whether using self::MODE_3CBC or not - * - * @var bool - */ - private $mode_3cbc; - - /** - * The \phpseclib3\Crypt\DES objects - * - * Used only if $mode_3cbc === true - * - * @var array - */ - private $des; - - /** - * Default Constructor. - * - * Determines whether or not the mcrypt or OpenSSL extensions should be used. - * - * $mode could be: - * - * - ecb - * - * - cbc - * - * - ctr - * - * - cfb - * - * - ofb - * - * - 3cbc - * - * - cbc3 (same as cbc) - * - * @see Crypt\DES::__construct() - * @see Common\SymmetricKey::__construct() - * @param string $mode - */ - public function __construct($mode) - { - switch (strtolower($mode)) { - // In case of self::MODE_3CBC, we init as CRYPT_DES_MODE_CBC - // and additional flag us internally as 3CBC - case '3cbc': - parent::__construct('cbc'); - $this->mode_3cbc = true; - - // This three $des'es will do the 3CBC work (if $key > 64bits) - $this->des = [ - new DES('cbc'), - new DES('cbc'), - new DES('cbc'), - ]; - - // we're going to be doing the padding, ourselves, so disable it in the \phpseclib3\Crypt\DES objects - $this->des[0]->disablePadding(); - $this->des[1]->disablePadding(); - $this->des[2]->disablePadding(); - break; - case 'cbc3': - $mode = 'cbc'; - // fall-through - // If not 3CBC, we init as usual - default: - parent::__construct($mode); - - if ($this->mode == self::MODE_STREAM) { - throw new BadModeException('Block ciphers cannot be ran in stream mode'); - } - } - } - - /** - * Test for engine validity - * - * This is mainly just a wrapper to set things up for \phpseclib3\Crypt\Common\SymmetricKey::isValidEngine() - * - * @see Common\SymmetricKey::__construct() - * @param int $engine - * @return bool - */ - protected function isValidEngineHelper($engine) - { - if ($engine == self::ENGINE_OPENSSL) { - $this->cipher_name_openssl_ecb = 'des-ede3'; - $mode = $this->openssl_translate_mode(); - $this->cipher_name_openssl = $mode == 'ecb' ? 'des-ede3' : 'des-ede3-' . $mode; - } - - return parent::isValidEngineHelper($engine); - } - - /** - * Sets the initialization vector. - * - * SetIV is not required when \phpseclib3\Crypt\Common\SymmetricKey::MODE_ECB is being used. - * - * @see Common\SymmetricKey::setIV() - * @param string $iv - */ - public function setIV($iv) - { - parent::setIV($iv); - if ($this->mode_3cbc) { - $this->des[0]->setIV($iv); - $this->des[1]->setIV($iv); - $this->des[2]->setIV($iv); - } - } - - /** - * Sets the key length. - * - * Valid key lengths are 128 and 192 bits. - * - * If you want to use a 64-bit key use DES.php - * - * @see Common\SymmetricKey:setKeyLength() - * @throws \LengthException if the key length is invalid - * @param int $length - */ - public function setKeyLength($length) - { - switch ($length) { - case 128: - case 192: - break; - default: - throw new \LengthException('Key size of ' . $length . ' bits is not supported by this algorithm. Only keys of sizes 128 or 192 bits are supported'); - } - - parent::setKeyLength($length); - } - - /** - * Sets the key. - * - * Triple DES can use 128-bit (eg. strlen($key) == 16) or 192-bit (eg. strlen($key) == 24) keys. - * - * DES also requires that every eighth bit be a parity bit, however, we'll ignore that. - * - * @see DES::setKey() - * @see Common\SymmetricKey::setKey() - * @throws \LengthException if the key length is invalid - * @param string $key - */ - public function setKey($key) - { - if ($this->explicit_key_length !== false && strlen($key) != $this->explicit_key_length) { - throw new \LengthException('Key length has already been set to ' . $this->explicit_key_length . ' bytes and this key is ' . strlen($key) . ' bytes'); - } - - switch (strlen($key)) { - case 16: - $key .= substr($key, 0, 8); - break; - case 24: - break; - default: - throw new \LengthException('Key of size ' . strlen($key) . ' not supported by this algorithm. Only keys of sizes 16 or 24 are supported'); - } - - // copied from self::setKey() - $this->key = $key; - $this->key_length = strlen($key); - $this->changed = $this->nonIVChanged = true; - $this->setEngine(); - - if ($this->mode_3cbc) { - $this->des[0]->setKey(substr($key, 0, 8)); - $this->des[1]->setKey(substr($key, 8, 8)); - $this->des[2]->setKey(substr($key, 16, 8)); - } - } - - /** - * Encrypts a message. - * - * @see Common\SymmetricKey::encrypt() - * @param string $plaintext - * @return string $cipertext - */ - public function encrypt($plaintext) - { - // parent::en/decrypt() is able to do all the work for all modes and keylengths, - // except for: self::MODE_3CBC (inner chaining CBC) with a key > 64bits - - // if the key is smaller then 8, do what we'd normally do - if ($this->mode_3cbc && strlen($this->key) > 8) { - return $this->des[2]->encrypt( - $this->des[1]->decrypt( - $this->des[0]->encrypt( - $this->pad($plaintext) - ) - ) - ); - } - - return parent::encrypt($plaintext); - } - - /** - * Decrypts a message. - * - * @see Common\SymmetricKey::decrypt() - * @param string $ciphertext - * @return string $plaintext - */ - public function decrypt($ciphertext) - { - if ($this->mode_3cbc && strlen($this->key) > 8) { - return $this->unpad( - $this->des[0]->decrypt( - $this->des[1]->encrypt( - $this->des[2]->decrypt( - str_pad($ciphertext, (strlen($ciphertext) + 7) & 0xFFFFFFF8, "\0") - ) - ) - ) - ); - } - - return parent::decrypt($ciphertext); - } - - /** - * Treat consecutive "packets" as if they are a continuous buffer. - * - * Say you have a 16-byte plaintext $plaintext. Using the default behavior, the two following code snippets - * will yield different outputs: - * - * - * echo $des->encrypt(substr($plaintext, 0, 8)); - * echo $des->encrypt(substr($plaintext, 8, 8)); - * - * - * echo $des->encrypt($plaintext); - * - * - * The solution is to enable the continuous buffer. Although this will resolve the above discrepancy, it creates - * another, as demonstrated with the following: - * - * - * $des->encrypt(substr($plaintext, 0, 8)); - * echo $des->decrypt($des->encrypt(substr($plaintext, 8, 8))); - * - * - * echo $des->decrypt($des->encrypt(substr($plaintext, 8, 8))); - * - * - * With the continuous buffer disabled, these would yield the same output. With it enabled, they yield different - * outputs. The reason is due to the fact that the initialization vector's change after every encryption / - * decryption round when the continuous buffer is enabled. When it's disabled, they remain constant. - * - * Put another way, when the continuous buffer is enabled, the state of the \phpseclib3\Crypt\DES() object changes after each - * encryption / decryption round, whereas otherwise, it'd remain constant. For this reason, it's recommended that - * continuous buffers not be used. They do offer better security and are, in fact, sometimes required (SSH uses them), - * however, they are also less intuitive and more likely to cause you problems. - * - * @see Common\SymmetricKey::enableContinuousBuffer() - * @see self::disableContinuousBuffer() - */ - public function enableContinuousBuffer() - { - parent::enableContinuousBuffer(); - if ($this->mode_3cbc) { - $this->des[0]->enableContinuousBuffer(); - $this->des[1]->enableContinuousBuffer(); - $this->des[2]->enableContinuousBuffer(); - } - } - - /** - * Treat consecutive packets as if they are a discontinuous buffer. - * - * The default behavior. - * - * @see Common\SymmetricKey::disableContinuousBuffer() - * @see self::enableContinuousBuffer() - */ - public function disableContinuousBuffer() - { - parent::disableContinuousBuffer(); - if ($this->mode_3cbc) { - $this->des[0]->disableContinuousBuffer(); - $this->des[1]->disableContinuousBuffer(); - $this->des[2]->disableContinuousBuffer(); - } - } - - /** - * Creates the key schedule - * - * @see DES::setupKey() - * @see Common\SymmetricKey::setupKey() - */ - protected function setupKey() - { - switch (true) { - // if $key <= 64bits we configure our internal pure-php cipher engine - // to act as regular [1]DES, not as 3DES. mcrypt.so::tripledes does the same. - case strlen($this->key) <= 8: - $this->des_rounds = 1; - break; - - // otherwise, if $key > 64bits, we configure our engine to work as 3DES. - default: - $this->des_rounds = 3; - - // (only) if 3CBC is used we have, of course, to setup the $des[0-2] keys also separately. - if ($this->mode_3cbc) { - $this->des[0]->setupKey(); - $this->des[1]->setupKey(); - $this->des[2]->setupKey(); - - // because $des[0-2] will, now, do all the work we can return here - // not need unnecessary stress parent::setupKey() with our, now unused, $key. - return; - } - } - // setup our key - parent::setupKey(); - } - - /** - * Sets the internal crypt engine - * - * @see Common\SymmetricKey::__construct() - * @see Common\SymmetricKey::setPreferredEngine() - * @param int $engine - */ - public function setPreferredEngine($engine) - { - if ($this->mode_3cbc) { - $this->des[0]->setPreferredEngine($engine); - $this->des[1]->setPreferredEngine($engine); - $this->des[2]->setPreferredEngine($engine); - } - - parent::setPreferredEngine($engine); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Crypt/Twofish.php b/composer/phpseclib/phpseclib/phpseclib/Crypt/Twofish.php deleted file mode 100644 index d211982..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Crypt/Twofish.php +++ /dev/null @@ -1,816 +0,0 @@ - - * setKey('12345678901234567890123456789012'); - * - * $plaintext = str_repeat('a', 1024); - * - * echo $twofish->decrypt($twofish->encrypt($plaintext)); - * ?> - * - * - * @author Jim Wigginton - * @author Hans-Juergen Petrich - * @copyright 2007 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Crypt; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\BlockCipher; -use OCA\Libresign\Vendor\phpseclib3\Exception\BadModeException; - -/** - * Pure-PHP implementation of Twofish. - * - * @author Jim Wigginton - * @author Hans-Juergen Petrich - */ -class Twofish extends BlockCipher -{ - /** - * The mcrypt specific name of the cipher - * - * @see Common\SymmetricKey::cipher_name_mcrypt - * @var string - */ - protected $cipher_name_mcrypt = 'twofish'; - - /** - * Optimizing value while CFB-encrypting - * - * @see Common\SymmetricKey::cfb_init_len - * @var int - */ - protected $cfb_init_len = 800; - - /** - * Q-Table - * - * @var array - */ - private static $q0 = [ - 0xA9, 0x67, 0xB3, 0xE8, 0x04, 0xFD, 0xA3, 0x76, - 0x9A, 0x92, 0x80, 0x78, 0xE4, 0xDD, 0xD1, 0x38, - 0x0D, 0xC6, 0x35, 0x98, 0x18, 0xF7, 0xEC, 0x6C, - 0x43, 0x75, 0x37, 0x26, 0xFA, 0x13, 0x94, 0x48, - 0xF2, 0xD0, 0x8B, 0x30, 0x84, 0x54, 0xDF, 0x23, - 0x19, 0x5B, 0x3D, 0x59, 0xF3, 0xAE, 0xA2, 0x82, - 0x63, 0x01, 0x83, 0x2E, 0xD9, 0x51, 0x9B, 0x7C, - 0xA6, 0xEB, 0xA5, 0xBE, 0x16, 0x0C, 0xE3, 0x61, - 0xC0, 0x8C, 0x3A, 0xF5, 0x73, 0x2C, 0x25, 0x0B, - 0xBB, 0x4E, 0x89, 0x6B, 0x53, 0x6A, 0xB4, 0xF1, - 0xE1, 0xE6, 0xBD, 0x45, 0xE2, 0xF4, 0xB6, 0x66, - 0xCC, 0x95, 0x03, 0x56, 0xD4, 0x1C, 0x1E, 0xD7, - 0xFB, 0xC3, 0x8E, 0xB5, 0xE9, 0xCF, 0xBF, 0xBA, - 0xEA, 0x77, 0x39, 0xAF, 0x33, 0xC9, 0x62, 0x71, - 0x81, 0x79, 0x09, 0xAD, 0x24, 0xCD, 0xF9, 0xD8, - 0xE5, 0xC5, 0xB9, 0x4D, 0x44, 0x08, 0x86, 0xE7, - 0xA1, 0x1D, 0xAA, 0xED, 0x06, 0x70, 0xB2, 0xD2, - 0x41, 0x7B, 0xA0, 0x11, 0x31, 0xC2, 0x27, 0x90, - 0x20, 0xF6, 0x60, 0xFF, 0x96, 0x5C, 0xB1, 0xAB, - 0x9E, 0x9C, 0x52, 0x1B, 0x5F, 0x93, 0x0A, 0xEF, - 0x91, 0x85, 0x49, 0xEE, 0x2D, 0x4F, 0x8F, 0x3B, - 0x47, 0x87, 0x6D, 0x46, 0xD6, 0x3E, 0x69, 0x64, - 0x2A, 0xCE, 0xCB, 0x2F, 0xFC, 0x97, 0x05, 0x7A, - 0xAC, 0x7F, 0xD5, 0x1A, 0x4B, 0x0E, 0xA7, 0x5A, - 0x28, 0x14, 0x3F, 0x29, 0x88, 0x3C, 0x4C, 0x02, - 0xB8, 0xDA, 0xB0, 0x17, 0x55, 0x1F, 0x8A, 0x7D, - 0x57, 0xC7, 0x8D, 0x74, 0xB7, 0xC4, 0x9F, 0x72, - 0x7E, 0x15, 0x22, 0x12, 0x58, 0x07, 0x99, 0x34, - 0x6E, 0x50, 0xDE, 0x68, 0x65, 0xBC, 0xDB, 0xF8, - 0xC8, 0xA8, 0x2B, 0x40, 0xDC, 0xFE, 0x32, 0xA4, - 0xCA, 0x10, 0x21, 0xF0, 0xD3, 0x5D, 0x0F, 0x00, - 0x6F, 0x9D, 0x36, 0x42, 0x4A, 0x5E, 0xC1, 0xE0 - ]; - - /** - * Q-Table - * - * @var array - */ - private static $q1 = [ - 0x75, 0xF3, 0xC6, 0xF4, 0xDB, 0x7B, 0xFB, 0xC8, - 0x4A, 0xD3, 0xE6, 0x6B, 0x45, 0x7D, 0xE8, 0x4B, - 0xD6, 0x32, 0xD8, 0xFD, 0x37, 0x71, 0xF1, 0xE1, - 0x30, 0x0F, 0xF8, 0x1B, 0x87, 0xFA, 0x06, 0x3F, - 0x5E, 0xBA, 0xAE, 0x5B, 0x8A, 0x00, 0xBC, 0x9D, - 0x6D, 0xC1, 0xB1, 0x0E, 0x80, 0x5D, 0xD2, 0xD5, - 0xA0, 0x84, 0x07, 0x14, 0xB5, 0x90, 0x2C, 0xA3, - 0xB2, 0x73, 0x4C, 0x54, 0x92, 0x74, 0x36, 0x51, - 0x38, 0xB0, 0xBD, 0x5A, 0xFC, 0x60, 0x62, 0x96, - 0x6C, 0x42, 0xF7, 0x10, 0x7C, 0x28, 0x27, 0x8C, - 0x13, 0x95, 0x9C, 0xC7, 0x24, 0x46, 0x3B, 0x70, - 0xCA, 0xE3, 0x85, 0xCB, 0x11, 0xD0, 0x93, 0xB8, - 0xA6, 0x83, 0x20, 0xFF, 0x9F, 0x77, 0xC3, 0xCC, - 0x03, 0x6F, 0x08, 0xBF, 0x40, 0xE7, 0x2B, 0xE2, - 0x79, 0x0C, 0xAA, 0x82, 0x41, 0x3A, 0xEA, 0xB9, - 0xE4, 0x9A, 0xA4, 0x97, 0x7E, 0xDA, 0x7A, 0x17, - 0x66, 0x94, 0xA1, 0x1D, 0x3D, 0xF0, 0xDE, 0xB3, - 0x0B, 0x72, 0xA7, 0x1C, 0xEF, 0xD1, 0x53, 0x3E, - 0x8F, 0x33, 0x26, 0x5F, 0xEC, 0x76, 0x2A, 0x49, - 0x81, 0x88, 0xEE, 0x21, 0xC4, 0x1A, 0xEB, 0xD9, - 0xC5, 0x39, 0x99, 0xCD, 0xAD, 0x31, 0x8B, 0x01, - 0x18, 0x23, 0xDD, 0x1F, 0x4E, 0x2D, 0xF9, 0x48, - 0x4F, 0xF2, 0x65, 0x8E, 0x78, 0x5C, 0x58, 0x19, - 0x8D, 0xE5, 0x98, 0x57, 0x67, 0x7F, 0x05, 0x64, - 0xAF, 0x63, 0xB6, 0xFE, 0xF5, 0xB7, 0x3C, 0xA5, - 0xCE, 0xE9, 0x68, 0x44, 0xE0, 0x4D, 0x43, 0x69, - 0x29, 0x2E, 0xAC, 0x15, 0x59, 0xA8, 0x0A, 0x9E, - 0x6E, 0x47, 0xDF, 0x34, 0x35, 0x6A, 0xCF, 0xDC, - 0x22, 0xC9, 0xC0, 0x9B, 0x89, 0xD4, 0xED, 0xAB, - 0x12, 0xA2, 0x0D, 0x52, 0xBB, 0x02, 0x2F, 0xA9, - 0xD7, 0x61, 0x1E, 0xB4, 0x50, 0x04, 0xF6, 0xC2, - 0x16, 0x25, 0x86, 0x56, 0x55, 0x09, 0xBE, 0x91 - ]; - - /** - * M-Table - * - * @var array - */ - private static $m0 = [ - 0xBCBC3275, 0xECEC21F3, 0x202043C6, 0xB3B3C9F4, 0xDADA03DB, 0x02028B7B, 0xE2E22BFB, 0x9E9EFAC8, - 0xC9C9EC4A, 0xD4D409D3, 0x18186BE6, 0x1E1E9F6B, 0x98980E45, 0xB2B2387D, 0xA6A6D2E8, 0x2626B74B, - 0x3C3C57D6, 0x93938A32, 0x8282EED8, 0x525298FD, 0x7B7BD437, 0xBBBB3771, 0x5B5B97F1, 0x474783E1, - 0x24243C30, 0x5151E20F, 0xBABAC6F8, 0x4A4AF31B, 0xBFBF4887, 0x0D0D70FA, 0xB0B0B306, 0x7575DE3F, - 0xD2D2FD5E, 0x7D7D20BA, 0x666631AE, 0x3A3AA35B, 0x59591C8A, 0x00000000, 0xCDCD93BC, 0x1A1AE09D, - 0xAEAE2C6D, 0x7F7FABC1, 0x2B2BC7B1, 0xBEBEB90E, 0xE0E0A080, 0x8A8A105D, 0x3B3B52D2, 0x6464BAD5, - 0xD8D888A0, 0xE7E7A584, 0x5F5FE807, 0x1B1B1114, 0x2C2CC2B5, 0xFCFCB490, 0x3131272C, 0x808065A3, - 0x73732AB2, 0x0C0C8173, 0x79795F4C, 0x6B6B4154, 0x4B4B0292, 0x53536974, 0x94948F36, 0x83831F51, - 0x2A2A3638, 0xC4C49CB0, 0x2222C8BD, 0xD5D5F85A, 0xBDBDC3FC, 0x48487860, 0xFFFFCE62, 0x4C4C0796, - 0x4141776C, 0xC7C7E642, 0xEBEB24F7, 0x1C1C1410, 0x5D5D637C, 0x36362228, 0x6767C027, 0xE9E9AF8C, - 0x4444F913, 0x1414EA95, 0xF5F5BB9C, 0xCFCF18C7, 0x3F3F2D24, 0xC0C0E346, 0x7272DB3B, 0x54546C70, - 0x29294CCA, 0xF0F035E3, 0x0808FE85, 0xC6C617CB, 0xF3F34F11, 0x8C8CE4D0, 0xA4A45993, 0xCACA96B8, - 0x68683BA6, 0xB8B84D83, 0x38382820, 0xE5E52EFF, 0xADAD569F, 0x0B0B8477, 0xC8C81DC3, 0x9999FFCC, - 0x5858ED03, 0x19199A6F, 0x0E0E0A08, 0x95957EBF, 0x70705040, 0xF7F730E7, 0x6E6ECF2B, 0x1F1F6EE2, - 0xB5B53D79, 0x09090F0C, 0x616134AA, 0x57571682, 0x9F9F0B41, 0x9D9D803A, 0x111164EA, 0x2525CDB9, - 0xAFAFDDE4, 0x4545089A, 0xDFDF8DA4, 0xA3A35C97, 0xEAEAD57E, 0x353558DA, 0xEDEDD07A, 0x4343FC17, - 0xF8F8CB66, 0xFBFBB194, 0x3737D3A1, 0xFAFA401D, 0xC2C2683D, 0xB4B4CCF0, 0x32325DDE, 0x9C9C71B3, - 0x5656E70B, 0xE3E3DA72, 0x878760A7, 0x15151B1C, 0xF9F93AEF, 0x6363BFD1, 0x3434A953, 0x9A9A853E, - 0xB1B1428F, 0x7C7CD133, 0x88889B26, 0x3D3DA65F, 0xA1A1D7EC, 0xE4E4DF76, 0x8181942A, 0x91910149, - 0x0F0FFB81, 0xEEEEAA88, 0x161661EE, 0xD7D77321, 0x9797F5C4, 0xA5A5A81A, 0xFEFE3FEB, 0x6D6DB5D9, - 0x7878AEC5, 0xC5C56D39, 0x1D1DE599, 0x7676A4CD, 0x3E3EDCAD, 0xCBCB6731, 0xB6B6478B, 0xEFEF5B01, - 0x12121E18, 0x6060C523, 0x6A6AB0DD, 0x4D4DF61F, 0xCECEE94E, 0xDEDE7C2D, 0x55559DF9, 0x7E7E5A48, - 0x2121B24F, 0x03037AF2, 0xA0A02665, 0x5E5E198E, 0x5A5A6678, 0x65654B5C, 0x62624E58, 0xFDFD4519, - 0x0606F48D, 0x404086E5, 0xF2F2BE98, 0x3333AC57, 0x17179067, 0x05058E7F, 0xE8E85E05, 0x4F4F7D64, - 0x89896AAF, 0x10109563, 0x74742FB6, 0x0A0A75FE, 0x5C5C92F5, 0x9B9B74B7, 0x2D2D333C, 0x3030D6A5, - 0x2E2E49CE, 0x494989E9, 0x46467268, 0x77775544, 0xA8A8D8E0, 0x9696044D, 0x2828BD43, 0xA9A92969, - 0xD9D97929, 0x8686912E, 0xD1D187AC, 0xF4F44A15, 0x8D8D1559, 0xD6D682A8, 0xB9B9BC0A, 0x42420D9E, - 0xF6F6C16E, 0x2F2FB847, 0xDDDD06DF, 0x23233934, 0xCCCC6235, 0xF1F1C46A, 0xC1C112CF, 0x8585EBDC, - 0x8F8F9E22, 0x7171A1C9, 0x9090F0C0, 0xAAAA539B, 0x0101F189, 0x8B8BE1D4, 0x4E4E8CED, 0x8E8E6FAB, - 0xABABA212, 0x6F6F3EA2, 0xE6E6540D, 0xDBDBF252, 0x92927BBB, 0xB7B7B602, 0x6969CA2F, 0x3939D9A9, - 0xD3D30CD7, 0xA7A72361, 0xA2A2AD1E, 0xC3C399B4, 0x6C6C4450, 0x07070504, 0x04047FF6, 0x272746C2, - 0xACACA716, 0xD0D07625, 0x50501386, 0xDCDCF756, 0x84841A55, 0xE1E15109, 0x7A7A25BE, 0x1313EF91 - ]; - - /** - * M-Table - * - * @var array - */ - private static $m1 = [ - 0xA9D93939, 0x67901717, 0xB3719C9C, 0xE8D2A6A6, 0x04050707, 0xFD985252, 0xA3658080, 0x76DFE4E4, - 0x9A084545, 0x92024B4B, 0x80A0E0E0, 0x78665A5A, 0xE4DDAFAF, 0xDDB06A6A, 0xD1BF6363, 0x38362A2A, - 0x0D54E6E6, 0xC6432020, 0x3562CCCC, 0x98BEF2F2, 0x181E1212, 0xF724EBEB, 0xECD7A1A1, 0x6C774141, - 0x43BD2828, 0x7532BCBC, 0x37D47B7B, 0x269B8888, 0xFA700D0D, 0x13F94444, 0x94B1FBFB, 0x485A7E7E, - 0xF27A0303, 0xD0E48C8C, 0x8B47B6B6, 0x303C2424, 0x84A5E7E7, 0x54416B6B, 0xDF06DDDD, 0x23C56060, - 0x1945FDFD, 0x5BA33A3A, 0x3D68C2C2, 0x59158D8D, 0xF321ECEC, 0xAE316666, 0xA23E6F6F, 0x82165757, - 0x63951010, 0x015BEFEF, 0x834DB8B8, 0x2E918686, 0xD9B56D6D, 0x511F8383, 0x9B53AAAA, 0x7C635D5D, - 0xA63B6868, 0xEB3FFEFE, 0xA5D63030, 0xBE257A7A, 0x16A7ACAC, 0x0C0F0909, 0xE335F0F0, 0x6123A7A7, - 0xC0F09090, 0x8CAFE9E9, 0x3A809D9D, 0xF5925C5C, 0x73810C0C, 0x2C273131, 0x2576D0D0, 0x0BE75656, - 0xBB7B9292, 0x4EE9CECE, 0x89F10101, 0x6B9F1E1E, 0x53A93434, 0x6AC4F1F1, 0xB499C3C3, 0xF1975B5B, - 0xE1834747, 0xE66B1818, 0xBDC82222, 0x450E9898, 0xE26E1F1F, 0xF4C9B3B3, 0xB62F7474, 0x66CBF8F8, - 0xCCFF9999, 0x95EA1414, 0x03ED5858, 0x56F7DCDC, 0xD4E18B8B, 0x1C1B1515, 0x1EADA2A2, 0xD70CD3D3, - 0xFB2BE2E2, 0xC31DC8C8, 0x8E195E5E, 0xB5C22C2C, 0xE9894949, 0xCF12C1C1, 0xBF7E9595, 0xBA207D7D, - 0xEA641111, 0x77840B0B, 0x396DC5C5, 0xAF6A8989, 0x33D17C7C, 0xC9A17171, 0x62CEFFFF, 0x7137BBBB, - 0x81FB0F0F, 0x793DB5B5, 0x0951E1E1, 0xADDC3E3E, 0x242D3F3F, 0xCDA47676, 0xF99D5555, 0xD8EE8282, - 0xE5864040, 0xC5AE7878, 0xB9CD2525, 0x4D049696, 0x44557777, 0x080A0E0E, 0x86135050, 0xE730F7F7, - 0xA1D33737, 0x1D40FAFA, 0xAA346161, 0xED8C4E4E, 0x06B3B0B0, 0x706C5454, 0xB22A7373, 0xD2523B3B, - 0x410B9F9F, 0x7B8B0202, 0xA088D8D8, 0x114FF3F3, 0x3167CBCB, 0xC2462727, 0x27C06767, 0x90B4FCFC, - 0x20283838, 0xF67F0404, 0x60784848, 0xFF2EE5E5, 0x96074C4C, 0x5C4B6565, 0xB1C72B2B, 0xAB6F8E8E, - 0x9E0D4242, 0x9CBBF5F5, 0x52F2DBDB, 0x1BF34A4A, 0x5FA63D3D, 0x9359A4A4, 0x0ABCB9B9, 0xEF3AF9F9, - 0x91EF1313, 0x85FE0808, 0x49019191, 0xEE611616, 0x2D7CDEDE, 0x4FB22121, 0x8F42B1B1, 0x3BDB7272, - 0x47B82F2F, 0x8748BFBF, 0x6D2CAEAE, 0x46E3C0C0, 0xD6573C3C, 0x3E859A9A, 0x6929A9A9, 0x647D4F4F, - 0x2A948181, 0xCE492E2E, 0xCB17C6C6, 0x2FCA6969, 0xFCC3BDBD, 0x975CA3A3, 0x055EE8E8, 0x7AD0EDED, - 0xAC87D1D1, 0x7F8E0505, 0xD5BA6464, 0x1AA8A5A5, 0x4BB72626, 0x0EB9BEBE, 0xA7608787, 0x5AF8D5D5, - 0x28223636, 0x14111B1B, 0x3FDE7575, 0x2979D9D9, 0x88AAEEEE, 0x3C332D2D, 0x4C5F7979, 0x02B6B7B7, - 0xB896CACA, 0xDA583535, 0xB09CC4C4, 0x17FC4343, 0x551A8484, 0x1FF64D4D, 0x8A1C5959, 0x7D38B2B2, - 0x57AC3333, 0xC718CFCF, 0x8DF40606, 0x74695353, 0xB7749B9B, 0xC4F59797, 0x9F56ADAD, 0x72DAE3E3, - 0x7ED5EAEA, 0x154AF4F4, 0x229E8F8F, 0x12A2ABAB, 0x584E6262, 0x07E85F5F, 0x99E51D1D, 0x34392323, - 0x6EC1F6F6, 0x50446C6C, 0xDE5D3232, 0x68724646, 0x6526A0A0, 0xBC93CDCD, 0xDB03DADA, 0xF8C6BABA, - 0xC8FA9E9E, 0xA882D6D6, 0x2BCF6E6E, 0x40507070, 0xDCEB8585, 0xFE750A0A, 0x328A9393, 0xA48DDFDF, - 0xCA4C2929, 0x10141C1C, 0x2173D7D7, 0xF0CCB4B4, 0xD309D4D4, 0x5D108A8A, 0x0FE25151, 0x00000000, - 0x6F9A1919, 0x9DE01A1A, 0x368F9494, 0x42E6C7C7, 0x4AECC9C9, 0x5EFDD2D2, 0xC1AB7F7F, 0xE0D8A8A8 - ]; - - /** - * M-Table - * - * @var array - */ - private static $m2 = [ - 0xBC75BC32, 0xECF3EC21, 0x20C62043, 0xB3F4B3C9, 0xDADBDA03, 0x027B028B, 0xE2FBE22B, 0x9EC89EFA, - 0xC94AC9EC, 0xD4D3D409, 0x18E6186B, 0x1E6B1E9F, 0x9845980E, 0xB27DB238, 0xA6E8A6D2, 0x264B26B7, - 0x3CD63C57, 0x9332938A, 0x82D882EE, 0x52FD5298, 0x7B377BD4, 0xBB71BB37, 0x5BF15B97, 0x47E14783, - 0x2430243C, 0x510F51E2, 0xBAF8BAC6, 0x4A1B4AF3, 0xBF87BF48, 0x0DFA0D70, 0xB006B0B3, 0x753F75DE, - 0xD25ED2FD, 0x7DBA7D20, 0x66AE6631, 0x3A5B3AA3, 0x598A591C, 0x00000000, 0xCDBCCD93, 0x1A9D1AE0, - 0xAE6DAE2C, 0x7FC17FAB, 0x2BB12BC7, 0xBE0EBEB9, 0xE080E0A0, 0x8A5D8A10, 0x3BD23B52, 0x64D564BA, - 0xD8A0D888, 0xE784E7A5, 0x5F075FE8, 0x1B141B11, 0x2CB52CC2, 0xFC90FCB4, 0x312C3127, 0x80A38065, - 0x73B2732A, 0x0C730C81, 0x794C795F, 0x6B546B41, 0x4B924B02, 0x53745369, 0x9436948F, 0x8351831F, - 0x2A382A36, 0xC4B0C49C, 0x22BD22C8, 0xD55AD5F8, 0xBDFCBDC3, 0x48604878, 0xFF62FFCE, 0x4C964C07, - 0x416C4177, 0xC742C7E6, 0xEBF7EB24, 0x1C101C14, 0x5D7C5D63, 0x36283622, 0x672767C0, 0xE98CE9AF, - 0x441344F9, 0x149514EA, 0xF59CF5BB, 0xCFC7CF18, 0x3F243F2D, 0xC046C0E3, 0x723B72DB, 0x5470546C, - 0x29CA294C, 0xF0E3F035, 0x088508FE, 0xC6CBC617, 0xF311F34F, 0x8CD08CE4, 0xA493A459, 0xCAB8CA96, - 0x68A6683B, 0xB883B84D, 0x38203828, 0xE5FFE52E, 0xAD9FAD56, 0x0B770B84, 0xC8C3C81D, 0x99CC99FF, - 0x580358ED, 0x196F199A, 0x0E080E0A, 0x95BF957E, 0x70407050, 0xF7E7F730, 0x6E2B6ECF, 0x1FE21F6E, - 0xB579B53D, 0x090C090F, 0x61AA6134, 0x57825716, 0x9F419F0B, 0x9D3A9D80, 0x11EA1164, 0x25B925CD, - 0xAFE4AFDD, 0x459A4508, 0xDFA4DF8D, 0xA397A35C, 0xEA7EEAD5, 0x35DA3558, 0xED7AEDD0, 0x431743FC, - 0xF866F8CB, 0xFB94FBB1, 0x37A137D3, 0xFA1DFA40, 0xC23DC268, 0xB4F0B4CC, 0x32DE325D, 0x9CB39C71, - 0x560B56E7, 0xE372E3DA, 0x87A78760, 0x151C151B, 0xF9EFF93A, 0x63D163BF, 0x345334A9, 0x9A3E9A85, - 0xB18FB142, 0x7C337CD1, 0x8826889B, 0x3D5F3DA6, 0xA1ECA1D7, 0xE476E4DF, 0x812A8194, 0x91499101, - 0x0F810FFB, 0xEE88EEAA, 0x16EE1661, 0xD721D773, 0x97C497F5, 0xA51AA5A8, 0xFEEBFE3F, 0x6DD96DB5, - 0x78C578AE, 0xC539C56D, 0x1D991DE5, 0x76CD76A4, 0x3EAD3EDC, 0xCB31CB67, 0xB68BB647, 0xEF01EF5B, - 0x1218121E, 0x602360C5, 0x6ADD6AB0, 0x4D1F4DF6, 0xCE4ECEE9, 0xDE2DDE7C, 0x55F9559D, 0x7E487E5A, - 0x214F21B2, 0x03F2037A, 0xA065A026, 0x5E8E5E19, 0x5A785A66, 0x655C654B, 0x6258624E, 0xFD19FD45, - 0x068D06F4, 0x40E54086, 0xF298F2BE, 0x335733AC, 0x17671790, 0x057F058E, 0xE805E85E, 0x4F644F7D, - 0x89AF896A, 0x10631095, 0x74B6742F, 0x0AFE0A75, 0x5CF55C92, 0x9BB79B74, 0x2D3C2D33, 0x30A530D6, - 0x2ECE2E49, 0x49E94989, 0x46684672, 0x77447755, 0xA8E0A8D8, 0x964D9604, 0x284328BD, 0xA969A929, - 0xD929D979, 0x862E8691, 0xD1ACD187, 0xF415F44A, 0x8D598D15, 0xD6A8D682, 0xB90AB9BC, 0x429E420D, - 0xF66EF6C1, 0x2F472FB8, 0xDDDFDD06, 0x23342339, 0xCC35CC62, 0xF16AF1C4, 0xC1CFC112, 0x85DC85EB, - 0x8F228F9E, 0x71C971A1, 0x90C090F0, 0xAA9BAA53, 0x018901F1, 0x8BD48BE1, 0x4EED4E8C, 0x8EAB8E6F, - 0xAB12ABA2, 0x6FA26F3E, 0xE60DE654, 0xDB52DBF2, 0x92BB927B, 0xB702B7B6, 0x692F69CA, 0x39A939D9, - 0xD3D7D30C, 0xA761A723, 0xA21EA2AD, 0xC3B4C399, 0x6C506C44, 0x07040705, 0x04F6047F, 0x27C22746, - 0xAC16ACA7, 0xD025D076, 0x50865013, 0xDC56DCF7, 0x8455841A, 0xE109E151, 0x7ABE7A25, 0x139113EF - ]; - - /** - * M-Table - * - * @var array - */ - private static $m3 = [ - 0xD939A9D9, 0x90176790, 0x719CB371, 0xD2A6E8D2, 0x05070405, 0x9852FD98, 0x6580A365, 0xDFE476DF, - 0x08459A08, 0x024B9202, 0xA0E080A0, 0x665A7866, 0xDDAFE4DD, 0xB06ADDB0, 0xBF63D1BF, 0x362A3836, - 0x54E60D54, 0x4320C643, 0x62CC3562, 0xBEF298BE, 0x1E12181E, 0x24EBF724, 0xD7A1ECD7, 0x77416C77, - 0xBD2843BD, 0x32BC7532, 0xD47B37D4, 0x9B88269B, 0x700DFA70, 0xF94413F9, 0xB1FB94B1, 0x5A7E485A, - 0x7A03F27A, 0xE48CD0E4, 0x47B68B47, 0x3C24303C, 0xA5E784A5, 0x416B5441, 0x06DDDF06, 0xC56023C5, - 0x45FD1945, 0xA33A5BA3, 0x68C23D68, 0x158D5915, 0x21ECF321, 0x3166AE31, 0x3E6FA23E, 0x16578216, - 0x95106395, 0x5BEF015B, 0x4DB8834D, 0x91862E91, 0xB56DD9B5, 0x1F83511F, 0x53AA9B53, 0x635D7C63, - 0x3B68A63B, 0x3FFEEB3F, 0xD630A5D6, 0x257ABE25, 0xA7AC16A7, 0x0F090C0F, 0x35F0E335, 0x23A76123, - 0xF090C0F0, 0xAFE98CAF, 0x809D3A80, 0x925CF592, 0x810C7381, 0x27312C27, 0x76D02576, 0xE7560BE7, - 0x7B92BB7B, 0xE9CE4EE9, 0xF10189F1, 0x9F1E6B9F, 0xA93453A9, 0xC4F16AC4, 0x99C3B499, 0x975BF197, - 0x8347E183, 0x6B18E66B, 0xC822BDC8, 0x0E98450E, 0x6E1FE26E, 0xC9B3F4C9, 0x2F74B62F, 0xCBF866CB, - 0xFF99CCFF, 0xEA1495EA, 0xED5803ED, 0xF7DC56F7, 0xE18BD4E1, 0x1B151C1B, 0xADA21EAD, 0x0CD3D70C, - 0x2BE2FB2B, 0x1DC8C31D, 0x195E8E19, 0xC22CB5C2, 0x8949E989, 0x12C1CF12, 0x7E95BF7E, 0x207DBA20, - 0x6411EA64, 0x840B7784, 0x6DC5396D, 0x6A89AF6A, 0xD17C33D1, 0xA171C9A1, 0xCEFF62CE, 0x37BB7137, - 0xFB0F81FB, 0x3DB5793D, 0x51E10951, 0xDC3EADDC, 0x2D3F242D, 0xA476CDA4, 0x9D55F99D, 0xEE82D8EE, - 0x8640E586, 0xAE78C5AE, 0xCD25B9CD, 0x04964D04, 0x55774455, 0x0A0E080A, 0x13508613, 0x30F7E730, - 0xD337A1D3, 0x40FA1D40, 0x3461AA34, 0x8C4EED8C, 0xB3B006B3, 0x6C54706C, 0x2A73B22A, 0x523BD252, - 0x0B9F410B, 0x8B027B8B, 0x88D8A088, 0x4FF3114F, 0x67CB3167, 0x4627C246, 0xC06727C0, 0xB4FC90B4, - 0x28382028, 0x7F04F67F, 0x78486078, 0x2EE5FF2E, 0x074C9607, 0x4B655C4B, 0xC72BB1C7, 0x6F8EAB6F, - 0x0D429E0D, 0xBBF59CBB, 0xF2DB52F2, 0xF34A1BF3, 0xA63D5FA6, 0x59A49359, 0xBCB90ABC, 0x3AF9EF3A, - 0xEF1391EF, 0xFE0885FE, 0x01914901, 0x6116EE61, 0x7CDE2D7C, 0xB2214FB2, 0x42B18F42, 0xDB723BDB, - 0xB82F47B8, 0x48BF8748, 0x2CAE6D2C, 0xE3C046E3, 0x573CD657, 0x859A3E85, 0x29A96929, 0x7D4F647D, - 0x94812A94, 0x492ECE49, 0x17C6CB17, 0xCA692FCA, 0xC3BDFCC3, 0x5CA3975C, 0x5EE8055E, 0xD0ED7AD0, - 0x87D1AC87, 0x8E057F8E, 0xBA64D5BA, 0xA8A51AA8, 0xB7264BB7, 0xB9BE0EB9, 0x6087A760, 0xF8D55AF8, - 0x22362822, 0x111B1411, 0xDE753FDE, 0x79D92979, 0xAAEE88AA, 0x332D3C33, 0x5F794C5F, 0xB6B702B6, - 0x96CAB896, 0x5835DA58, 0x9CC4B09C, 0xFC4317FC, 0x1A84551A, 0xF64D1FF6, 0x1C598A1C, 0x38B27D38, - 0xAC3357AC, 0x18CFC718, 0xF4068DF4, 0x69537469, 0x749BB774, 0xF597C4F5, 0x56AD9F56, 0xDAE372DA, - 0xD5EA7ED5, 0x4AF4154A, 0x9E8F229E, 0xA2AB12A2, 0x4E62584E, 0xE85F07E8, 0xE51D99E5, 0x39233439, - 0xC1F66EC1, 0x446C5044, 0x5D32DE5D, 0x72466872, 0x26A06526, 0x93CDBC93, 0x03DADB03, 0xC6BAF8C6, - 0xFA9EC8FA, 0x82D6A882, 0xCF6E2BCF, 0x50704050, 0xEB85DCEB, 0x750AFE75, 0x8A93328A, 0x8DDFA48D, - 0x4C29CA4C, 0x141C1014, 0x73D72173, 0xCCB4F0CC, 0x09D4D309, 0x108A5D10, 0xE2510FE2, 0x00000000, - 0x9A196F9A, 0xE01A9DE0, 0x8F94368F, 0xE6C742E6, 0xECC94AEC, 0xFDD25EFD, 0xAB7FC1AB, 0xD8A8E0D8 - ]; - - /** - * The Key Schedule Array - * - * @var array - */ - private $K = []; - - /** - * The Key depended S-Table 0 - * - * @var array - */ - private $S0 = []; - - /** - * The Key depended S-Table 1 - * - * @var array - */ - private $S1 = []; - - /** - * The Key depended S-Table 2 - * - * @var array - */ - private $S2 = []; - - /** - * The Key depended S-Table 3 - * - * @var array - */ - private $S3 = []; - - /** - * Holds the last used key - * - * @var array - */ - private $kl; - - /** - * The Key Length (in bytes) - * - * @see Crypt_Twofish::setKeyLength() - * @var int - */ - protected $key_length = 16; - - /** - * Default Constructor. - * - * @param string $mode - * @throws BadModeException if an invalid / unsupported mode is provided - */ - public function __construct($mode) - { - parent::__construct($mode); - - if ($this->mode == self::MODE_STREAM) { - throw new BadModeException('Block ciphers cannot be ran in stream mode'); - } - } - - /** - * Initialize Static Variables - */ - protected static function initialize_static_variables() - { - if (is_float(self::$m3[0])) { - self::$m0 = array_map('intval', self::$m0); - self::$m1 = array_map('intval', self::$m1); - self::$m2 = array_map('intval', self::$m2); - self::$m3 = array_map('intval', self::$m3); - self::$q0 = array_map('intval', self::$q0); - self::$q1 = array_map('intval', self::$q1); - } - - parent::initialize_static_variables(); - } - - /** - * Sets the key length. - * - * Valid key lengths are 128, 192 or 256 bits - * - * @param int $length - */ - public function setKeyLength($length) - { - switch ($length) { - case 128: - case 192: - case 256: - break; - default: - throw new \LengthException('Key of size ' . $length . ' not supported by this algorithm. Only keys of sizes 16, 24 or 32 supported'); - } - - parent::setKeyLength($length); - } - - /** - * Sets the key. - * - * Rijndael supports five different key lengths - * - * @see setKeyLength() - * @param string $key - * @throws \LengthException if the key length isn't supported - */ - public function setKey($key) - { - switch (strlen($key)) { - case 16: - case 24: - case 32: - break; - default: - throw new \LengthException('Key of size ' . strlen($key) . ' not supported by this algorithm. Only keys of sizes 16, 24 or 32 supported'); - } - - parent::setKey($key); - } - - /** - * Setup the key (expansion) - * - * @see Common\SymmetricKey::_setupKey() - */ - protected function setupKey() - { - if (isset($this->kl['key']) && $this->key === $this->kl['key']) { - // already expanded - return; - } - $this->kl = ['key' => $this->key]; - - /* Key expanding and generating the key-depended s-boxes */ - $le_longs = unpack('V*', $this->key); - $key = unpack('C*', $this->key); - $m0 = self::$m0; - $m1 = self::$m1; - $m2 = self::$m2; - $m3 = self::$m3; - $q0 = self::$q0; - $q1 = self::$q1; - - $K = $S0 = $S1 = $S2 = $S3 = []; - - switch (strlen($this->key)) { - case 16: - list($s7, $s6, $s5, $s4) = $this->mdsrem($le_longs[1], $le_longs[2]); - list($s3, $s2, $s1, $s0) = $this->mdsrem($le_longs[3], $le_longs[4]); - for ($i = 0, $j = 1; $i < 40; $i += 2, $j += 2) { - $A = $m0[$q0[$q0[$i] ^ $key[ 9]] ^ $key[1]] ^ - $m1[$q0[$q1[$i] ^ $key[10]] ^ $key[2]] ^ - $m2[$q1[$q0[$i] ^ $key[11]] ^ $key[3]] ^ - $m3[$q1[$q1[$i] ^ $key[12]] ^ $key[4]]; - $B = $m0[$q0[$q0[$j] ^ $key[13]] ^ $key[5]] ^ - $m1[$q0[$q1[$j] ^ $key[14]] ^ $key[6]] ^ - $m2[$q1[$q0[$j] ^ $key[15]] ^ $key[7]] ^ - $m3[$q1[$q1[$j] ^ $key[16]] ^ $key[8]]; - $B = ($B << 8) | ($B >> 24 & 0xff); - $A = self::safe_intval($A + $B); - $K[] = $A; - $A = self::safe_intval($A + $B); - $K[] = ($A << 9 | $A >> 23 & 0x1ff); - } - for ($i = 0; $i < 256; ++$i) { - $S0[$i] = $m0[$q0[$q0[$i] ^ $s4] ^ $s0]; - $S1[$i] = $m1[$q0[$q1[$i] ^ $s5] ^ $s1]; - $S2[$i] = $m2[$q1[$q0[$i] ^ $s6] ^ $s2]; - $S3[$i] = $m3[$q1[$q1[$i] ^ $s7] ^ $s3]; - } - break; - case 24: - list($sb, $sa, $s9, $s8) = $this->mdsrem($le_longs[1], $le_longs[2]); - list($s7, $s6, $s5, $s4) = $this->mdsrem($le_longs[3], $le_longs[4]); - list($s3, $s2, $s1, $s0) = $this->mdsrem($le_longs[5], $le_longs[6]); - for ($i = 0, $j = 1; $i < 40; $i += 2, $j += 2) { - $A = $m0[$q0[$q0[$q1[$i] ^ $key[17]] ^ $key[ 9]] ^ $key[1]] ^ - $m1[$q0[$q1[$q1[$i] ^ $key[18]] ^ $key[10]] ^ $key[2]] ^ - $m2[$q1[$q0[$q0[$i] ^ $key[19]] ^ $key[11]] ^ $key[3]] ^ - $m3[$q1[$q1[$q0[$i] ^ $key[20]] ^ $key[12]] ^ $key[4]]; - $B = $m0[$q0[$q0[$q1[$j] ^ $key[21]] ^ $key[13]] ^ $key[5]] ^ - $m1[$q0[$q1[$q1[$j] ^ $key[22]] ^ $key[14]] ^ $key[6]] ^ - $m2[$q1[$q0[$q0[$j] ^ $key[23]] ^ $key[15]] ^ $key[7]] ^ - $m3[$q1[$q1[$q0[$j] ^ $key[24]] ^ $key[16]] ^ $key[8]]; - $B = ($B << 8) | ($B >> 24 & 0xff); - $A = self::safe_intval($A + $B); - $K[] = $A; - $A = self::safe_intval($A + $B); - $K[] = ($A << 9 | $A >> 23 & 0x1ff); - } - for ($i = 0; $i < 256; ++$i) { - $S0[$i] = $m0[$q0[$q0[$q1[$i] ^ $s8] ^ $s4] ^ $s0]; - $S1[$i] = $m1[$q0[$q1[$q1[$i] ^ $s9] ^ $s5] ^ $s1]; - $S2[$i] = $m2[$q1[$q0[$q0[$i] ^ $sa] ^ $s6] ^ $s2]; - $S3[$i] = $m3[$q1[$q1[$q0[$i] ^ $sb] ^ $s7] ^ $s3]; - } - break; - default: // 32 - list($sf, $se, $sd, $sc) = $this->mdsrem($le_longs[1], $le_longs[2]); - list($sb, $sa, $s9, $s8) = $this->mdsrem($le_longs[3], $le_longs[4]); - list($s7, $s6, $s5, $s4) = $this->mdsrem($le_longs[5], $le_longs[6]); - list($s3, $s2, $s1, $s0) = $this->mdsrem($le_longs[7], $le_longs[8]); - for ($i = 0, $j = 1; $i < 40; $i += 2, $j += 2) { - $A = $m0[$q0[$q0[$q1[$q1[$i] ^ $key[25]] ^ $key[17]] ^ $key[ 9]] ^ $key[1]] ^ - $m1[$q0[$q1[$q1[$q0[$i] ^ $key[26]] ^ $key[18]] ^ $key[10]] ^ $key[2]] ^ - $m2[$q1[$q0[$q0[$q0[$i] ^ $key[27]] ^ $key[19]] ^ $key[11]] ^ $key[3]] ^ - $m3[$q1[$q1[$q0[$q1[$i] ^ $key[28]] ^ $key[20]] ^ $key[12]] ^ $key[4]]; - $B = $m0[$q0[$q0[$q1[$q1[$j] ^ $key[29]] ^ $key[21]] ^ $key[13]] ^ $key[5]] ^ - $m1[$q0[$q1[$q1[$q0[$j] ^ $key[30]] ^ $key[22]] ^ $key[14]] ^ $key[6]] ^ - $m2[$q1[$q0[$q0[$q0[$j] ^ $key[31]] ^ $key[23]] ^ $key[15]] ^ $key[7]] ^ - $m3[$q1[$q1[$q0[$q1[$j] ^ $key[32]] ^ $key[24]] ^ $key[16]] ^ $key[8]]; - $B = ($B << 8) | ($B >> 24 & 0xff); - $A = self::safe_intval($A + $B); - $K[] = $A; - $A = self::safe_intval($A + $B); - $K[] = ($A << 9 | $A >> 23 & 0x1ff); - } - for ($i = 0; $i < 256; ++$i) { - $S0[$i] = $m0[$q0[$q0[$q1[$q1[$i] ^ $sc] ^ $s8] ^ $s4] ^ $s0]; - $S1[$i] = $m1[$q0[$q1[$q1[$q0[$i] ^ $sd] ^ $s9] ^ $s5] ^ $s1]; - $S2[$i] = $m2[$q1[$q0[$q0[$q0[$i] ^ $se] ^ $sa] ^ $s6] ^ $s2]; - $S3[$i] = $m3[$q1[$q1[$q0[$q1[$i] ^ $sf] ^ $sb] ^ $s7] ^ $s3]; - } - } - - $this->K = $K; - $this->S0 = $S0; - $this->S1 = $S1; - $this->S2 = $S2; - $this->S3 = $S3; - } - - /** - * _mdsrem function using by the twofish cipher algorithm - * - * @param string $A - * @param string $B - * @return array - */ - private function mdsrem($A, $B) - { - // No gain by unrolling this loop. - for ($i = 0; $i < 8; ++$i) { - // Get most significant coefficient. - $t = 0xff & ($B >> 24); - - // Shift the others up. - $B = ($B << 8) | (0xff & ($A >> 24)); - $A <<= 8; - - $u = $t << 1; - - // Subtract the modular polynomial on overflow. - if ($t & 0x80) { - $u ^= 0x14d; - } - - // Remove t * (a * x^2 + 1). - $B ^= $t ^ ($u << 16); - - // Form u = a*t + t/a = t*(a + 1/a). - $u ^= 0x7fffffff & ($t >> 1); - - // Add the modular polynomial on underflow. - if ($t & 0x01) { - $u ^= 0xa6 ; - } - - // Remove t * (a + 1/a) * (x^3 + x). - $B ^= ($u << 24) | ($u << 8); - } - - return [ - 0xff & $B >> 24, - 0xff & $B >> 16, - 0xff & $B >> 8, - 0xff & $B]; - } - - /** - * Encrypts a block - * - * @param string $in - * @return string - */ - protected function encryptBlock($in) - { - $S0 = $this->S0; - $S1 = $this->S1; - $S2 = $this->S2; - $S3 = $this->S3; - $K = $this->K; - - $in = unpack("V4", $in); - $R0 = $K[0] ^ $in[1]; - $R1 = $K[1] ^ $in[2]; - $R2 = $K[2] ^ $in[3]; - $R3 = $K[3] ^ $in[4]; - - $ki = 7; - while ($ki < 39) { - $t0 = $S0[ $R0 & 0xff] ^ - $S1[($R0 >> 8) & 0xff] ^ - $S2[($R0 >> 16) & 0xff] ^ - $S3[($R0 >> 24) & 0xff]; - $t1 = $S0[($R1 >> 24) & 0xff] ^ - $S1[ $R1 & 0xff] ^ - $S2[($R1 >> 8) & 0xff] ^ - $S3[($R1 >> 16) & 0xff]; - $R2 ^= self::safe_intval($t0 + $t1 + $K[++$ki]); - $R2 = ($R2 >> 1 & 0x7fffffff) | ($R2 << 31); - $R3 = ((($R3 >> 31) & 1) | ($R3 << 1)) ^ self::safe_intval($t0 + ($t1 << 1) + $K[++$ki]); - - $t0 = $S0[ $R2 & 0xff] ^ - $S1[($R2 >> 8) & 0xff] ^ - $S2[($R2 >> 16) & 0xff] ^ - $S3[($R2 >> 24) & 0xff]; - $t1 = $S0[($R3 >> 24) & 0xff] ^ - $S1[ $R3 & 0xff] ^ - $S2[($R3 >> 8) & 0xff] ^ - $S3[($R3 >> 16) & 0xff]; - $R0 ^= self::safe_intval($t0 + $t1 + $K[++$ki]); - $R0 = ($R0 >> 1 & 0x7fffffff) | ($R0 << 31); - $R1 = ((($R1 >> 31) & 1) | ($R1 << 1)) ^ self::safe_intval($t0 + ($t1 << 1) + $K[++$ki]); - } - - // @codingStandardsIgnoreStart - return pack("V4", $K[4] ^ $R2, - $K[5] ^ $R3, - $K[6] ^ $R0, - $K[7] ^ $R1); - // @codingStandardsIgnoreEnd - } - - /** - * Decrypts a block - * - * @param string $in - * @return string - */ - protected function decryptBlock($in) - { - $S0 = $this->S0; - $S1 = $this->S1; - $S2 = $this->S2; - $S3 = $this->S3; - $K = $this->K; - - $in = unpack("V4", $in); - $R0 = $K[4] ^ $in[1]; - $R1 = $K[5] ^ $in[2]; - $R2 = $K[6] ^ $in[3]; - $R3 = $K[7] ^ $in[4]; - - $ki = 40; - while ($ki > 8) { - $t0 = $S0[$R0 & 0xff] ^ - $S1[$R0 >> 8 & 0xff] ^ - $S2[$R0 >> 16 & 0xff] ^ - $S3[$R0 >> 24 & 0xff]; - $t1 = $S0[$R1 >> 24 & 0xff] ^ - $S1[$R1 & 0xff] ^ - $S2[$R1 >> 8 & 0xff] ^ - $S3[$R1 >> 16 & 0xff]; - $R3 ^= self::safe_intval($t0 + ($t1 << 1) + $K[--$ki]); - $R3 = $R3 >> 1 & 0x7fffffff | $R3 << 31; - $R2 = ($R2 >> 31 & 0x1 | $R2 << 1) ^ self::safe_intval($t0 + $t1 + $K[--$ki]); - - $t0 = $S0[$R2 & 0xff] ^ - $S1[$R2 >> 8 & 0xff] ^ - $S2[$R2 >> 16 & 0xff] ^ - $S3[$R2 >> 24 & 0xff]; - $t1 = $S0[$R3 >> 24 & 0xff] ^ - $S1[$R3 & 0xff] ^ - $S2[$R3 >> 8 & 0xff] ^ - $S3[$R3 >> 16 & 0xff]; - $R1 ^= self::safe_intval($t0 + ($t1 << 1) + $K[--$ki]); - $R1 = $R1 >> 1 & 0x7fffffff | $R1 << 31; - $R0 = ($R0 >> 31 & 0x1 | $R0 << 1) ^ self::safe_intval($t0 + $t1 + $K[--$ki]); - } - - // @codingStandardsIgnoreStart - return pack("V4", $K[0] ^ $R2, - $K[1] ^ $R3, - $K[2] ^ $R0, - $K[3] ^ $R1); - // @codingStandardsIgnoreEnd - } - - /** - * Setup the performance-optimized function for de/encrypt() - * - * @see Common\SymmetricKey::_setupInlineCrypt() - */ - protected function setupInlineCrypt() - { - $K = $this->K; - $init_crypt = ' - static $S0, $S1, $S2, $S3; - if (!$S0) { - for ($i = 0; $i < 256; ++$i) { - $S0[] = (int)$this->S0[$i]; - $S1[] = (int)$this->S1[$i]; - $S2[] = (int)$this->S2[$i]; - $S3[] = (int)$this->S3[$i]; - } - } - '; - - $safeint = self::safe_intval_inline(); - - // Generating encrypt code: - $encrypt_block = ' - $in = unpack("V4", $in); - $R0 = ' . $K[0] . ' ^ $in[1]; - $R1 = ' . $K[1] . ' ^ $in[2]; - $R2 = ' . $K[2] . ' ^ $in[3]; - $R3 = ' . $K[3] . ' ^ $in[4]; - '; - for ($ki = 7, $i = 0; $i < 8; ++$i) { - $encrypt_block .= ' - $t0 = $S0[ $R0 & 0xff] ^ - $S1[($R0 >> 8) & 0xff] ^ - $S2[($R0 >> 16) & 0xff] ^ - $S3[($R0 >> 24) & 0xff]; - $t1 = $S0[($R1 >> 24) & 0xff] ^ - $S1[ $R1 & 0xff] ^ - $S2[($R1 >> 8) & 0xff] ^ - $S3[($R1 >> 16) & 0xff]; - $R2^= ' . sprintf($safeint, '$t0 + $t1 + ' . $K[++$ki]) . '; - $R2 = ($R2 >> 1 & 0x7fffffff) | ($R2 << 31); - $R3 = ((($R3 >> 31) & 1) | ($R3 << 1)) ^ ' . sprintf($safeint, '($t0 + ($t1 << 1) + ' . $K[++$ki] . ')') . '; - - $t0 = $S0[ $R2 & 0xff] ^ - $S1[($R2 >> 8) & 0xff] ^ - $S2[($R2 >> 16) & 0xff] ^ - $S3[($R2 >> 24) & 0xff]; - $t1 = $S0[($R3 >> 24) & 0xff] ^ - $S1[ $R3 & 0xff] ^ - $S2[($R3 >> 8) & 0xff] ^ - $S3[($R3 >> 16) & 0xff]; - $R0^= ' . sprintf($safeint, '($t0 + $t1 + ' . $K[++$ki] . ')') . '; - $R0 = ($R0 >> 1 & 0x7fffffff) | ($R0 << 31); - $R1 = ((($R1 >> 31) & 1) | ($R1 << 1)) ^ ' . sprintf($safeint, '($t0 + ($t1 << 1) + ' . $K[++$ki] . ')') . '; - '; - } - $encrypt_block .= ' - $in = pack("V4", ' . $K[4] . ' ^ $R2, - ' . $K[5] . ' ^ $R3, - ' . $K[6] . ' ^ $R0, - ' . $K[7] . ' ^ $R1); - '; - - // Generating decrypt code: - $decrypt_block = ' - $in = unpack("V4", $in); - $R0 = ' . $K[4] . ' ^ $in[1]; - $R1 = ' . $K[5] . ' ^ $in[2]; - $R2 = ' . $K[6] . ' ^ $in[3]; - $R3 = ' . $K[7] . ' ^ $in[4]; - '; - for ($ki = 40, $i = 0; $i < 8; ++$i) { - $decrypt_block .= ' - $t0 = $S0[$R0 & 0xff] ^ - $S1[$R0 >> 8 & 0xff] ^ - $S2[$R0 >> 16 & 0xff] ^ - $S3[$R0 >> 24 & 0xff]; - $t1 = $S0[$R1 >> 24 & 0xff] ^ - $S1[$R1 & 0xff] ^ - $S2[$R1 >> 8 & 0xff] ^ - $S3[$R1 >> 16 & 0xff]; - $R3^= ' . sprintf($safeint, '$t0 + ($t1 << 1) + ' . $K[--$ki]) . '; - $R3 = $R3 >> 1 & 0x7fffffff | $R3 << 31; - $R2 = ($R2 >> 31 & 0x1 | $R2 << 1) ^ ' . sprintf($safeint, '($t0 + $t1 + ' . $K[--$ki] . ')') . '; - - $t0 = $S0[$R2 & 0xff] ^ - $S1[$R2 >> 8 & 0xff] ^ - $S2[$R2 >> 16 & 0xff] ^ - $S3[$R2 >> 24 & 0xff]; - $t1 = $S0[$R3 >> 24 & 0xff] ^ - $S1[$R3 & 0xff] ^ - $S2[$R3 >> 8 & 0xff] ^ - $S3[$R3 >> 16 & 0xff]; - $R1^= ' . sprintf($safeint, '$t0 + ($t1 << 1) + ' . $K[--$ki]) . '; - $R1 = $R1 >> 1 & 0x7fffffff | $R1 << 31; - $R0 = ($R0 >> 31 & 0x1 | $R0 << 1) ^ ' . sprintf($safeint, '($t0 + $t1 + ' . $K[--$ki] . ')') . '; - '; - } - $decrypt_block .= ' - $in = pack("V4", ' . $K[0] . ' ^ $R2, - ' . $K[1] . ' ^ $R3, - ' . $K[2] . ' ^ $R0, - ' . $K[3] . ' ^ $R1); - '; - - $this->inline_crypt = $this->createInlineCryptFunction( - [ - 'init_crypt' => $init_crypt, - 'init_encrypt' => '', - 'init_decrypt' => '', - 'encrypt_block' => $encrypt_block, - 'decrypt_block' => $decrypt_block - ] - ); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Exception/BadConfigurationException.php b/composer/phpseclib/phpseclib/phpseclib/Exception/BadConfigurationException.php deleted file mode 100644 index f529787..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Exception/BadConfigurationException.php +++ /dev/null @@ -1,23 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Exception; - -/** - * BadConfigurationException - * - * @author Jim Wigginton - */ -class BadConfigurationException extends \RuntimeException -{ -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Exception/BadDecryptionException.php b/composer/phpseclib/phpseclib/phpseclib/Exception/BadDecryptionException.php deleted file mode 100644 index b8d759b..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Exception/BadDecryptionException.php +++ /dev/null @@ -1,23 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Exception; - -/** - * BadDecryptionException - * - * @author Jim Wigginton - */ -class BadDecryptionException extends \RuntimeException -{ -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Exception/BadModeException.php b/composer/phpseclib/phpseclib/phpseclib/Exception/BadModeException.php deleted file mode 100644 index 889dd83..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Exception/BadModeException.php +++ /dev/null @@ -1,23 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Exception; - -/** - * BadModeException - * - * @author Jim Wigginton - */ -class BadModeException extends \RuntimeException -{ -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Exception/ConnectionClosedException.php b/composer/phpseclib/phpseclib/phpseclib/Exception/ConnectionClosedException.php deleted file mode 100644 index 1003d17..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Exception/ConnectionClosedException.php +++ /dev/null @@ -1,23 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Exception; - -/** - * ConnectionClosedException - * - * @author Jim Wigginton - */ -class ConnectionClosedException extends \RuntimeException -{ -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Exception/FileNotFoundException.php b/composer/phpseclib/phpseclib/phpseclib/Exception/FileNotFoundException.php deleted file mode 100644 index 8fb6f75..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Exception/FileNotFoundException.php +++ /dev/null @@ -1,23 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Exception; - -/** - * FileNotFoundException - * - * @author Jim Wigginton - */ -class FileNotFoundException extends \RuntimeException -{ -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Exception/InconsistentSetupException.php b/composer/phpseclib/phpseclib/phpseclib/Exception/InconsistentSetupException.php deleted file mode 100644 index 8007118..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Exception/InconsistentSetupException.php +++ /dev/null @@ -1,23 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Exception; - -/** - * InconsistentSetupException - * - * @author Jim Wigginton - */ -class InconsistentSetupException extends \RuntimeException -{ -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Exception/InsufficientSetupException.php b/composer/phpseclib/phpseclib/phpseclib/Exception/InsufficientSetupException.php deleted file mode 100644 index 9c7f7c6..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Exception/InsufficientSetupException.php +++ /dev/null @@ -1,23 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Exception; - -/** - * InsufficientSetupException - * - * @author Jim Wigginton - */ -class InsufficientSetupException extends \RuntimeException -{ -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Exception/InvalidPacketLengthException.php b/composer/phpseclib/phpseclib/phpseclib/Exception/InvalidPacketLengthException.php deleted file mode 100644 index 9e4a40e..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Exception/InvalidPacketLengthException.php +++ /dev/null @@ -1,10 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Exception; - -/** - * NoKeyLoadedException - * - * @author Jim Wigginton - */ -class NoKeyLoadedException extends \RuntimeException -{ -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Exception/NoSupportedAlgorithmsException.php b/composer/phpseclib/phpseclib/phpseclib/Exception/NoSupportedAlgorithmsException.php deleted file mode 100644 index 4f7bd70..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Exception/NoSupportedAlgorithmsException.php +++ /dev/null @@ -1,23 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Exception; - -/** - * NoSupportedAlgorithmsException - * - * @author Jim Wigginton - */ -class NoSupportedAlgorithmsException extends \RuntimeException -{ -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Exception/TimeoutException.php b/composer/phpseclib/phpseclib/phpseclib/Exception/TimeoutException.php deleted file mode 100644 index b611203..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Exception/TimeoutException.php +++ /dev/null @@ -1,10 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Exception; - -/** - * UnableToConnectException - * - * @author Jim Wigginton - */ -class UnableToConnectException extends \RuntimeException -{ -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Exception/UnsupportedAlgorithmException.php b/composer/phpseclib/phpseclib/phpseclib/Exception/UnsupportedAlgorithmException.php deleted file mode 100644 index 02f1179..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Exception/UnsupportedAlgorithmException.php +++ /dev/null @@ -1,23 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Exception; - -/** - * UnsupportedAlgorithmException - * - * @author Jim Wigginton - */ -class UnsupportedAlgorithmException extends \RuntimeException -{ -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Exception/UnsupportedCurveException.php b/composer/phpseclib/phpseclib/phpseclib/Exception/UnsupportedCurveException.php deleted file mode 100644 index e2db084..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Exception/UnsupportedCurveException.php +++ /dev/null @@ -1,23 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Exception; - -/** - * UnsupportedCurveException - * - * @author Jim Wigginton - */ -class UnsupportedCurveException extends \RuntimeException -{ -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Exception/UnsupportedFormatException.php b/composer/phpseclib/phpseclib/phpseclib/Exception/UnsupportedFormatException.php deleted file mode 100644 index 0bb8295..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Exception/UnsupportedFormatException.php +++ /dev/null @@ -1,23 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Exception; - -/** - * UnsupportedFormatException - * - * @author Jim Wigginton - */ -class UnsupportedFormatException extends \RuntimeException -{ -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Exception/UnsupportedOperationException.php b/composer/phpseclib/phpseclib/phpseclib/Exception/UnsupportedOperationException.php deleted file mode 100644 index ea45645..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Exception/UnsupportedOperationException.php +++ /dev/null @@ -1,23 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Exception; - -/** - * UnsupportedOperationException - * - * @author Jim Wigginton - */ -class UnsupportedOperationException extends \RuntimeException -{ -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ANSI.php b/composer/phpseclib/phpseclib/phpseclib/File/ANSI.php deleted file mode 100644 index d47fec0..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ANSI.php +++ /dev/null @@ -1,551 +0,0 @@ - - * @copyright 2012 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File; - -/** - * Pure-PHP ANSI Decoder - * - * @author Jim Wigginton - */ -class ANSI -{ - /** - * Max Width - * - * @var int - */ - private $max_x; - - /** - * Max Height - * - * @var int - */ - private $max_y; - - /** - * Max History - * - * @var int - */ - private $max_history; - - /** - * History - * - * @var array - */ - private $history; - - /** - * History Attributes - * - * @var array - */ - private $history_attrs; - - /** - * Current Column - * - * @var int - */ - private $x; - - /** - * Current Row - * - * @var int - */ - private $y; - - /** - * Old Column - * - * @var int - */ - private $old_x; - - /** - * Old Row - * - * @var int - */ - private $old_y; - - /** - * An empty attribute cell - * - * @var object - */ - private $base_attr_cell; - - /** - * The current attribute cell - * - * @var object - */ - private $attr_cell; - - /** - * An empty attribute row - * - * @var array - */ - private $attr_row; - - /** - * The current screen text - * - * @var list - */ - private $screen; - - /** - * The current screen attributes - * - * @var array - */ - private $attrs; - - /** - * Current ANSI code - * - * @var string - */ - private $ansi; - - /** - * Tokenization - * - * @var array - */ - private $tokenization; - - /** - * Default Constructor. - * - * @return ANSI - */ - public function __construct() - { - $attr_cell = new \stdClass(); - $attr_cell->bold = false; - $attr_cell->underline = false; - $attr_cell->blink = false; - $attr_cell->background = 'black'; - $attr_cell->foreground = 'white'; - $attr_cell->reverse = false; - $this->base_attr_cell = clone $attr_cell; - $this->attr_cell = clone $attr_cell; - - $this->setHistory(200); - $this->setDimensions(80, 24); - } - - /** - * Set terminal width and height - * - * Resets the screen as well - * - * @param int $x - * @param int $y - */ - public function setDimensions($x, $y) - { - $this->max_x = $x - 1; - $this->max_y = $y - 1; - $this->x = $this->y = 0; - $this->history = $this->history_attrs = []; - $this->attr_row = array_fill(0, $this->max_x + 2, $this->base_attr_cell); - $this->screen = array_fill(0, $this->max_y + 1, ''); - $this->attrs = array_fill(0, $this->max_y + 1, $this->attr_row); - $this->ansi = ''; - } - - /** - * Set the number of lines that should be logged past the terminal height - * - * @param int $history - */ - public function setHistory($history) - { - $this->max_history = $history; - } - - /** - * Load a string - * - * @param string $source - */ - public function loadString($source) - { - $this->setDimensions($this->max_x + 1, $this->max_y + 1); - $this->appendString($source); - } - - /** - * Appdend a string - * - * @param string $source - */ - public function appendString($source) - { - $this->tokenization = ['']; - for ($i = 0; $i < strlen($source); $i++) { - if (strlen($this->ansi)) { - $this->ansi .= $source[$i]; - $chr = ord($source[$i]); - // http://en.wikipedia.org/wiki/ANSI_escape_code#Sequence_elements - // single character CSI's not currently supported - switch (true) { - case $this->ansi == "\x1B=": - $this->ansi = ''; - continue 2; - case strlen($this->ansi) == 2 && $chr >= 64 && $chr <= 95 && $chr != ord('['): - case strlen($this->ansi) > 2 && $chr >= 64 && $chr <= 126: - break; - default: - continue 2; - } - $this->tokenization[] = $this->ansi; - $this->tokenization[] = ''; - // http://ascii-table.com/ansi-escape-sequences-vt-100.php - switch ($this->ansi) { - case "\x1B[H": // Move cursor to upper left corner - $this->old_x = $this->x; - $this->old_y = $this->y; - $this->x = $this->y = 0; - break; - case "\x1B[J": // Clear screen from cursor down - $this->history = array_merge($this->history, array_slice(array_splice($this->screen, $this->y + 1), 0, $this->old_y)); - $this->screen = array_merge($this->screen, array_fill($this->y, $this->max_y, '')); - - $this->history_attrs = array_merge($this->history_attrs, array_slice(array_splice($this->attrs, $this->y + 1), 0, $this->old_y)); - $this->attrs = array_merge($this->attrs, array_fill($this->y, $this->max_y, $this->attr_row)); - - if (count($this->history) == $this->max_history) { - array_shift($this->history); - array_shift($this->history_attrs); - } - // fall-through - case "\x1B[K": // Clear screen from cursor right - $this->screen[$this->y] = substr($this->screen[$this->y], 0, $this->x); - - array_splice($this->attrs[$this->y], $this->x + 1, $this->max_x - $this->x, array_fill($this->x, $this->max_x - ($this->x - 1), $this->base_attr_cell)); - break; - case "\x1B[2K": // Clear entire line - $this->screen[$this->y] = str_repeat(' ', $this->x); - $this->attrs[$this->y] = $this->attr_row; - break; - case "\x1B[?1h": // set cursor key to application - case "\x1B[?25h": // show the cursor - case "\x1B(B": // set united states g0 character set - break; - case "\x1BE": // Move to next line - $this->newLine(); - $this->x = 0; - break; - default: - switch (true) { - case preg_match('#\x1B\[(\d+)B#', $this->ansi, $match): // Move cursor down n lines - $this->old_y = $this->y; - $this->y += (int) $match[1]; - break; - case preg_match('#\x1B\[(\d+);(\d+)H#', $this->ansi, $match): // Move cursor to screen location v,h - $this->old_x = $this->x; - $this->old_y = $this->y; - $this->x = $match[2] - 1; - $this->y = (int) $match[1] - 1; - break; - case preg_match('#\x1B\[(\d+)C#', $this->ansi, $match): // Move cursor right n lines - $this->old_x = $this->x; - $this->x += $match[1]; - break; - case preg_match('#\x1B\[(\d+)D#', $this->ansi, $match): // Move cursor left n lines - $this->old_x = $this->x; - $this->x -= $match[1]; - if ($this->x < 0) { - $this->x = 0; - } - break; - case preg_match('#\x1B\[(\d+);(\d+)r#', $this->ansi, $match): // Set top and bottom lines of a window - break; - case preg_match('#\x1B\[(\d*(?:;\d*)*)m#', $this->ansi, $match): // character attributes - $attr_cell = &$this->attr_cell; - $mods = explode(';', $match[1]); - foreach ($mods as $mod) { - switch ($mod) { - case '': - case '0': // Turn off character attributes - $attr_cell = clone $this->base_attr_cell; - break; - case '1': // Turn bold mode on - $attr_cell->bold = true; - break; - case '4': // Turn underline mode on - $attr_cell->underline = true; - break; - case '5': // Turn blinking mode on - $attr_cell->blink = true; - break; - case '7': // Turn reverse video on - $attr_cell->reverse = !$attr_cell->reverse; - $temp = $attr_cell->background; - $attr_cell->background = $attr_cell->foreground; - $attr_cell->foreground = $temp; - break; - default: // set colors - //$front = $attr_cell->reverse ? &$attr_cell->background : &$attr_cell->foreground; - $front = &$attr_cell->{ $attr_cell->reverse ? 'background' : 'foreground' }; - //$back = $attr_cell->reverse ? &$attr_cell->foreground : &$attr_cell->background; - $back = &$attr_cell->{ $attr_cell->reverse ? 'foreground' : 'background' }; - switch ($mod) { - // @codingStandardsIgnoreStart - case '30': $front = 'black'; break; - case '31': $front = 'red'; break; - case '32': $front = 'green'; break; - case '33': $front = 'yellow'; break; - case '34': $front = 'blue'; break; - case '35': $front = 'magenta'; break; - case '36': $front = 'cyan'; break; - case '37': $front = 'white'; break; - - case '40': $back = 'black'; break; - case '41': $back = 'red'; break; - case '42': $back = 'green'; break; - case '43': $back = 'yellow'; break; - case '44': $back = 'blue'; break; - case '45': $back = 'magenta'; break; - case '46': $back = 'cyan'; break; - case '47': $back = 'white'; break; - // @codingStandardsIgnoreEnd - - default: - //user_error('Unsupported attribute: ' . $mod); - $this->ansi = ''; - break 2; - } - } - } - break; - default: - //user_error("{$this->ansi} is unsupported\r\n"); - } - } - $this->ansi = ''; - continue; - } - - $this->tokenization[count($this->tokenization) - 1] .= $source[$i]; - switch ($source[$i]) { - case "\r": - $this->x = 0; - break; - case "\n": - $this->newLine(); - break; - case "\x08": // backspace - if ($this->x) { - $this->x--; - $this->attrs[$this->y][$this->x] = clone $this->base_attr_cell; - $this->screen[$this->y] = substr_replace( - $this->screen[$this->y], - $source[$i], - $this->x, - 1 - ); - } - break; - case "\x0F": // shift - break; - case "\x1B": // start ANSI escape code - $this->tokenization[count($this->tokenization) - 1] = substr($this->tokenization[count($this->tokenization) - 1], 0, -1); - //if (!strlen($this->tokenization[count($this->tokenization) - 1])) { - // array_pop($this->tokenization); - //} - $this->ansi .= "\x1B"; - break; - default: - $this->attrs[$this->y][$this->x] = clone $this->attr_cell; - if ($this->x > strlen($this->screen[$this->y])) { - $this->screen[$this->y] = str_repeat(' ', $this->x); - } - $this->screen[$this->y] = substr_replace( - $this->screen[$this->y], - $source[$i], - $this->x, - 1 - ); - - if ($this->x > $this->max_x) { - $this->x = 0; - $this->newLine(); - } else { - $this->x++; - } - } - } - } - - /** - * Add a new line - * - * Also update the $this->screen and $this->history buffers - * - */ - private function newLine() - { - //if ($this->y < $this->max_y) { - // $this->y++; - //} - - while ($this->y >= $this->max_y) { - $this->history = array_merge($this->history, [array_shift($this->screen)]); - $this->screen[] = ''; - - $this->history_attrs = array_merge($this->history_attrs, [array_shift($this->attrs)]); - $this->attrs[] = $this->attr_row; - - if (count($this->history) >= $this->max_history) { - array_shift($this->history); - array_shift($this->history_attrs); - } - - $this->y--; - } - $this->y++; - } - - /** - * Returns the current coordinate without preformating - * - * @param \stdClass $last_attr - * @param \stdClass $cur_attr - * @param string $char - * @return string - */ - private function processCoordinate(\stdClass $last_attr, \stdClass $cur_attr, $char) - { - $output = ''; - - if ($last_attr != $cur_attr) { - $close = $open = ''; - if ($last_attr->foreground != $cur_attr->foreground) { - if ($cur_attr->foreground != 'white') { - $open .= ''; - } - if ($last_attr->foreground != 'white') { - $close = '' . $close; - } - } - if ($last_attr->background != $cur_attr->background) { - if ($cur_attr->background != 'black') { - $open .= ''; - } - if ($last_attr->background != 'black') { - $close = '' . $close; - } - } - if ($last_attr->bold != $cur_attr->bold) { - if ($cur_attr->bold) { - $open .= ''; - } else { - $close = '' . $close; - } - } - if ($last_attr->underline != $cur_attr->underline) { - if ($cur_attr->underline) { - $open .= ''; - } else { - $close = '' . $close; - } - } - if ($last_attr->blink != $cur_attr->blink) { - if ($cur_attr->blink) { - $open .= ''; - } else { - $close = '' . $close; - } - } - $output .= $close . $open; - } - - $output .= htmlspecialchars($char); - - return $output; - } - - /** - * Returns the current screen without preformating - * - * @return string - */ - private function getScreenHelper() - { - $output = ''; - $last_attr = $this->base_attr_cell; - for ($i = 0; $i <= $this->max_y; $i++) { - for ($j = 0; $j <= $this->max_x; $j++) { - $cur_attr = $this->attrs[$i][$j]; - $output .= $this->processCoordinate($last_attr, $cur_attr, isset($this->screen[$i][$j]) ? $this->screen[$i][$j] : ''); - $last_attr = $this->attrs[$i][$j]; - } - $output .= "\r\n"; - } - $output = substr($output, 0, -2); - // close any remaining open tags - $output .= $this->processCoordinate($last_attr, $this->base_attr_cell, ''); - return rtrim($output); - } - - /** - * Returns the current screen - * - * @return string - */ - public function getScreen() - { - return '
' . $this->getScreenHelper() . '
'; - } - - /** - * Returns the current screen and the x previous lines - * - * @return string - */ - public function getHistory() - { - $scrollback = ''; - $last_attr = $this->base_attr_cell; - for ($i = 0; $i < count($this->history); $i++) { - for ($j = 0; $j <= $this->max_x + 1; $j++) { - $cur_attr = $this->history_attrs[$i][$j]; - $scrollback .= $this->processCoordinate($last_attr, $cur_attr, isset($this->history[$i][$j]) ? $this->history[$i][$j] : ''); - $last_attr = $this->history_attrs[$i][$j]; - } - $scrollback .= "\r\n"; - } - $base_attr_cell = $this->base_attr_cell; - $this->base_attr_cell = $last_attr; - $scrollback .= $this->getScreen(); - $this->base_attr_cell = $base_attr_cell; - - return '
' . $scrollback . '
'; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1.php deleted file mode 100644 index ad9770b..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1.php +++ /dev/null @@ -1,1530 +0,0 @@ - - * @copyright 2012 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File; - -use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; -use OCA\Libresign\Vendor\phpseclib3\File\ASN1\Element; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * Pure-PHP ASN.1 Parser - * - * @author Jim Wigginton - */ -abstract class ASN1 -{ - // Tag Classes - // http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#page=12 - const CLASS_UNIVERSAL = 0; - const CLASS_APPLICATION = 1; - const CLASS_CONTEXT_SPECIFIC = 2; - const CLASS_PRIVATE = 3; - - // Tag Classes - // http://www.obj-sys.com/asn1tutorial/node124.html - const TYPE_BOOLEAN = 1; - const TYPE_INTEGER = 2; - const TYPE_BIT_STRING = 3; - const TYPE_OCTET_STRING = 4; - const TYPE_NULL = 5; - const TYPE_OBJECT_IDENTIFIER = 6; - //const TYPE_OBJECT_DESCRIPTOR = 7; - //const TYPE_INSTANCE_OF = 8; // EXTERNAL - const TYPE_REAL = 9; - const TYPE_ENUMERATED = 10; - //const TYPE_EMBEDDED = 11; - const TYPE_UTF8_STRING = 12; - //const TYPE_RELATIVE_OID = 13; - const TYPE_SEQUENCE = 16; // SEQUENCE OF - const TYPE_SET = 17; // SET OF - - // More Tag Classes - // http://www.obj-sys.com/asn1tutorial/node10.html - const TYPE_NUMERIC_STRING = 18; - const TYPE_PRINTABLE_STRING = 19; - const TYPE_TELETEX_STRING = 20; // T61String - const TYPE_VIDEOTEX_STRING = 21; - const TYPE_IA5_STRING = 22; - const TYPE_UTC_TIME = 23; - const TYPE_GENERALIZED_TIME = 24; - const TYPE_GRAPHIC_STRING = 25; - const TYPE_VISIBLE_STRING = 26; // ISO646String - const TYPE_GENERAL_STRING = 27; - const TYPE_UNIVERSAL_STRING = 28; - //const TYPE_CHARACTER_STRING = 29; - const TYPE_BMP_STRING = 30; - - // Tag Aliases - // These tags are kinda place holders for other tags. - const TYPE_CHOICE = -1; - const TYPE_ANY = -2; - - /** - * ASN.1 object identifiers - * - * @var array - * @link http://en.wikipedia.org/wiki/Object_identifier - */ - private static $oids = []; - - /** - * ASN.1 object identifier reverse mapping - * - * @var array - */ - private static $reverseOIDs = []; - - /** - * Default date format - * - * @var string - * @link http://php.net/class.datetime - */ - private static $format = 'D, d M Y H:i:s O'; - - /** - * Filters - * - * If the mapping type is self::TYPE_ANY what do we actually encode it as? - * - * @var array - * @see self::encode_der() - */ - private static $filters; - - /** - * Current Location of most recent ASN.1 encode process - * - * Useful for debug purposes - * - * @var array - * @see self::encode_der() - */ - private static $location; - - /** - * DER Encoded String - * - * In case we need to create ASN1\Element object's.. - * - * @var string - * @see self::decodeDER() - */ - private static $encoded; - - /** - * Type mapping table for the ANY type. - * - * Structured or unknown types are mapped to a \phpseclib3\File\ASN1\Element. - * Unambiguous types get the direct mapping (int/real/bool). - * Others are mapped as a choice, with an extra indexing level. - * - * @var array - */ - const ANY_MAP = [ - self::TYPE_BOOLEAN => true, - self::TYPE_INTEGER => true, - self::TYPE_BIT_STRING => 'bitString', - self::TYPE_OCTET_STRING => 'octetString', - self::TYPE_NULL => 'null', - self::TYPE_OBJECT_IDENTIFIER => 'objectIdentifier', - self::TYPE_REAL => true, - self::TYPE_ENUMERATED => 'enumerated', - self::TYPE_UTF8_STRING => 'utf8String', - self::TYPE_NUMERIC_STRING => 'numericString', - self::TYPE_PRINTABLE_STRING => 'printableString', - self::TYPE_TELETEX_STRING => 'teletexString', - self::TYPE_VIDEOTEX_STRING => 'videotexString', - self::TYPE_IA5_STRING => 'ia5String', - self::TYPE_UTC_TIME => 'utcTime', - self::TYPE_GENERALIZED_TIME => 'generalTime', - self::TYPE_GRAPHIC_STRING => 'graphicString', - self::TYPE_VISIBLE_STRING => 'visibleString', - self::TYPE_GENERAL_STRING => 'generalString', - self::TYPE_UNIVERSAL_STRING => 'universalString', - //self::TYPE_CHARACTER_STRING => 'characterString', - self::TYPE_BMP_STRING => 'bmpString' - ]; - - /** - * String type to character size mapping table. - * - * Non-convertable types are absent from this table. - * size == 0 indicates variable length encoding. - * - * @var array - */ - const STRING_TYPE_SIZE = [ - self::TYPE_UTF8_STRING => 0, - self::TYPE_BMP_STRING => 2, - self::TYPE_UNIVERSAL_STRING => 4, - self::TYPE_PRINTABLE_STRING => 1, - self::TYPE_TELETEX_STRING => 1, - self::TYPE_IA5_STRING => 1, - self::TYPE_VISIBLE_STRING => 1, - ]; - - /** - * Parse BER-encoding - * - * Serves a similar purpose to openssl's asn1parse - * - * @param Element|string $encoded - * @return ?array - */ - public static function decodeBER($encoded) - { - if ($encoded instanceof Element) { - $encoded = $encoded->element; - } - - self::$encoded = $encoded; - - $decoded = self::decode_ber($encoded); - if ($decoded === false) { - return null; - } - - return [$decoded]; - } - - /** - * Parse BER-encoding (Helper function) - * - * Sometimes we want to get the BER encoding of a particular tag. $start lets us do that without having to reencode. - * $encoded is passed by reference for the recursive calls done for self::TYPE_BIT_STRING and - * self::TYPE_OCTET_STRING. In those cases, the indefinite length is used. - * - * @param string $encoded - * @param int $start - * @param int $encoded_pos - * @return array|bool - */ - private static function decode_ber($encoded, $start = 0, $encoded_pos = 0) - { - $current = ['start' => $start]; - - if (!isset($encoded[$encoded_pos])) { - return false; - } - $type = ord($encoded[$encoded_pos++]); - $startOffset = 1; - - $constructed = ($type >> 5) & 1; - - $tag = $type & 0x1F; - if ($tag == 0x1F) { - $tag = 0; - // process septets (since the eighth bit is ignored, it's not an octet) - do { - if (!isset($encoded[$encoded_pos])) { - return false; - } - $temp = ord($encoded[$encoded_pos++]); - $startOffset++; - $loop = $temp >> 7; - $tag <<= 7; - $temp &= 0x7F; - // "bits 7 to 1 of the first subsequent octet shall not all be zero" - if ($startOffset == 2 && $temp == 0) { - return false; - } - $tag |= $temp; - } while ($loop); - } - - $start += $startOffset; - - // Length, as discussed in paragraph 8.1.3 of X.690-0207.pdf#page=13 - if (!isset($encoded[$encoded_pos])) { - return false; - } - $length = ord($encoded[$encoded_pos++]); - $start++; - if ($length == 0x80) { // indefinite length - // "[A sender shall] use the indefinite form (see 8.1.3.6) if the encoding is constructed and is not all - // immediately available." -- paragraph 8.1.3.2.c - $length = strlen($encoded) - $encoded_pos; - } elseif ($length & 0x80) { // definite length, long form - // technically, the long form of the length can be represented by up to 126 octets (bytes), but we'll only - // support it up to four. - $length &= 0x7F; - $temp = substr($encoded, $encoded_pos, $length); - $encoded_pos += $length; - // tags of indefinte length don't really have a header length; this length includes the tag - $current += ['headerlength' => $length + 2]; - $start += $length; - $length = unpack('Nlength', substr(str_pad($temp, 4, chr(0), STR_PAD_LEFT), -4))['length']; - } else { - $current += ['headerlength' => 2]; - } - - if ($length > (strlen($encoded) - $encoded_pos)) { - return false; - } - - $content = substr($encoded, $encoded_pos, $length); - $content_pos = 0; - - // at this point $length can be overwritten. it's only accurate for definite length things as is - - /* Class is UNIVERSAL, APPLICATION, PRIVATE, or CONTEXT-SPECIFIC. The UNIVERSAL class is restricted to the ASN.1 - built-in types. It defines an application-independent data type that must be distinguishable from all other - data types. The other three classes are user defined. The APPLICATION class distinguishes data types that - have a wide, scattered use within a particular presentation context. PRIVATE distinguishes data types within - a particular organization or country. CONTEXT-SPECIFIC distinguishes members of a sequence or set, the - alternatives of a CHOICE, or universally tagged set members. Only the class number appears in braces for this - data type; the term CONTEXT-SPECIFIC does not appear. - - -- http://www.obj-sys.com/asn1tutorial/node12.html */ - $class = ($type >> 6) & 3; - switch ($class) { - case self::CLASS_APPLICATION: - case self::CLASS_PRIVATE: - case self::CLASS_CONTEXT_SPECIFIC: - if (!$constructed) { - return [ - 'type' => $class, - 'constant' => $tag, - 'content' => $content, - 'length' => $length + $start - $current['start'] - ] + $current; - } - - $newcontent = []; - $remainingLength = $length; - while ($remainingLength > 0) { - $temp = self::decode_ber($content, $start, $content_pos); - if ($temp === false) { - break; - } - $length = $temp['length']; - // end-of-content octets - see paragraph 8.1.5 - if (substr($content, $content_pos + $length, 2) == "\0\0") { - $length += 2; - $start += $length; - $newcontent[] = $temp; - break; - } - $start += $length; - $remainingLength -= $length; - $newcontent[] = $temp; - $content_pos += $length; - } - - return [ - 'type' => $class, - 'constant' => $tag, - // the array encapsulation is for BC with the old format - 'content' => $newcontent, - // the only time when $content['headerlength'] isn't defined is when the length is indefinite. - // the absence of $content['headerlength'] is how we know if something is indefinite or not. - // technically, it could be defined to be 2 and then another indicator could be used but whatever. - 'length' => $start - $current['start'] - ] + $current; - } - - $current += ['type' => $tag]; - - // decode UNIVERSAL tags - switch ($tag) { - case self::TYPE_BOOLEAN: - // "The contents octets shall consist of a single octet." -- paragraph 8.2.1 - if ($constructed || strlen($content) != 1) { - return false; - } - $current['content'] = (bool) ord($content[$content_pos]); - break; - case self::TYPE_INTEGER: - case self::TYPE_ENUMERATED: - if ($constructed) { - return false; - } - $current['content'] = new BigInteger(substr($content, $content_pos), -256); - break; - case self::TYPE_REAL: // not currently supported - return false; - case self::TYPE_BIT_STRING: - // The initial octet shall encode, as an unsigned binary integer with bit 1 as the least significant bit, - // the number of unused bits in the final subsequent octet. The number shall be in the range zero to - // seven. - if (!$constructed) { - $current['content'] = substr($content, $content_pos); - } else { - $temp = self::decode_ber($content, $start, $content_pos); - if ($temp === false) { - return false; - } - $length -= (strlen($content) - $content_pos); - $last = count($temp) - 1; - for ($i = 0; $i < $last; $i++) { - // all subtags should be bit strings - if ($temp[$i]['type'] != self::TYPE_BIT_STRING) { - return false; - } - $current['content'] .= substr($temp[$i]['content'], 1); - } - // all subtags should be bit strings - if ($temp[$last]['type'] != self::TYPE_BIT_STRING) { - return false; - } - $current['content'] = $temp[$last]['content'][0] . $current['content'] . substr($temp[$i]['content'], 1); - } - break; - case self::TYPE_OCTET_STRING: - if (!$constructed) { - $current['content'] = substr($content, $content_pos); - } else { - $current['content'] = ''; - $length = 0; - while (substr($content, $content_pos, 2) != "\0\0") { - $temp = self::decode_ber($content, $length + $start, $content_pos); - if ($temp === false) { - return false; - } - $content_pos += $temp['length']; - // all subtags should be octet strings - if ($temp['type'] != self::TYPE_OCTET_STRING) { - return false; - } - $current['content'] .= $temp['content']; - $length += $temp['length']; - } - if (substr($content, $content_pos, 2) == "\0\0") { - $length += 2; // +2 for the EOC - } - } - break; - case self::TYPE_NULL: - // "The contents octets shall not contain any octets." -- paragraph 8.8.2 - if ($constructed || strlen($content)) { - return false; - } - break; - case self::TYPE_SEQUENCE: - case self::TYPE_SET: - if (!$constructed) { - return false; - } - $offset = 0; - $current['content'] = []; - $content_len = strlen($content); - while ($content_pos < $content_len) { - // if indefinite length construction was used and we have an end-of-content string next - // see paragraphs 8.1.1.3, 8.1.3.2, 8.1.3.6, 8.1.5, and (for an example) 8.6.4.2 - if (!isset($current['headerlength']) && substr($content, $content_pos, 2) == "\0\0") { - $length = $offset + 2; // +2 for the EOC - break 2; - } - $temp = self::decode_ber($content, $start + $offset, $content_pos); - if ($temp === false) { - return false; - } - $content_pos += $temp['length']; - $current['content'][] = $temp; - $offset += $temp['length']; - } - break; - case self::TYPE_OBJECT_IDENTIFIER: - if ($constructed) { - return false; - } - $current['content'] = self::decodeOID(substr($content, $content_pos)); - if ($current['content'] === false) { - return false; - } - break; - /* Each character string type shall be encoded as if it had been declared: - [UNIVERSAL x] IMPLICIT OCTET STRING - - -- X.690-0207.pdf#page=23 (paragraph 8.21.3) - - Per that, we're not going to do any validation. If there are any illegal characters in the string, - we don't really care */ - case self::TYPE_NUMERIC_STRING: - // 0,1,2,3,4,5,6,7,8,9, and space - case self::TYPE_PRINTABLE_STRING: - // Upper and lower case letters, digits, space, apostrophe, left/right parenthesis, plus sign, comma, - // hyphen, full stop, solidus, colon, equal sign, question mark - case self::TYPE_TELETEX_STRING: - // The Teletex character set in CCITT's T61, space, and delete - // see http://en.wikipedia.org/wiki/Teletex#Character_sets - case self::TYPE_VIDEOTEX_STRING: - // The Videotex character set in CCITT's T.100 and T.101, space, and delete - case self::TYPE_VISIBLE_STRING: - // Printing character sets of international ASCII, and space - case self::TYPE_IA5_STRING: - // International Alphabet 5 (International ASCII) - case self::TYPE_GRAPHIC_STRING: - // All registered G sets, and space - case self::TYPE_GENERAL_STRING: - // All registered C and G sets, space and delete - case self::TYPE_UTF8_STRING: - // ???? - case self::TYPE_BMP_STRING: - if ($constructed) { - return false; - } - $current['content'] = substr($content, $content_pos); - break; - case self::TYPE_UTC_TIME: - case self::TYPE_GENERALIZED_TIME: - if ($constructed) { - return false; - } - $current['content'] = self::decodeTime(substr($content, $content_pos), $tag); - break; - default: - return false; - } - - $start += $length; - - // ie. length is the length of the full TLV encoding - it's not just the length of the value - return $current + ['length' => $start - $current['start']]; - } - - /** - * ASN.1 Map - * - * Provides an ASN.1 semantic mapping ($mapping) from a parsed BER-encoding to a human readable format. - * - * "Special" mappings may be applied on a per tag-name basis via $special. - * - * @param array $decoded - * @param array $mapping - * @param array $special - * @return array|bool|Element|string|null - */ - public static function asn1map(array $decoded, $mapping, $special = []) - { - if (isset($mapping['explicit']) && is_array($decoded['content'])) { - $decoded = $decoded['content'][0]; - } - - switch (true) { - case $mapping['type'] == self::TYPE_ANY: - $intype = $decoded['type']; - // !isset(self::ANY_MAP[$intype]) produces a fatal error on PHP 5.6 - if (isset($decoded['constant']) || !array_key_exists($intype, self::ANY_MAP) || (ord(self::$encoded[$decoded['start']]) & 0x20)) { - return new Element(substr(self::$encoded, $decoded['start'], $decoded['length'])); - } - $inmap = self::ANY_MAP[$intype]; - if (is_string($inmap)) { - return [$inmap => self::asn1map($decoded, ['type' => $intype] + $mapping, $special)]; - } - break; - case $mapping['type'] == self::TYPE_CHOICE: - foreach ($mapping['children'] as $key => $option) { - switch (true) { - case isset($option['constant']) && $option['constant'] == $decoded['constant']: - case !isset($option['constant']) && $option['type'] == $decoded['type']: - $value = self::asn1map($decoded, $option, $special); - break; - case !isset($option['constant']) && $option['type'] == self::TYPE_CHOICE: - $v = self::asn1map($decoded, $option, $special); - if (isset($v)) { - $value = $v; - } - } - if (isset($value)) { - if (isset($special[$key])) { - $value = $special[$key]($value); - } - return [$key => $value]; - } - } - return null; - case isset($mapping['implicit']): - case isset($mapping['explicit']): - case $decoded['type'] == $mapping['type']: - break; - default: - // if $decoded['type'] and $mapping['type'] are both strings, but different types of strings, - // let it through - switch (true) { - case $decoded['type'] < 18: // self::TYPE_NUMERIC_STRING == 18 - case $decoded['type'] > 30: // self::TYPE_BMP_STRING == 30 - case $mapping['type'] < 18: - case $mapping['type'] > 30: - return null; - } - } - - if (isset($mapping['implicit'])) { - $decoded['type'] = $mapping['type']; - } - - switch ($decoded['type']) { - case self::TYPE_SEQUENCE: - $map = []; - - // ignore the min and max - if (isset($mapping['min']) && isset($mapping['max'])) { - $child = $mapping['children']; - foreach ($decoded['content'] as $content) { - if (($map[] = self::asn1map($content, $child, $special)) === null) { - return null; - } - } - - return $map; - } - - $n = count($decoded['content']); - $i = 0; - - foreach ($mapping['children'] as $key => $child) { - $maymatch = $i < $n; // Match only existing input. - if ($maymatch) { - $temp = $decoded['content'][$i]; - - if ($child['type'] != self::TYPE_CHOICE) { - // Get the mapping and input class & constant. - $childClass = $tempClass = self::CLASS_UNIVERSAL; - $constant = null; - if (isset($temp['constant'])) { - $tempClass = $temp['type']; - } - if (isset($child['class'])) { - $childClass = $child['class']; - $constant = $child['cast']; - } elseif (isset($child['constant'])) { - $childClass = self::CLASS_CONTEXT_SPECIFIC; - $constant = $child['constant']; - } - - if (isset($constant) && isset($temp['constant'])) { - // Can only match if constants and class match. - $maymatch = $constant == $temp['constant'] && $childClass == $tempClass; - } else { - // Can only match if no constant expected and type matches or is generic. - $maymatch = !isset($child['constant']) && array_search($child['type'], [$temp['type'], self::TYPE_ANY, self::TYPE_CHOICE]) !== false; - } - } - } - - if ($maymatch) { - // Attempt submapping. - $candidate = self::asn1map($temp, $child, $special); - $maymatch = $candidate !== null; - } - - if ($maymatch) { - // Got the match: use it. - if (isset($special[$key])) { - $candidate = $special[$key]($candidate); - } - $map[$key] = $candidate; - $i++; - } elseif (isset($child['default'])) { - $map[$key] = $child['default']; - } elseif (!isset($child['optional'])) { - return null; // Syntax error. - } - } - - // Fail mapping if all input items have not been consumed. - return $i < $n ? null : $map; - - // the main diff between sets and sequences is the encapsulation of the foreach in another for loop - case self::TYPE_SET: - $map = []; - - // ignore the min and max - if (isset($mapping['min']) && isset($mapping['max'])) { - $child = $mapping['children']; - foreach ($decoded['content'] as $content) { - if (($map[] = self::asn1map($content, $child, $special)) === null) { - return null; - } - } - - return $map; - } - - for ($i = 0; $i < count($decoded['content']); $i++) { - $temp = $decoded['content'][$i]; - $tempClass = self::CLASS_UNIVERSAL; - if (isset($temp['constant'])) { - $tempClass = $temp['type']; - } - - foreach ($mapping['children'] as $key => $child) { - if (isset($map[$key])) { - continue; - } - $maymatch = true; - if ($child['type'] != self::TYPE_CHOICE) { - $childClass = self::CLASS_UNIVERSAL; - $constant = null; - if (isset($child['class'])) { - $childClass = $child['class']; - $constant = $child['cast']; - } elseif (isset($child['constant'])) { - $childClass = self::CLASS_CONTEXT_SPECIFIC; - $constant = $child['constant']; - } - - if (isset($constant) && isset($temp['constant'])) { - // Can only match if constants and class match. - $maymatch = $constant == $temp['constant'] && $childClass == $tempClass; - } else { - // Can only match if no constant expected and type matches or is generic. - $maymatch = !isset($child['constant']) && array_search($child['type'], [$temp['type'], self::TYPE_ANY, self::TYPE_CHOICE]) !== false; - } - } - - if ($maymatch) { - // Attempt submapping. - $candidate = self::asn1map($temp, $child, $special); - $maymatch = $candidate !== null; - } - - if (!$maymatch) { - break; - } - - // Got the match: use it. - if (isset($special[$key])) { - $candidate = $special[$key]($candidate); - } - $map[$key] = $candidate; - break; - } - } - - foreach ($mapping['children'] as $key => $child) { - if (!isset($map[$key])) { - if (isset($child['default'])) { - $map[$key] = $child['default']; - } elseif (!isset($child['optional'])) { - return null; - } - } - } - return $map; - case self::TYPE_OBJECT_IDENTIFIER: - return isset(self::$oids[$decoded['content']]) ? self::$oids[$decoded['content']] : $decoded['content']; - case self::TYPE_UTC_TIME: - case self::TYPE_GENERALIZED_TIME: - // for explicitly tagged optional stuff - if (is_array($decoded['content'])) { - $decoded['content'] = $decoded['content'][0]['content']; - } - // for implicitly tagged optional stuff - // in theory, doing isset($mapping['implicit']) would work but malformed certs do exist - // in the wild that OpenSSL decodes without issue so we'll support them as well - if (!is_object($decoded['content'])) { - $decoded['content'] = self::decodeTime($decoded['content'], $decoded['type']); - } - return $decoded['content'] ? $decoded['content']->format(self::$format) : false; - case self::TYPE_BIT_STRING: - if (isset($mapping['mapping'])) { - $offset = ord($decoded['content'][0]); - $size = (strlen($decoded['content']) - 1) * 8 - $offset; - /* - From X.680-0207.pdf#page=46 (21.7): - - "When a "NamedBitList" is used in defining a bitstring type ASN.1 encoding rules are free to add (or remove) - arbitrarily any trailing 0 bits to (or from) values that are being encoded or decoded. Application designers should - therefore ensure that different semantics are not associated with such values which differ only in the number of trailing - 0 bits." - */ - $bits = count($mapping['mapping']) == $size ? [] : array_fill(0, count($mapping['mapping']) - $size, false); - for ($i = strlen($decoded['content']) - 1; $i > 0; $i--) { - $current = ord($decoded['content'][$i]); - for ($j = $offset; $j < 8; $j++) { - $bits[] = (bool) ($current & (1 << $j)); - } - $offset = 0; - } - $values = []; - $map = array_reverse($mapping['mapping']); - foreach ($map as $i => $value) { - if ($bits[$i]) { - $values[] = $value; - } - } - return $values; - } - // fall-through - case self::TYPE_OCTET_STRING: - return $decoded['content']; - case self::TYPE_NULL: - return ''; - case self::TYPE_BOOLEAN: - case self::TYPE_NUMERIC_STRING: - case self::TYPE_PRINTABLE_STRING: - case self::TYPE_TELETEX_STRING: - case self::TYPE_VIDEOTEX_STRING: - case self::TYPE_IA5_STRING: - case self::TYPE_GRAPHIC_STRING: - case self::TYPE_VISIBLE_STRING: - case self::TYPE_GENERAL_STRING: - case self::TYPE_UNIVERSAL_STRING: - case self::TYPE_UTF8_STRING: - case self::TYPE_BMP_STRING: - return $decoded['content']; - case self::TYPE_INTEGER: - case self::TYPE_ENUMERATED: - $temp = $decoded['content']; - if (isset($mapping['implicit'])) { - $temp = new BigInteger($decoded['content'], -256); - } - if (isset($mapping['mapping'])) { - $temp = $temp->toString(); - if (strlen($temp) > 1) { - return false; - } - $temp = (int) $temp; - return isset($mapping['mapping'][$temp]) ? - $mapping['mapping'][$temp] : - false; - } - return $temp; - } - } - - /** - * DER-decode the length - * - * DER supports lengths up to (2**8)**127, however, we'll only support lengths up to (2**8)**4. See - * {@link http://itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#p=13 X.690 paragraph 8.1.3} for more information. - * - * @param string $string - * @return int - */ - public static function decodeLength(&$string) - { - $length = ord(Strings::shift($string)); - if ($length & 0x80) { // definite length, long form - $length &= 0x7F; - $temp = Strings::shift($string, $length); - list(, $length) = unpack('N', substr(str_pad($temp, 4, chr(0), STR_PAD_LEFT), -4)); - } - return $length; - } - - /** - * ASN.1 Encode - * - * DER-encodes an ASN.1 semantic mapping ($mapping). Some libraries would probably call this function - * an ASN.1 compiler. - * - * "Special" mappings can be applied via $special. - * - * @param Element|string|array $source - * @param array $mapping - * @param array $special - * @return string - */ - public static function encodeDER($source, $mapping, $special = []) - { - self::$location = []; - return self::encode_der($source, $mapping, null, $special); - } - - /** - * ASN.1 Encode (Helper function) - * - * @param Element|string|array|null $source - * @param array $mapping - * @param int $idx - * @param array $special - * @return string - */ - private static function encode_der($source, array $mapping, $idx = null, array $special = []) - { - if ($source instanceof Element) { - return $source->element; - } - - // do not encode (implicitly optional) fields with value set to default - if (isset($mapping['default']) && $source === $mapping['default']) { - return ''; - } - - if (isset($idx)) { - if (isset($special[$idx])) { - $source = $special[$idx]($source); - } - self::$location[] = $idx; - } - - $tag = $mapping['type']; - - switch ($tag) { - case self::TYPE_SET: // Children order is not important, thus process in sequence. - case self::TYPE_SEQUENCE: - $tag |= 0x20; // set the constructed bit - - // ignore the min and max - if (isset($mapping['min']) && isset($mapping['max'])) { - $value = []; - $child = $mapping['children']; - - foreach ($source as $content) { - $temp = self::encode_der($content, $child, null, $special); - if ($temp === false) { - return false; - } - $value[] = $temp; - } - /* "The encodings of the component values of a set-of value shall appear in ascending order, the encodings being compared - as octet strings with the shorter components being padded at their trailing end with 0-octets. - NOTE - The padding octets are for comparison purposes only and do not appear in the encodings." - - -- sec 11.6 of http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf */ - if ($mapping['type'] == self::TYPE_SET) { - sort($value); - } - $value = implode('', $value); - break; - } - - $value = ''; - foreach ($mapping['children'] as $key => $child) { - if (!array_key_exists($key, $source)) { - if (!isset($child['optional'])) { - return false; - } - continue; - } - - $temp = self::encode_der($source[$key], $child, $key, $special); - if ($temp === false) { - return false; - } - - // An empty child encoding means it has been optimized out. - // Else we should have at least one tag byte. - if ($temp === '') { - continue; - } - - // if isset($child['constant']) is true then isset($child['optional']) should be true as well - if (isset($child['constant'])) { - /* - From X.680-0207.pdf#page=58 (30.6): - - "The tagging construction specifies explicit tagging if any of the following holds: - ... - c) the "Tag Type" alternative is used and the value of "TagDefault" for the module is IMPLICIT TAGS or - AUTOMATIC TAGS, but the type defined by "Type" is an untagged choice type, an untagged open type, or - an untagged "DummyReference" (see ITU-T Rec. X.683 | ISO/IEC 8824-4, 8.3)." - */ - if (isset($child['explicit']) || $child['type'] == self::TYPE_CHOICE) { - if ($child['constant'] <= 30) { - $subtag = chr((self::CLASS_CONTEXT_SPECIFIC << 6) | 0x20 | $child['constant']); - } else { - $constant = $child['constant']; - $subtag = ''; - while ($constant > 0) { - $subtagvalue = $constant & 0x7F; - $subtag = (chr(0x80 | $subtagvalue)) . $subtag; - $constant = $constant >> 7; - } - $subtag[strlen($subtag) - 1] = $subtag[strlen($subtag) - 1] & chr(0x7F); - $subtag = chr((self::CLASS_CONTEXT_SPECIFIC << 6) | 0x20 | 0x1f) . $subtag; - } - $temp = $subtag . self::encodeLength(strlen($temp)) . $temp; - } else { - $subtag = chr((self::CLASS_CONTEXT_SPECIFIC << 6) | (ord($temp[0]) & 0x20) | $child['constant']); - $temp = $subtag . substr($temp, 1); - } - } - $value .= $temp; - } - break; - case self::TYPE_CHOICE: - $temp = false; - - foreach ($mapping['children'] as $key => $child) { - if (!isset($source[$key])) { - continue; - } - - $temp = self::encode_der($source[$key], $child, $key, $special); - if ($temp === false) { - return false; - } - - // An empty child encoding means it has been optimized out. - // Else we should have at least one tag byte. - if ($temp === '') { - continue; - } - - $tag = ord($temp[0]); - - // if isset($child['constant']) is true then isset($child['optional']) should be true as well - if (isset($child['constant'])) { - if (isset($child['explicit']) || $child['type'] == self::TYPE_CHOICE) { - $subtag = chr((self::CLASS_CONTEXT_SPECIFIC << 6) | 0x20 | $child['constant']); - $temp = $subtag . self::encodeLength(strlen($temp)) . $temp; - } else { - $subtag = chr((self::CLASS_CONTEXT_SPECIFIC << 6) | (ord($temp[0]) & 0x20) | $child['constant']); - $temp = $subtag . substr($temp, 1); - } - } - } - - if (isset($idx)) { - array_pop(self::$location); - } - - if ($temp && isset($mapping['cast'])) { - $temp[0] = chr(($mapping['class'] << 6) | ($tag & 0x20) | $mapping['cast']); - } - - return $temp; - case self::TYPE_INTEGER: - case self::TYPE_ENUMERATED: - if (!isset($mapping['mapping'])) { - if (is_numeric($source)) { - $source = new BigInteger($source); - } - $value = $source->toBytes(true); - } else { - $value = array_search($source, $mapping['mapping']); - if ($value === false) { - return false; - } - $value = new BigInteger($value); - $value = $value->toBytes(true); - } - if (!strlen($value)) { - $value = chr(0); - } - break; - case self::TYPE_UTC_TIME: - case self::TYPE_GENERALIZED_TIME: - $format = $mapping['type'] == self::TYPE_UTC_TIME ? 'y' : 'Y'; - $format .= 'mdHis'; - // if $source does _not_ include timezone information within it then assume that the timezone is GMT - $date = new \DateTime($source, new \DateTimeZone('GMT')); - // if $source _does_ include timezone information within it then convert the time to GMT - $date->setTimezone(new \DateTimeZone('GMT')); - $value = $date->format($format) . 'Z'; - break; - case self::TYPE_BIT_STRING: - if (isset($mapping['mapping'])) { - $bits = array_fill(0, count($mapping['mapping']), 0); - $size = 0; - for ($i = 0; $i < count($mapping['mapping']); $i++) { - if (in_array($mapping['mapping'][$i], $source)) { - $bits[$i] = 1; - $size = $i; - } - } - - if (isset($mapping['min']) && $mapping['min'] >= 1 && $size < $mapping['min']) { - $size = $mapping['min'] - 1; - } - - $offset = 8 - (($size + 1) & 7); - $offset = $offset !== 8 ? $offset : 0; - - $value = chr($offset); - - for ($i = $size + 1; $i < count($mapping['mapping']); $i++) { - unset($bits[$i]); - } - - $bits = implode('', array_pad($bits, $size + $offset + 1, 0)); - $bytes = explode(' ', rtrim(chunk_split($bits, 8, ' '))); - foreach ($bytes as $byte) { - $value .= chr(bindec($byte)); - } - - break; - } - // fall-through - case self::TYPE_OCTET_STRING: - /* The initial octet shall encode, as an unsigned binary integer with bit 1 as the least significant bit, - the number of unused bits in the final subsequent octet. The number shall be in the range zero to seven. - - -- http://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#page=16 */ - $value = $source; - break; - case self::TYPE_OBJECT_IDENTIFIER: - $value = self::encodeOID($source); - break; - case self::TYPE_ANY: - $loc = self::$location; - if (isset($idx)) { - array_pop(self::$location); - } - - switch (true) { - case !isset($source): - return self::encode_der(null, ['type' => self::TYPE_NULL] + $mapping, null, $special); - case is_int($source): - case $source instanceof BigInteger: - return self::encode_der($source, ['type' => self::TYPE_INTEGER] + $mapping, null, $special); - case is_float($source): - return self::encode_der($source, ['type' => self::TYPE_REAL] + $mapping, null, $special); - case is_bool($source): - return self::encode_der($source, ['type' => self::TYPE_BOOLEAN] + $mapping, null, $special); - case is_array($source) && count($source) == 1: - $typename = implode('', array_keys($source)); - $outtype = array_search($typename, self::ANY_MAP, true); - if ($outtype !== false) { - return self::encode_der($source[$typename], ['type' => $outtype] + $mapping, null, $special); - } - } - - $filters = self::$filters; - foreach ($loc as $part) { - if (!isset($filters[$part])) { - $filters = false; - break; - } - $filters = $filters[$part]; - } - if ($filters === false) { - throw new \RuntimeException('No filters defined for ' . implode('/', $loc)); - } - return self::encode_der($source, $filters + $mapping, null, $special); - case self::TYPE_NULL: - $value = ''; - break; - case self::TYPE_NUMERIC_STRING: - case self::TYPE_TELETEX_STRING: - case self::TYPE_PRINTABLE_STRING: - case self::TYPE_UNIVERSAL_STRING: - case self::TYPE_UTF8_STRING: - case self::TYPE_BMP_STRING: - case self::TYPE_IA5_STRING: - case self::TYPE_VISIBLE_STRING: - case self::TYPE_VIDEOTEX_STRING: - case self::TYPE_GRAPHIC_STRING: - case self::TYPE_GENERAL_STRING: - $value = $source; - break; - case self::TYPE_BOOLEAN: - $value = $source ? "\xFF" : "\x00"; - break; - default: - throw new \RuntimeException('Mapping provides no type definition for ' . implode('/', self::$location)); - } - - if (isset($idx)) { - array_pop(self::$location); - } - - if (isset($mapping['cast'])) { - if (isset($mapping['explicit']) || $mapping['type'] == self::TYPE_CHOICE) { - $value = chr($tag) . self::encodeLength(strlen($value)) . $value; - $tag = ($mapping['class'] << 6) | 0x20 | $mapping['cast']; - } else { - $tag = ($mapping['class'] << 6) | (ord($temp[0]) & 0x20) | $mapping['cast']; - } - } - - return chr($tag) . self::encodeLength(strlen($value)) . $value; - } - - /** - * BER-decode the OID - * - * Called by _decode_ber() - * - * @param string $content - * @return string - */ - public static function decodeOID($content) - { - // BigInteger's are used because of OIDs like 2.25.329800735698586629295641978511506172918 - // https://healthcaresecprivacy.blogspot.com/2011/02/creating-and-using-unique-id-uuid-oid.html elaborates. - static $eighty; - if (!$eighty) { - $eighty = new BigInteger(80); - } - - $oid = []; - $pos = 0; - $len = strlen($content); - // see https://github.com/openjdk/jdk/blob/2deb318c9f047ec5a4b160d66a4b52f93688ec42/src/java.base/share/classes/sun/security/util/ObjectIdentifier.java#L55 - if ($len > 4096) { - //throw new \RuntimeException("Object identifier size is limited to 4096 bytes ($len bytes present)"); - return false; - } - - if (ord($content[$len - 1]) & 0x80) { - return false; - } - - $n = new BigInteger(); - while ($pos < $len) { - $temp = ord($content[$pos++]); - $n = $n->bitwise_leftShift(7); - $n = $n->bitwise_or(new BigInteger($temp & 0x7F)); - if (~$temp & 0x80) { - $oid[] = $n; - $n = new BigInteger(); - } - } - $part1 = array_shift($oid); - $first = floor(ord($content[0]) / 40); - /* - "This packing of the first two object identifier components recognizes that only three values are allocated from the root - node, and at most 39 subsequent values from nodes reached by X = 0 and X = 1." - - -- https://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#page=22 - */ - if ($first <= 2) { // ie. 0 <= ord($content[0]) < 120 (0x78) - array_unshift($oid, ord($content[0]) % 40); - array_unshift($oid, $first); - } else { - array_unshift($oid, $part1->subtract($eighty)); - array_unshift($oid, 2); - } - - return implode('.', $oid); - } - - /** - * DER-encode the OID - * - * Called by _encode_der() - * - * @param string $source - * @return string - */ - public static function encodeOID($source) - { - static $mask, $zero, $forty; - if (!$mask) { - $mask = new BigInteger(0x7F); - $zero = new BigInteger(); - $forty = new BigInteger(40); - } - - if (!preg_match('#(?:\d+\.)+#', $source)) { - $oid = isset(self::$reverseOIDs[$source]) ? self::$reverseOIDs[$source] : false; - } else { - $oid = $source; - } - if ($oid === false) { - throw new \RuntimeException('Invalid OID'); - } - - $parts = explode('.', $oid); - $part1 = array_shift($parts); - $part2 = array_shift($parts); - - $first = new BigInteger($part1); - $first = $first->multiply($forty); - $first = $first->add(new BigInteger($part2)); - - array_unshift($parts, $first->toString()); - - $value = ''; - foreach ($parts as $part) { - if (!$part) { - $temp = "\0"; - } else { - $temp = ''; - $part = new BigInteger($part); - while (!$part->equals($zero)) { - $submask = $part->bitwise_and($mask); - $submask->setPrecision(8); - $temp = (chr(0x80) | $submask->toBytes()) . $temp; - $part = $part->bitwise_rightShift(7); - } - $temp[strlen($temp) - 1] = $temp[strlen($temp) - 1] & chr(0x7F); - } - $value .= $temp; - } - - return $value; - } - - /** - * BER-decode the time - * - * Called by _decode_ber() and in the case of implicit tags asn1map(). - * - * @param string $content - * @param int $tag - * @return \DateTime|false - */ - private static function decodeTime($content, $tag) - { - /* UTCTime: - http://tools.ietf.org/html/rfc5280#section-4.1.2.5.1 - http://www.obj-sys.com/asn1tutorial/node15.html - - GeneralizedTime: - http://tools.ietf.org/html/rfc5280#section-4.1.2.5.2 - http://www.obj-sys.com/asn1tutorial/node14.html */ - - $format = 'YmdHis'; - - if ($tag == self::TYPE_UTC_TIME) { - // https://www.itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#page=28 says "the seconds - // element shall always be present" but none-the-less I've seen X509 certs where it isn't and if the - // browsers parse it phpseclib ought to too - if (preg_match('#^(\d{10})(Z|[+-]\d{4})$#', $content, $matches)) { - $content = $matches[1] . '00' . $matches[2]; - } - $prefix = substr($content, 0, 2) >= 50 ? '19' : '20'; - $content = $prefix . $content; - } elseif (strpos($content, '.') !== false) { - $format .= '.u'; - } - - if ($content[strlen($content) - 1] == 'Z') { - $content = substr($content, 0, -1) . '+0000'; - } - - if (strpos($content, '-') !== false || strpos($content, '+') !== false) { - $format .= 'O'; - } - - // error supression isn't necessary as of PHP 7.0: - // http://php.net/manual/en/migration70.other-changes.php - return @\DateTime::createFromFormat($format, $content); - } - - /** - * Set the time format - * - * Sets the time / date format for asn1map(). - * - * @param string $format - */ - public static function setTimeFormat($format) - { - self::$format = $format; - } - - /** - * Load OIDs - * - * Load the relevant OIDs for a particular ASN.1 semantic mapping. - * Previously loaded OIDs are retained. - * - * @param array $oids - */ - public static function loadOIDs(array $oids) - { - self::$reverseOIDs += $oids; - self::$oids = array_flip(self::$reverseOIDs); - } - - /** - * Set filters - * - * See \phpseclib3\File\X509, etc, for an example. - * Previously loaded filters are not retained. - * - * @param array $filters - */ - public static function setFilters(array $filters) - { - self::$filters = $filters; - } - - /** - * String type conversion - * - * This is a lazy conversion, dealing only with character size. - * No real conversion table is used. - * - * @param string $in - * @param int $from - * @param int $to - * @return string - */ - public static function convert($in, $from = self::TYPE_UTF8_STRING, $to = self::TYPE_UTF8_STRING) - { - // isset(self::STRING_TYPE_SIZE[$from] returns a fatal error on PHP 5.6 - if (!array_key_exists($from, self::STRING_TYPE_SIZE) || !array_key_exists($to, self::STRING_TYPE_SIZE)) { - return false; - } - $insize = self::STRING_TYPE_SIZE[$from]; - $outsize = self::STRING_TYPE_SIZE[$to]; - $inlength = strlen($in); - $out = ''; - - for ($i = 0; $i < $inlength;) { - if ($inlength - $i < $insize) { - return false; - } - - // Get an input character as a 32-bit value. - $c = ord($in[$i++]); - switch (true) { - case $insize == 4: - $c = ($c << 8) | ord($in[$i++]); - $c = ($c << 8) | ord($in[$i++]); - // fall-through - case $insize == 2: - $c = ($c << 8) | ord($in[$i++]); - // fall-through - case $insize == 1: - break; - case ($c & 0x80) == 0x00: - break; - case ($c & 0x40) == 0x00: - return false; - default: - $bit = 6; - do { - if ($bit > 25 || $i >= $inlength || (ord($in[$i]) & 0xC0) != 0x80) { - return false; - } - $c = ($c << 6) | (ord($in[$i++]) & 0x3F); - $bit += 5; - $mask = 1 << $bit; - } while ($c & $bit); - $c &= $mask - 1; - break; - } - - // Convert and append the character to output string. - $v = ''; - switch (true) { - case $outsize == 4: - $v .= chr($c & 0xFF); - $c >>= 8; - $v .= chr($c & 0xFF); - $c >>= 8; - // fall-through - case $outsize == 2: - $v .= chr($c & 0xFF); - $c >>= 8; - // fall-through - case $outsize == 1: - $v .= chr($c & 0xFF); - $c >>= 8; - if ($c) { - return false; - } - break; - case ($c & (PHP_INT_SIZE == 8 ? 0x80000000 : (1 << 31))) != 0: - return false; - case $c >= 0x04000000: - $v .= chr(0x80 | ($c & 0x3F)); - $c = ($c >> 6) | 0x04000000; - // fall-through - case $c >= 0x00200000: - $v .= chr(0x80 | ($c & 0x3F)); - $c = ($c >> 6) | 0x00200000; - // fall-through - case $c >= 0x00010000: - $v .= chr(0x80 | ($c & 0x3F)); - $c = ($c >> 6) | 0x00010000; - // fall-through - case $c >= 0x00000800: - $v .= chr(0x80 | ($c & 0x3F)); - $c = ($c >> 6) | 0x00000800; - // fall-through - case $c >= 0x00000080: - $v .= chr(0x80 | ($c & 0x3F)); - $c = ($c >> 6) | 0x000000C0; - // fall-through - default: - $v .= chr($c); - break; - } - $out .= strrev($v); - } - return $out; - } - - /** - * Extract raw BER from Base64 encoding - * - * @param string $str - * @return string - */ - public static function extractBER($str) - { - /* X.509 certs are assumed to be base64 encoded but sometimes they'll have additional things in them - * above and beyond the ceritificate. - * ie. some may have the following preceding the -----BEGIN CERTIFICATE----- line: - * - * Bag Attributes - * localKeyID: 01 00 00 00 - * subject=/O=organization/OU=org unit/CN=common name - * issuer=/O=organization/CN=common name - */ - if (strlen($str) > ini_get('pcre.backtrack_limit')) { - $temp = $str; - } else { - $temp = preg_replace('#.*?^-+[^-]+-+[\r\n ]*$#ms', '', $str, 1); - $temp = preg_replace('#-+END.*[\r\n ]*.*#ms', '', $temp, 1); - } - // remove new lines - $temp = str_replace(["\r", "\n", ' '], '', $temp); - // remove the -----BEGIN CERTIFICATE----- and -----END CERTIFICATE----- stuff - $temp = preg_replace('#^-+[^-]+-+|-+[^-]+-+$#', '', $temp); - $temp = preg_match('#^[a-zA-Z\d/+]*={0,2}$#', $temp) ? Strings::base64_decode($temp) : false; - return $temp != false ? $temp : $str; - } - - /** - * DER-encode the length - * - * DER supports lengths up to (2**8)**127, however, we'll only support lengths up to (2**8)**4. See - * {@link http://itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#p=13 X.690 paragraph 8.1.3} for more information. - * - * @param int $length - * @return string - */ - public static function encodeLength($length) - { - if ($length <= 0x7F) { - return chr($length); - } - - $temp = ltrim(pack('N', $length), chr(0)); - return pack('Ca*', 0x80 | strlen($temp), $temp); - } - - /** - * Returns the OID corresponding to a name - * - * What's returned in the associative array returned by loadX509() (or load*()) is either a name or an OID if - * no OID to name mapping is available. The problem with this is that what may be an unmapped OID in one version - * of phpseclib may not be unmapped in the next version, so apps that are looking at this OID may not be able - * to work from version to version. - * - * This method will return the OID if a name is passed to it and if no mapping is avialable it'll assume that - * what's being passed to it already is an OID and return that instead. A few examples. - * - * getOID('2.16.840.1.101.3.4.2.1') == '2.16.840.1.101.3.4.2.1' - * getOID('id-sha256') == '2.16.840.1.101.3.4.2.1' - * getOID('zzz') == 'zzz' - * - * @param string $name - * @return string - */ - public static function getOID($name) - { - return isset(self::$reverseOIDs[$name]) ? self::$reverseOIDs[$name] : $name; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Element.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Element.php deleted file mode 100644 index 60c4ca4..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Element.php +++ /dev/null @@ -1,43 +0,0 @@ - - * @copyright 2012 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * ASN.1 Raw Element - * - * An ASN.1 ANY mapping will return an ASN1\Element object. Use of this object - * will also bypass the normal encoding rules in ASN1::encodeDER() - * - * @author Jim Wigginton - */ -class Element -{ - /** - * Raw element value - * - * @var string - */ - public $element; - - /** - * Constructor - * - * @param string $encoded - * @return Element - */ - public function __construct($encoded) - { - $this->element = $encoded; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AccessDescription.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AccessDescription.php deleted file mode 100644 index 9ddf93d..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AccessDescription.php +++ /dev/null @@ -1,32 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * AccessDescription - * - * @author Jim Wigginton - */ -abstract class AccessDescription -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'accessMethod' => ['type' => ASN1::TYPE_OBJECT_IDENTIFIER], - 'accessLocation' => GeneralName::MAP - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AdministrationDomainName.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AdministrationDomainName.php deleted file mode 100644 index aa231a7..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AdministrationDomainName.php +++ /dev/null @@ -1,36 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * AdministrationDomainName - * - * @author Jim Wigginton - */ -abstract class AdministrationDomainName -{ - const MAP = [ - 'type' => ASN1::TYPE_CHOICE, - // if class isn't present it's assumed to be \phpseclib3\File\ASN1::CLASS_UNIVERSAL or - // (if constant is present) \phpseclib3\File\ASN1::CLASS_CONTEXT_SPECIFIC - 'class' => ASN1::CLASS_APPLICATION, - 'cast' => 2, - 'children' => [ - 'numeric' => ['type' => ASN1::TYPE_NUMERIC_STRING], - 'printable' => ['type' => ASN1::TYPE_PRINTABLE_STRING] - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AlgorithmIdentifier.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AlgorithmIdentifier.php deleted file mode 100644 index 570b4eb..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AlgorithmIdentifier.php +++ /dev/null @@ -1,35 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * AlgorithmIdentifier - * - * @author Jim Wigginton - */ -abstract class AlgorithmIdentifier -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'algorithm' => ['type' => ASN1::TYPE_OBJECT_IDENTIFIER], - 'parameters' => [ - 'type' => ASN1::TYPE_ANY, - 'optional' => true - ] - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AnotherName.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AnotherName.php deleted file mode 100644 index 277263e..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AnotherName.php +++ /dev/null @@ -1,37 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * AnotherName - * - * @author Jim Wigginton - */ -abstract class AnotherName -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'type-id' => ['type' => ASN1::TYPE_OBJECT_IDENTIFIER], - 'value' => [ - 'type' => ASN1::TYPE_ANY, - 'constant' => 0, - 'optional' => true, - 'explicit' => true - ] - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Attribute.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Attribute.php deleted file mode 100644 index 282cb54..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Attribute.php +++ /dev/null @@ -1,37 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * Attribute - * - * @author Jim Wigginton - */ -abstract class Attribute -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'type' => AttributeType::MAP, - 'value' => [ - 'type' => ASN1::TYPE_SET, - 'min' => 1, - 'max' => -1, - 'children' => AttributeValue::MAP - ] - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeType.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeType.php deleted file mode 100644 index 31e1510..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeType.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * AttributeType - * - * @author Jim Wigginton - */ -abstract class AttributeType -{ - const MAP = ['type' => ASN1::TYPE_OBJECT_IDENTIFIER]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeTypeAndValue.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeTypeAndValue.php deleted file mode 100644 index cc830be..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeTypeAndValue.php +++ /dev/null @@ -1,32 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * AttributeTypeAndValue - * - * @author Jim Wigginton - */ -abstract class AttributeTypeAndValue -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'type' => AttributeType::MAP, - 'value' => AttributeValue::MAP - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeValue.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeValue.php deleted file mode 100644 index 2282e4a..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AttributeValue.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * AttributeValue - * - * @author Jim Wigginton - */ -abstract class AttributeValue -{ - const MAP = ['type' => ASN1::TYPE_ANY]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Attributes.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Attributes.php deleted file mode 100644 index 7ce1aa4..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Attributes.php +++ /dev/null @@ -1,31 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * Attributes - * - * @author Jim Wigginton - */ -abstract class Attributes -{ - const MAP = [ - 'type' => ASN1::TYPE_SET, - 'min' => 1, - 'max' => -1, - 'children' => Attribute::MAP - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AuthorityInfoAccessSyntax.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AuthorityInfoAccessSyntax.php deleted file mode 100644 index 4aa4cbb..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AuthorityInfoAccessSyntax.php +++ /dev/null @@ -1,31 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * AuthorityInfoAccessSyntax - * - * @author Jim Wigginton - */ -abstract class AuthorityInfoAccessSyntax -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'min' => 1, - 'max' => -1, - 'children' => AccessDescription::MAP - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AuthorityKeyIdentifier.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AuthorityKeyIdentifier.php deleted file mode 100644 index 1aa4e9e..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/AuthorityKeyIdentifier.php +++ /dev/null @@ -1,45 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * AuthorityKeyIdentifier - * - * @author Jim Wigginton - */ -abstract class AuthorityKeyIdentifier -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'keyIdentifier' => [ - 'constant' => 0, - 'optional' => true, - 'implicit' => true - ] + KeyIdentifier::MAP, - 'authorityCertIssuer' => [ - 'constant' => 1, - 'optional' => true, - 'implicit' => true - ] + GeneralNames::MAP, - 'authorityCertSerialNumber' => [ - 'constant' => 2, - 'optional' => true, - 'implicit' => true - ] + CertificateSerialNumber::MAP - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BaseDistance.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BaseDistance.php deleted file mode 100644 index a3e20e9..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BaseDistance.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * BaseDistance - * - * @author Jim Wigginton - */ -abstract class BaseDistance -{ - const MAP = ['type' => ASN1::TYPE_INTEGER]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BasicConstraints.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BasicConstraints.php deleted file mode 100644 index a29ac2d..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BasicConstraints.php +++ /dev/null @@ -1,39 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * BasicConstraints - * - * @author Jim Wigginton - */ -abstract class BasicConstraints -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'cA' => [ - 'type' => ASN1::TYPE_BOOLEAN, - 'optional' => true, - 'default' => false - ], - 'pathLenConstraint' => [ - 'type' => ASN1::TYPE_INTEGER, - 'optional' => true - ] - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInDomainDefinedAttribute.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInDomainDefinedAttribute.php deleted file mode 100644 index 02b1a48..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInDomainDefinedAttribute.php +++ /dev/null @@ -1,32 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * BuiltInDomainDefinedAttribute - * - * @author Jim Wigginton - */ -abstract class BuiltInDomainDefinedAttribute -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'type' => ['type' => ASN1::TYPE_PRINTABLE_STRING], - 'value' => ['type' => ASN1::TYPE_PRINTABLE_STRING] - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInDomainDefinedAttributes.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInDomainDefinedAttributes.php deleted file mode 100644 index 53e9d56..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInDomainDefinedAttributes.php +++ /dev/null @@ -1,31 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * BuiltInDomainDefinedAttributes - * - * @author Jim Wigginton - */ -abstract class BuiltInDomainDefinedAttributes -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'min' => 1, - 'max' => 4, // ub-domain-defined-attributes - 'children' => BuiltInDomainDefinedAttribute::MAP - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInStandardAttributes.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInStandardAttributes.php deleted file mode 100644 index be5c916..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/BuiltInStandardAttributes.php +++ /dev/null @@ -1,67 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * BuiltInStandardAttributes - * - * @author Jim Wigginton - */ -abstract class BuiltInStandardAttributes -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'country-name' => ['optional' => true] + CountryName::MAP, - 'administration-domain-name' => ['optional' => true] + AdministrationDomainName::MAP, - 'network-address' => [ - 'constant' => 0, - 'optional' => true, - 'implicit' => true - ] + NetworkAddress::MAP, - 'terminal-identifier' => [ - 'constant' => 1, - 'optional' => true, - 'implicit' => true - ] + TerminalIdentifier::MAP, - 'private-domain-name' => [ - 'constant' => 2, - 'optional' => true, - 'explicit' => true - ] + PrivateDomainName::MAP, - 'organization-name' => [ - 'constant' => 3, - 'optional' => true, - 'implicit' => true - ] + OrganizationName::MAP, - 'numeric-user-identifier' => [ - 'constant' => 4, - 'optional' => true, - 'implicit' => true - ] + NumericUserIdentifier::MAP, - 'personal-name' => [ - 'constant' => 5, - 'optional' => true, - 'implicit' => true - ] + PersonalName::MAP, - 'organizational-unit-names' => [ - 'constant' => 6, - 'optional' => true, - 'implicit' => true - ] + OrganizationalUnitNames::MAP - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CPSuri.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CPSuri.php deleted file mode 100644 index e262649..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CPSuri.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * CPSuri - * - * @author Jim Wigginton - */ -abstract class CPSuri -{ - const MAP = ['type' => ASN1::TYPE_IA5_STRING]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLDistributionPoints.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLDistributionPoints.php deleted file mode 100644 index 2ed86d2..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLDistributionPoints.php +++ /dev/null @@ -1,31 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * CRLDistributionPoints - * - * @author Jim Wigginton - */ -abstract class CRLDistributionPoints -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'min' => 1, - 'max' => -1, - 'children' => DistributionPoint::MAP - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLNumber.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLNumber.php deleted file mode 100644 index 8bca7e7..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLNumber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * CRLNumber - * - * @author Jim Wigginton - */ -abstract class CRLNumber -{ - const MAP = ['type' => ASN1::TYPE_INTEGER]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLReason.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLReason.php deleted file mode 100644 index ee06694..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CRLReason.php +++ /dev/null @@ -1,41 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * CRLReason - * - * @author Jim Wigginton - */ -abstract class CRLReason -{ - const MAP = [ - 'type' => ASN1::TYPE_ENUMERATED, - 'mapping' => [ - 'unspecified', - 'keyCompromise', - 'cACompromise', - 'affiliationChanged', - 'superseded', - 'cessationOfOperation', - 'certificateHold', - // Value 7 is not used. - 8 => 'removeFromCRL', - 'privilegeWithdrawn', - 'aACompromise' - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertPolicyId.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertPolicyId.php deleted file mode 100644 index 32ff50c..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertPolicyId.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * CertPolicyId - * - * @author Jim Wigginton - */ -abstract class CertPolicyId -{ - const MAP = ['type' => ASN1::TYPE_OBJECT_IDENTIFIER]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Certificate.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Certificate.php deleted file mode 100644 index 4553516..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Certificate.php +++ /dev/null @@ -1,33 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * Certificate - * - * @author Jim Wigginton - */ -abstract class Certificate -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'tbsCertificate' => TBSCertificate::MAP, - 'signatureAlgorithm' => AlgorithmIdentifier::MAP, - 'signature' => ['type' => ASN1::TYPE_BIT_STRING] - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateIssuer.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateIssuer.php deleted file mode 100644 index c72fbff..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateIssuer.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -/** - * CertificateIssuer - * - * @author Jim Wigginton - */ -abstract class CertificateIssuer -{ - const MAP = GeneralNames::MAP; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateList.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateList.php deleted file mode 100644 index d958ee4..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateList.php +++ /dev/null @@ -1,33 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * CertificateList - * - * @author Jim Wigginton - */ -abstract class CertificateList -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'tbsCertList' => TBSCertList::MAP, - 'signatureAlgorithm' => AlgorithmIdentifier::MAP, - 'signature' => ['type' => ASN1::TYPE_BIT_STRING] - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificatePolicies.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificatePolicies.php deleted file mode 100644 index 976ab36..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificatePolicies.php +++ /dev/null @@ -1,31 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * CertificatePolicies - * - * @author Jim Wigginton - */ -abstract class CertificatePolicies -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'min' => 1, - 'max' => -1, - 'children' => PolicyInformation::MAP - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateSerialNumber.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateSerialNumber.php deleted file mode 100644 index 3afd207..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificateSerialNumber.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * CertificateSerialNumber - * - * @author Jim Wigginton - */ -abstract class CertificateSerialNumber -{ - const MAP = ['type' => ASN1::TYPE_INTEGER]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificationRequest.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificationRequest.php deleted file mode 100644 index db7df83..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificationRequest.php +++ /dev/null @@ -1,33 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * CertificationRequest - * - * @author Jim Wigginton - */ -abstract class CertificationRequest -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'certificationRequestInfo' => CertificationRequestInfo::MAP, - 'signatureAlgorithm' => AlgorithmIdentifier::MAP, - 'signature' => ['type' => ASN1::TYPE_BIT_STRING] - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificationRequestInfo.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificationRequestInfo.php deleted file mode 100644 index d90c00d..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CertificationRequestInfo.php +++ /dev/null @@ -1,41 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * CertificationRequestInfo - * - * @author Jim Wigginton - */ -abstract class CertificationRequestInfo -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'version' => [ - 'type' => ASN1::TYPE_INTEGER, - 'mapping' => ['v1'] - ], - 'subject' => Name::MAP, - 'subjectPKInfo' => SubjectPublicKeyInfo::MAP, - 'attributes' => [ - 'constant' => 0, - 'optional' => true, - 'implicit' => true - ] + Attributes::MAP, - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Characteristic_two.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Characteristic_two.php deleted file mode 100644 index 8c4b16f..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Characteristic_two.php +++ /dev/null @@ -1,36 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * Characteristic_two - * - * @author Jim Wigginton - */ -abstract class Characteristic_two -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'm' => ['type' => ASN1::TYPE_INTEGER], // field size 2**m - 'basis' => ['type' => ASN1::TYPE_OBJECT_IDENTIFIER], - 'parameters' => [ - 'type' => ASN1::TYPE_ANY, - 'optional' => true - ] - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CountryName.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CountryName.php deleted file mode 100644 index b2f187f..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/CountryName.php +++ /dev/null @@ -1,36 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * CountryName - * - * @author Jim Wigginton - */ -abstract class CountryName -{ - const MAP = [ - 'type' => ASN1::TYPE_CHOICE, - // if class isn't present it's assumed to be \phpseclib3\File\ASN1::CLASS_UNIVERSAL or - // (if constant is present) \phpseclib3\File\ASN1::CLASS_CONTEXT_SPECIFIC - 'class' => ASN1::CLASS_APPLICATION, - 'cast' => 1, - 'children' => [ - 'x121-dcc-code' => ['type' => ASN1::TYPE_NUMERIC_STRING], - 'iso-3166-alpha2-code' => ['type' => ASN1::TYPE_PRINTABLE_STRING] - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Curve.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Curve.php deleted file mode 100644 index ddd8465..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Curve.php +++ /dev/null @@ -1,36 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * Curve - * - * @author Jim Wigginton - */ -abstract class Curve -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'a' => FieldElement::MAP, - 'b' => FieldElement::MAP, - 'seed' => [ - 'type' => ASN1::TYPE_BIT_STRING, - 'optional' => true - ] - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DHParameter.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DHParameter.php deleted file mode 100644 index 66eefe8..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DHParameter.php +++ /dev/null @@ -1,38 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * DHParameter - * - * @author Jim Wigginton - */ -abstract class DHParameter -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'prime' => ['type' => ASN1::TYPE_INTEGER], - 'base' => ['type' => ASN1::TYPE_INTEGER], - 'privateValueLength' => [ - 'type' => ASN1::TYPE_INTEGER, - 'optional' => true - ] - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAParams.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAParams.php deleted file mode 100644 index da85381..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAParams.php +++ /dev/null @@ -1,33 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * DSAParams - * - * @author Jim Wigginton - */ -abstract class DSAParams -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'p' => ['type' => ASN1::TYPE_INTEGER], - 'q' => ['type' => ASN1::TYPE_INTEGER], - 'g' => ['type' => ASN1::TYPE_INTEGER] - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAPrivateKey.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAPrivateKey.php deleted file mode 100644 index 73d820a..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAPrivateKey.php +++ /dev/null @@ -1,36 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * DSAPrivateKey - * - * @author Jim Wigginton - */ -abstract class DSAPrivateKey -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'version' => ['type' => ASN1::TYPE_INTEGER], - 'p' => ['type' => ASN1::TYPE_INTEGER], - 'q' => ['type' => ASN1::TYPE_INTEGER], - 'g' => ['type' => ASN1::TYPE_INTEGER], - 'y' => ['type' => ASN1::TYPE_INTEGER], - 'x' => ['type' => ASN1::TYPE_INTEGER] - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAPublicKey.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAPublicKey.php deleted file mode 100644 index b832db8..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DSAPublicKey.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * DSAPublicKey - * - * @author Jim Wigginton - */ -abstract class DSAPublicKey -{ - const MAP = ['type' => ASN1::TYPE_INTEGER]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DigestInfo.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DigestInfo.php deleted file mode 100644 index f32f7e4..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DigestInfo.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * DigestInfo - * - * from https://tools.ietf.org/html/rfc2898#appendix-A.3 - * - * @author Jim Wigginton - */ -abstract class DigestInfo -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'digestAlgorithm' => AlgorithmIdentifier::MAP, - 'digest' => ['type' => ASN1::TYPE_OCTET_STRING] - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DirectoryString.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DirectoryString.php deleted file mode 100644 index 66ec65b..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DirectoryString.php +++ /dev/null @@ -1,35 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * DirectoryString - * - * @author Jim Wigginton - */ -abstract class DirectoryString -{ - const MAP = [ - 'type' => ASN1::TYPE_CHOICE, - 'children' => [ - 'teletexString' => ['type' => ASN1::TYPE_TELETEX_STRING], - 'printableString' => ['type' => ASN1::TYPE_PRINTABLE_STRING], - 'universalString' => ['type' => ASN1::TYPE_UNIVERSAL_STRING], - 'utf8String' => ['type' => ASN1::TYPE_UTF8_STRING], - 'bmpString' => ['type' => ASN1::TYPE_BMP_STRING] - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DisplayText.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DisplayText.php deleted file mode 100644 index b739783..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DisplayText.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * DisplayText - * - * @author Jim Wigginton - */ -abstract class DisplayText -{ - const MAP = [ - 'type' => ASN1::TYPE_CHOICE, - 'children' => [ - 'ia5String' => ['type' => ASN1::TYPE_IA5_STRING], - 'visibleString' => ['type' => ASN1::TYPE_VISIBLE_STRING], - 'bmpString' => ['type' => ASN1::TYPE_BMP_STRING], - 'utf8String' => ['type' => ASN1::TYPE_UTF8_STRING] - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DistributionPoint.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DistributionPoint.php deleted file mode 100644 index c5c2c95..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DistributionPoint.php +++ /dev/null @@ -1,45 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * DistributionPoint - * - * @author Jim Wigginton - */ -abstract class DistributionPoint -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'distributionPoint' => [ - 'constant' => 0, - 'optional' => true, - 'explicit' => true - ] + DistributionPointName::MAP, - 'reasons' => [ - 'constant' => 1, - 'optional' => true, - 'implicit' => true - ] + ReasonFlags::MAP, - 'cRLIssuer' => [ - 'constant' => 2, - 'optional' => true, - 'implicit' => true - ] + GeneralNames::MAP - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DistributionPointName.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DistributionPointName.php deleted file mode 100644 index 55f4767..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DistributionPointName.php +++ /dev/null @@ -1,40 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * DistributionPointName - * - * @author Jim Wigginton - */ -abstract class DistributionPointName -{ - const MAP = [ - 'type' => ASN1::TYPE_CHOICE, - 'children' => [ - 'fullName' => [ - 'constant' => 0, - 'optional' => true, - 'implicit' => true - ] + GeneralNames::MAP, - 'nameRelativeToCRLIssuer' => [ - 'constant' => 1, - 'optional' => true, - 'implicit' => true - ] + RelativeDistinguishedName::MAP - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DssSigValue.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DssSigValue.php deleted file mode 100644 index c0db0ed..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/DssSigValue.php +++ /dev/null @@ -1,32 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * DssSigValue - * - * @author Jim Wigginton - */ -abstract class DssSigValue -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'r' => ['type' => ASN1::TYPE_INTEGER], - 's' => ['type' => ASN1::TYPE_INTEGER] - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECParameters.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECParameters.php deleted file mode 100644 index cb5985d..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECParameters.php +++ /dev/null @@ -1,45 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * ECParameters - * - * ECParameters ::= CHOICE { - * namedCurve OBJECT IDENTIFIER - * -- implicitCurve NULL - * -- specifiedCurve SpecifiedECDomain - * } - * -- implicitCurve and specifiedCurve MUST NOT be used in PKIX. - * -- Details for SpecifiedECDomain can be found in [X9.62]. - * -- Any future additions to this CHOICE should be coordinated - * -- with ANSI X9. - * - * @author Jim Wigginton - */ -abstract class ECParameters -{ - const MAP = [ - 'type' => ASN1::TYPE_CHOICE, - 'children' => [ - 'namedCurve' => ['type' => ASN1::TYPE_OBJECT_IDENTIFIER], - 'implicitCurve' => ['type' => ASN1::TYPE_NULL], - 'specifiedCurve' => SpecifiedECDomain::MAP - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECPoint.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECPoint.php deleted file mode 100644 index c794011..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECPoint.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * ECPoint - * - * @author Jim Wigginton - */ -abstract class ECPoint -{ - const MAP = ['type' => ASN1::TYPE_OCTET_STRING]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECPrivateKey.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECPrivateKey.php deleted file mode 100644 index 636c642..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ECPrivateKey.php +++ /dev/null @@ -1,48 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * ECPrivateKey - * - * @author Jim Wigginton - */ -abstract class ECPrivateKey -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'version' => [ - 'type' => ASN1::TYPE_INTEGER, - 'mapping' => [1 => 'ecPrivkeyVer1'] - ], - 'privateKey' => ['type' => ASN1::TYPE_OCTET_STRING], - 'parameters' => [ - 'constant' => 0, - 'optional' => true, - 'explicit' => true - ] + ECParameters::MAP, - 'publicKey' => [ - 'type' => ASN1::TYPE_BIT_STRING, - 'constant' => 1, - 'optional' => true, - 'explicit' => true - ] - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EDIPartyName.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EDIPartyName.php deleted file mode 100644 index f9f4b4b..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EDIPartyName.php +++ /dev/null @@ -1,42 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * EDIPartyName - * - * @author Jim Wigginton - */ -abstract class EDIPartyName -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'nameAssigner' => [ - 'constant' => 0, - 'optional' => true, - 'implicit' => true - ] + DirectoryString::MAP, - // partyName is technically required but \phpseclib3\File\ASN1 doesn't currently support non-optional constants and - // setting it to optional gets the job done in any event. - 'partyName' => [ - 'constant' => 1, - 'optional' => true, - 'implicit' => true - ] + DirectoryString::MAP - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EcdsaSigValue.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EcdsaSigValue.php deleted file mode 100644 index 992c8dd..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EcdsaSigValue.php +++ /dev/null @@ -1,32 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * EcdsaSigValue - * - * @author Jim Wigginton - */ -abstract class EcdsaSigValue -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'r' => ['type' => ASN1::TYPE_INTEGER], - 's' => ['type' => ASN1::TYPE_INTEGER] - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EncryptedData.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EncryptedData.php deleted file mode 100644 index e03ad9d..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EncryptedData.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * EncryptedData - * - * @author Jim Wigginton - */ -abstract class EncryptedData -{ - const MAP = ['type' => ASN1::TYPE_OCTET_STRING]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EncryptedPrivateKeyInfo.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EncryptedPrivateKeyInfo.php deleted file mode 100644 index 6e64c48..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/EncryptedPrivateKeyInfo.php +++ /dev/null @@ -1,32 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * EncryptedPrivateKeyInfo - * - * @author Jim Wigginton - */ -abstract class EncryptedPrivateKeyInfo -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'encryptionAlgorithm' => AlgorithmIdentifier::MAP, - 'encryptedData' => EncryptedData::MAP - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtKeyUsageSyntax.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtKeyUsageSyntax.php deleted file mode 100644 index bdfa39b..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtKeyUsageSyntax.php +++ /dev/null @@ -1,31 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * ExtKeyUsageSyntax - * - * @author Jim Wigginton - */ -abstract class ExtKeyUsageSyntax -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'min' => 1, - 'max' => -1, - 'children' => KeyPurposeId::MAP - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Extension.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Extension.php deleted file mode 100644 index 290c348..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Extension.php +++ /dev/null @@ -1,43 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * Extension - * - * A certificate using system MUST reject the certificate if it encounters - * a critical extension it does not recognize; however, a non-critical - * extension may be ignored if it is not recognized. - * - * http://tools.ietf.org/html/rfc5280#section-4.2 - * - * @author Jim Wigginton - */ -abstract class Extension -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'extnId' => ['type' => ASN1::TYPE_OBJECT_IDENTIFIER], - 'critical' => [ - 'type' => ASN1::TYPE_BOOLEAN, - 'optional' => true, - 'default' => false - ], - 'extnValue' => ['type' => ASN1::TYPE_OCTET_STRING] - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtensionAttribute.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtensionAttribute.php deleted file mode 100644 index 4f44e18..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtensionAttribute.php +++ /dev/null @@ -1,42 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * ExtensionAttribute - * - * @author Jim Wigginton - */ -abstract class ExtensionAttribute -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'extension-attribute-type' => [ - 'type' => ASN1::TYPE_PRINTABLE_STRING, - 'constant' => 0, - 'optional' => true, - 'implicit' => true - ], - 'extension-attribute-value' => [ - 'type' => ASN1::TYPE_ANY, - 'constant' => 1, - 'optional' => true, - 'explicit' => true - ] - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtensionAttributes.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtensionAttributes.php deleted file mode 100644 index 59541cd..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ExtensionAttributes.php +++ /dev/null @@ -1,31 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * ExtensionAttributes - * - * @author Jim Wigginton - */ -abstract class ExtensionAttributes -{ - const MAP = [ - 'type' => ASN1::TYPE_SET, - 'min' => 1, - 'max' => 256, // ub-extension-attributes - 'children' => ExtensionAttribute::MAP - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Extensions.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Extensions.php deleted file mode 100644 index 0a02945..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Extensions.php +++ /dev/null @@ -1,33 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * Extensions - * - * @author Jim Wigginton - */ -abstract class Extensions -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'min' => 1, - // technically, it's MAX, but we'll assume anything < 0 is MAX - 'max' => -1, - // if 'children' isn't an array then 'min' and 'max' must be defined - 'children' => Extension::MAP - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/FieldElement.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/FieldElement.php deleted file mode 100644 index 8648ebe..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/FieldElement.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * FieldElement - * - * @author Jim Wigginton - */ -abstract class FieldElement -{ - const MAP = ['type' => ASN1::TYPE_OCTET_STRING]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/FieldID.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/FieldID.php deleted file mode 100644 index 83af870..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/FieldID.php +++ /dev/null @@ -1,35 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * FieldID - * - * @author Jim Wigginton - */ -abstract class FieldID -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'fieldType' => ['type' => ASN1::TYPE_OBJECT_IDENTIFIER], - 'parameters' => [ - 'type' => ASN1::TYPE_ANY, - 'optional' => true - ] - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralName.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralName.php deleted file mode 100644 index 637b98d..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralName.php +++ /dev/null @@ -1,80 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * GeneralName - * - * @author Jim Wigginton - */ -abstract class GeneralName -{ - const MAP = [ - 'type' => ASN1::TYPE_CHOICE, - 'children' => [ - 'otherName' => [ - 'constant' => 0, - 'optional' => true, - 'implicit' => true - ] + AnotherName::MAP, - 'rfc822Name' => [ - 'type' => ASN1::TYPE_IA5_STRING, - 'constant' => 1, - 'optional' => true, - 'implicit' => true - ], - 'dNSName' => [ - 'type' => ASN1::TYPE_IA5_STRING, - 'constant' => 2, - 'optional' => true, - 'implicit' => true - ], - 'x400Address' => [ - 'constant' => 3, - 'optional' => true, - 'implicit' => true - ] + ORAddress::MAP, - 'directoryName' => [ - 'constant' => 4, - 'optional' => true, - 'explicit' => true - ] + Name::MAP, - 'ediPartyName' => [ - 'constant' => 5, - 'optional' => true, - 'implicit' => true - ] + EDIPartyName::MAP, - 'uniformResourceIdentifier' => [ - 'type' => ASN1::TYPE_IA5_STRING, - 'constant' => 6, - 'optional' => true, - 'implicit' => true - ], - 'iPAddress' => [ - 'type' => ASN1::TYPE_OCTET_STRING, - 'constant' => 7, - 'optional' => true, - 'implicit' => true - ], - 'registeredID' => [ - 'type' => ASN1::TYPE_OBJECT_IDENTIFIER, - 'constant' => 8, - 'optional' => true, - 'implicit' => true - ] - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralNames.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralNames.php deleted file mode 100644 index 73de4f8..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralNames.php +++ /dev/null @@ -1,31 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * GeneralNames - * - * @author Jim Wigginton - */ -abstract class GeneralNames -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'min' => 1, - 'max' => -1, - 'children' => GeneralName::MAP - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralSubtree.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralSubtree.php deleted file mode 100644 index 7a82c1f..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralSubtree.php +++ /dev/null @@ -1,42 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * GeneralSubtree - * - * @author Jim Wigginton - */ -abstract class GeneralSubtree -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'base' => GeneralName::MAP, - 'minimum' => [ - 'constant' => 0, - 'optional' => true, - 'implicit' => true, - 'default' => '0' - ] + BaseDistance::MAP, - 'maximum' => [ - 'constant' => 1, - 'optional' => true, - 'implicit' => true, - ] + BaseDistance::MAP - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralSubtrees.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralSubtrees.php deleted file mode 100644 index d8dd081..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/GeneralSubtrees.php +++ /dev/null @@ -1,31 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * GeneralSubtrees - * - * @author Jim Wigginton - */ -abstract class GeneralSubtrees -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'min' => 1, - 'max' => -1, - 'children' => GeneralSubtree::MAP - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/HashAlgorithm.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/HashAlgorithm.php deleted file mode 100644 index 972d1dd..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/HashAlgorithm.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -/** - * HashAglorithm - * - * @author Jim Wigginton - */ -abstract class HashAlgorithm -{ - const MAP = AlgorithmIdentifier::MAP; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/HoldInstructionCode.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/HoldInstructionCode.php deleted file mode 100644 index 45496ba..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/HoldInstructionCode.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * HoldInstructionCode - * - * @author Jim Wigginton - */ -abstract class HoldInstructionCode -{ - const MAP = ['type' => ASN1::TYPE_OBJECT_IDENTIFIER]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/InvalidityDate.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/InvalidityDate.php deleted file mode 100644 index e6d1728..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/InvalidityDate.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * InvalidityDate - * - * @author Jim Wigginton - */ -abstract class InvalidityDate -{ - const MAP = ['type' => ASN1::TYPE_GENERALIZED_TIME]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/IssuerAltName.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/IssuerAltName.php deleted file mode 100644 index 0a8289e..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/IssuerAltName.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -/** - * IssuerAltName - * - * @author Jim Wigginton - */ -abstract class IssuerAltName -{ - const MAP = GeneralNames::MAP; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/IssuingDistributionPoint.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/IssuingDistributionPoint.php deleted file mode 100644 index cd5c1e0..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/IssuingDistributionPoint.php +++ /dev/null @@ -1,68 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * IssuingDistributionPoint - * - * @author Jim Wigginton - */ -abstract class IssuingDistributionPoint -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'distributionPoint' => [ - 'constant' => 0, - 'optional' => true, - 'explicit' => true - ] + DistributionPointName::MAP, - 'onlyContainsUserCerts' => [ - 'type' => ASN1::TYPE_BOOLEAN, - 'constant' => 1, - 'optional' => true, - 'default' => false, - 'implicit' => true - ], - 'onlyContainsCACerts' => [ - 'type' => ASN1::TYPE_BOOLEAN, - 'constant' => 2, - 'optional' => true, - 'default' => false, - 'implicit' => true - ], - 'onlySomeReasons' => [ - 'constant' => 3, - 'optional' => true, - 'implicit' => true - ] + ReasonFlags::MAP, - 'indirectCRL' => [ - 'type' => ASN1::TYPE_BOOLEAN, - 'constant' => 4, - 'optional' => true, - 'default' => false, - 'implicit' => true - ], - 'onlyContainsAttributeCerts' => [ - 'type' => ASN1::TYPE_BOOLEAN, - 'constant' => 5, - 'optional' => true, - 'default' => false, - 'implicit' => true - ] - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyIdentifier.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyIdentifier.php deleted file mode 100644 index e9e71ff..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyIdentifier.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * KeyIdentifier - * - * @author Jim Wigginton - */ -abstract class KeyIdentifier -{ - const MAP = ['type' => ASN1::TYPE_OCTET_STRING]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyPurposeId.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyPurposeId.php deleted file mode 100644 index 33196be..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyPurposeId.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * KeyPurposeId - * - * @author Jim Wigginton - */ -abstract class KeyPurposeId -{ - const MAP = ['type' => ASN1::TYPE_OBJECT_IDENTIFIER]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyUsage.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyUsage.php deleted file mode 100644 index 99ceb68..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/KeyUsage.php +++ /dev/null @@ -1,39 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * KeyUsage - * - * @author Jim Wigginton - */ -abstract class KeyUsage -{ - const MAP = [ - 'type' => ASN1::TYPE_BIT_STRING, - 'mapping' => [ - 'digitalSignature', - 'nonRepudiation', - 'keyEncipherment', - 'dataEncipherment', - 'keyAgreement', - 'keyCertSign', - 'cRLSign', - 'encipherOnly', - 'decipherOnly' - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/MaskGenAlgorithm.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/MaskGenAlgorithm.php deleted file mode 100644 index 0d99d51..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/MaskGenAlgorithm.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -/** - * MaskGenAglorithm - * - * @author Jim Wigginton - */ -abstract class MaskGenAlgorithm -{ - const MAP = AlgorithmIdentifier::MAP; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Name.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Name.php deleted file mode 100644 index a421d94..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Name.php +++ /dev/null @@ -1,31 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * Name - * - * @author Jim Wigginton - */ -abstract class Name -{ - const MAP = [ - 'type' => ASN1::TYPE_CHOICE, - 'children' => [ - 'rdnSequence' => RDNSequence::MAP - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NameConstraints.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NameConstraints.php deleted file mode 100644 index abb17dc..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NameConstraints.php +++ /dev/null @@ -1,40 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * NameConstraints - * - * @author Jim Wigginton - */ -abstract class NameConstraints -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'permittedSubtrees' => [ - 'constant' => 0, - 'optional' => true, - 'implicit' => true - ] + GeneralSubtrees::MAP, - 'excludedSubtrees' => [ - 'constant' => 1, - 'optional' => true, - 'implicit' => true - ] + GeneralSubtrees::MAP - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NetworkAddress.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NetworkAddress.php deleted file mode 100644 index 52a372d..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NetworkAddress.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * NetworkAddress - * - * @author Jim Wigginton - */ -abstract class NetworkAddress -{ - const MAP = ['type' => ASN1::TYPE_NUMERIC_STRING]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NoticeReference.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NoticeReference.php deleted file mode 100644 index 10b659c..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NoticeReference.php +++ /dev/null @@ -1,37 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * NoticeReference - * - * @author Jim Wigginton - */ -abstract class NoticeReference -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'organization' => DisplayText::MAP, - 'noticeNumbers' => [ - 'type' => ASN1::TYPE_SEQUENCE, - 'min' => 1, - 'max' => 200, - 'children' => ['type' => ASN1::TYPE_INTEGER] - ] - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NumericUserIdentifier.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NumericUserIdentifier.php deleted file mode 100644 index e8e4496..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/NumericUserIdentifier.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * NumericUserIdentifier - * - * @author Jim Wigginton - */ -abstract class NumericUserIdentifier -{ - const MAP = ['type' => ASN1::TYPE_NUMERIC_STRING]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ORAddress.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ORAddress.php deleted file mode 100644 index 46962fd..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ORAddress.php +++ /dev/null @@ -1,33 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * ORAddress - * - * @author Jim Wigginton - */ -abstract class ORAddress -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'built-in-standard-attributes' => BuiltInStandardAttributes::MAP, - 'built-in-domain-defined-attributes' => ['optional' => true] + BuiltInDomainDefinedAttributes::MAP, - 'extension-attributes' => ['optional' => true] + ExtensionAttributes::MAP - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OneAsymmetricKey.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OneAsymmetricKey.php deleted file mode 100644 index d4aca61..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OneAsymmetricKey.php +++ /dev/null @@ -1,48 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * OneAsymmetricKey - * - * @author Jim Wigginton - */ -abstract class OneAsymmetricKey -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'version' => [ - 'type' => ASN1::TYPE_INTEGER, - 'mapping' => ['v1', 'v2'] - ], - 'privateKeyAlgorithm' => AlgorithmIdentifier::MAP, - 'privateKey' => PrivateKey::MAP, - 'attributes' => [ - 'constant' => 0, - 'optional' => true, - 'implicit' => true - ] + Attributes::MAP, - 'publicKey' => [ - 'constant' => 1, - 'optional' => true, - 'implicit' => true - ] + PublicKey::MAP - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OrganizationName.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OrganizationName.php deleted file mode 100644 index 432a14a..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OrganizationName.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * OrganizationName - * - * @author Jim Wigginton - */ -abstract class OrganizationName -{ - const MAP = ['type' => ASN1::TYPE_PRINTABLE_STRING]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OrganizationalUnitNames.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OrganizationalUnitNames.php deleted file mode 100644 index 2efbb55..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OrganizationalUnitNames.php +++ /dev/null @@ -1,31 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * OrganizationalUnitNames - * - * @author Jim Wigginton - */ -abstract class OrganizationalUnitNames -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'min' => 1, - 'max' => 4, // ub-organizational-units - 'children' => ['type' => ASN1::TYPE_PRINTABLE_STRING] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OtherPrimeInfo.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OtherPrimeInfo.php deleted file mode 100644 index ff8943c..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OtherPrimeInfo.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * OtherPrimeInfo - * - * @author Jim Wigginton - */ -abstract class OtherPrimeInfo -{ - // version must be multi if otherPrimeInfos present - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'prime' => ['type' => ASN1::TYPE_INTEGER], // ri - 'exponent' => ['type' => ASN1::TYPE_INTEGER], // di - 'coefficient' => ['type' => ASN1::TYPE_INTEGER] // ti - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OtherPrimeInfos.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OtherPrimeInfos.php deleted file mode 100644 index 4a73c1b..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/OtherPrimeInfos.php +++ /dev/null @@ -1,32 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * OtherPrimeInfos - * - * @author Jim Wigginton - */ -abstract class OtherPrimeInfos -{ - // version must be multi if otherPrimeInfos present - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'min' => 1, - 'max' => -1, - 'children' => OtherPrimeInfo::MAP - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBEParameter.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBEParameter.php deleted file mode 100644 index afeccae..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBEParameter.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * PBEParameter - * - * from https://tools.ietf.org/html/rfc2898#appendix-A.3 - * - * @author Jim Wigginton - */ -abstract class PBEParameter -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'salt' => ['type' => ASN1::TYPE_OCTET_STRING], - 'iterationCount' => ['type' => ASN1::TYPE_INTEGER] - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBES2params.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBES2params.php deleted file mode 100644 index 8a2e8b5..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBES2params.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * PBES2params - * - * from https://tools.ietf.org/html/rfc2898#appendix-A.3 - * - * @author Jim Wigginton - */ -abstract class PBES2params -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'keyDerivationFunc' => AlgorithmIdentifier::MAP, - 'encryptionScheme' => AlgorithmIdentifier::MAP - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBKDF2params.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBKDF2params.php deleted file mode 100644 index f549d8e..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBKDF2params.php +++ /dev/null @@ -1,41 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * PBKDF2params - * - * from https://tools.ietf.org/html/rfc2898#appendix-A.3 - * - * @author Jim Wigginton - */ -abstract class PBKDF2params -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - // technically, this is a CHOICE in RFC2898 but the other "choice" is, currently, more of a placeholder - // in the RFC - 'salt' => ['type' => ASN1::TYPE_OCTET_STRING], - 'iterationCount' => ['type' => ASN1::TYPE_INTEGER], - 'keyLength' => [ - 'type' => ASN1::TYPE_INTEGER, - 'optional' => true - ], - 'prf' => AlgorithmIdentifier::MAP + ['optional' => true] - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBMAC1params.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBMAC1params.php deleted file mode 100644 index 7c0097a..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PBMAC1params.php +++ /dev/null @@ -1,34 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * PBMAC1params - * - * from https://tools.ietf.org/html/rfc2898#appendix-A.3 - * - * @author Jim Wigginton - */ -abstract class PBMAC1params -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'keyDerivationFunc' => AlgorithmIdentifier::MAP, - 'messageAuthScheme' => AlgorithmIdentifier::MAP - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PKCS9String.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PKCS9String.php deleted file mode 100644 index de2de84..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PKCS9String.php +++ /dev/null @@ -1,32 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * PKCS9String - * - * @author Jim Wigginton - */ -abstract class PKCS9String -{ - const MAP = [ - 'type' => ASN1::TYPE_CHOICE, - 'children' => [ - 'ia5String' => ['type' => ASN1::TYPE_IA5_STRING], - 'directoryString' => DirectoryString::MAP - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Pentanomial.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Pentanomial.php deleted file mode 100644 index 036f0dc..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Pentanomial.php +++ /dev/null @@ -1,33 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * Pentanomial - * - * @author Jim Wigginton - */ -abstract class Pentanomial -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'k1' => ['type' => ASN1::TYPE_INTEGER], // k1 > 0 - 'k2' => ['type' => ASN1::TYPE_INTEGER], // k2 > k1 - 'k3' => ['type' => ASN1::TYPE_INTEGER], // k3 > h2 - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PersonalName.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PersonalName.php deleted file mode 100644 index 16d9016..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PersonalName.php +++ /dev/null @@ -1,54 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * PersonalName - * - * @author Jim Wigginton - */ -abstract class PersonalName -{ - const MAP = [ - 'type' => ASN1::TYPE_SET, - 'children' => [ - 'surname' => [ - 'type' => ASN1::TYPE_PRINTABLE_STRING, - 'constant' => 0, - 'optional' => true, - 'implicit' => true - ], - 'given-name' => [ - 'type' => ASN1::TYPE_PRINTABLE_STRING, - 'constant' => 1, - 'optional' => true, - 'implicit' => true - ], - 'initials' => [ - 'type' => ASN1::TYPE_PRINTABLE_STRING, - 'constant' => 2, - 'optional' => true, - 'implicit' => true - ], - 'generation-qualifier' => [ - 'type' => ASN1::TYPE_PRINTABLE_STRING, - 'constant' => 3, - 'optional' => true, - 'implicit' => true - ] - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyInformation.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyInformation.php deleted file mode 100644 index eccbdf9..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyInformation.php +++ /dev/null @@ -1,38 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * PolicyInformation - * - * @author Jim Wigginton - */ -abstract class PolicyInformation -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'policyIdentifier' => CertPolicyId::MAP, - 'policyQualifiers' => [ - 'type' => ASN1::TYPE_SEQUENCE, - 'min' => 0, - 'max' => -1, - 'optional' => true, - 'children' => PolicyQualifierInfo::MAP - ] - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyMappings.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyMappings.php deleted file mode 100644 index f0672fc..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyMappings.php +++ /dev/null @@ -1,37 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * PolicyMappings - * - * @author Jim Wigginton - */ -abstract class PolicyMappings -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'min' => 1, - 'max' => -1, - 'children' => [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'issuerDomainPolicy' => CertPolicyId::MAP, - 'subjectDomainPolicy' => CertPolicyId::MAP - ] - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyQualifierId.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyQualifierId.php deleted file mode 100644 index c8c6d82..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyQualifierId.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * PolicyQualifierId - * - * @author Jim Wigginton - */ -abstract class PolicyQualifierId -{ - const MAP = ['type' => ASN1::TYPE_OBJECT_IDENTIFIER]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyQualifierInfo.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyQualifierInfo.php deleted file mode 100644 index 27ee7bb..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PolicyQualifierInfo.php +++ /dev/null @@ -1,32 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * PolicyQualifierInfo - * - * @author Jim Wigginton - */ -abstract class PolicyQualifierInfo -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'policyQualifierId' => PolicyQualifierId::MAP, - 'qualifier' => ['type' => ASN1::TYPE_ANY] - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PostalAddress.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PostalAddress.php deleted file mode 100644 index 3e47100..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PostalAddress.php +++ /dev/null @@ -1,32 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * PostalAddress - * - * @author Jim Wigginton - */ -abstract class PostalAddress -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'optional' => true, - 'min' => 1, - 'max' => -1, - 'children' => DirectoryString::MAP - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Prime_p.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Prime_p.php deleted file mode 100644 index 1f84f19..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Prime_p.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * Prime_p - * - * @author Jim Wigginton - */ -abstract class Prime_p -{ - const MAP = ['type' => ASN1::TYPE_INTEGER]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateDomainName.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateDomainName.php deleted file mode 100644 index 0847b81..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateDomainName.php +++ /dev/null @@ -1,32 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * PrivateDomainName - * - * @author Jim Wigginton - */ -abstract class PrivateDomainName -{ - const MAP = [ - 'type' => ASN1::TYPE_CHOICE, - 'children' => [ - 'numeric' => ['type' => ASN1::TYPE_NUMERIC_STRING], - 'printable' => ['type' => ASN1::TYPE_PRINTABLE_STRING] - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKey.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKey.php deleted file mode 100644 index cdb406b..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKey.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * PrivateKey - * - * @author Jim Wigginton - */ -abstract class PrivateKey -{ - const MAP = ['type' => ASN1::TYPE_OCTET_STRING]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKeyInfo.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKeyInfo.php deleted file mode 100644 index d1e0087..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKeyInfo.php +++ /dev/null @@ -1,41 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * PrivateKeyInfo - * - * @author Jim Wigginton - */ -abstract class PrivateKeyInfo -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'version' => [ - 'type' => ASN1::TYPE_INTEGER, - 'mapping' => ['v1'] - ], - 'privateKeyAlgorithm' => AlgorithmIdentifier::MAP, - 'privateKey' => PrivateKey::MAP, - 'attributes' => [ - 'constant' => 0, - 'optional' => true, - 'implicit' => true - ] + Attributes::MAP - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKeyUsagePeriod.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKeyUsagePeriod.php deleted file mode 100644 index da87eb9..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PrivateKeyUsagePeriod.php +++ /dev/null @@ -1,40 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * PrivateKeyUsagePeriod - * - * @author Jim Wigginton - */ -abstract class PrivateKeyUsagePeriod -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'notBefore' => [ - 'constant' => 0, - 'optional' => true, - 'implicit' => true, - 'type' => ASN1::TYPE_GENERALIZED_TIME], - 'notAfter' => [ - 'constant' => 1, - 'optional' => true, - 'implicit' => true, - 'type' => ASN1::TYPE_GENERALIZED_TIME] - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKey.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKey.php deleted file mode 100644 index 558a8c9..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKey.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * PublicKey - * - * @author Jim Wigginton - */ -abstract class PublicKey -{ - const MAP = ['type' => ASN1::TYPE_BIT_STRING]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKeyAndChallenge.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKeyAndChallenge.php deleted file mode 100644 index f52bbb4..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKeyAndChallenge.php +++ /dev/null @@ -1,32 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * PublicKeyAndChallenge - * - * @author Jim Wigginton - */ -abstract class PublicKeyAndChallenge -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'spki' => SubjectPublicKeyInfo::MAP, - 'challenge' => ['type' => ASN1::TYPE_IA5_STRING] - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKeyInfo.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKeyInfo.php deleted file mode 100644 index 94029df..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/PublicKeyInfo.php +++ /dev/null @@ -1,35 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * PublicKeyInfo - * - * this format is not formally defined anywhere but is none-the-less the form you - * get when you do "openssl rsa -in private.pem -outform PEM -pubout" - * - * @author Jim Wigginton - */ -abstract class PublicKeyInfo -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'publicKeyAlgorithm' => AlgorithmIdentifier::MAP, - 'publicKey' => ['type' => ASN1::TYPE_BIT_STRING] - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RC2CBCParameter.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RC2CBCParameter.php deleted file mode 100644 index 53d5ee9..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RC2CBCParameter.php +++ /dev/null @@ -1,37 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * RC2CBCParameter - * - * from https://tools.ietf.org/html/rfc2898#appendix-A.3 - * - * @author Jim Wigginton - */ -abstract class RC2CBCParameter -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'rc2ParametersVersion' => [ - 'type' => ASN1::TYPE_INTEGER, - 'optional' => true - ], - 'iv' => ['type' => ASN1::TYPE_OCTET_STRING] - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RDNSequence.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RDNSequence.php deleted file mode 100644 index 94b516f..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RDNSequence.php +++ /dev/null @@ -1,38 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * RDNSequence - * - * In practice, RDNs containing multiple name-value pairs (called "multivalued RDNs") are rare, - * but they can be useful at times when either there is no unique attribute in the entry or you - * want to ensure that the entry's DN contains some useful identifying information. - * - * - https://www.opends.org/wiki/page/DefinitionRelativeDistinguishedName - * - * @author Jim Wigginton - */ -abstract class RDNSequence -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - // RDNSequence does not define a min or a max, which means it doesn't have one - 'min' => 0, - 'max' => -1, - 'children' => RelativeDistinguishedName::MAP - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSAPrivateKey.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSAPrivateKey.php deleted file mode 100644 index dfb44ec..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSAPrivateKey.php +++ /dev/null @@ -1,44 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * RSAPrivateKey - * - * @author Jim Wigginton - */ -abstract class RSAPrivateKey -{ - // version must be multi if otherPrimeInfos present - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'version' => [ - 'type' => ASN1::TYPE_INTEGER, - 'mapping' => ['two-prime', 'multi'] - ], - 'modulus' => ['type' => ASN1::TYPE_INTEGER], // n - 'publicExponent' => ['type' => ASN1::TYPE_INTEGER], // e - 'privateExponent' => ['type' => ASN1::TYPE_INTEGER], // d - 'prime1' => ['type' => ASN1::TYPE_INTEGER], // p - 'prime2' => ['type' => ASN1::TYPE_INTEGER], // q - 'exponent1' => ['type' => ASN1::TYPE_INTEGER], // d mod (p-1) - 'exponent2' => ['type' => ASN1::TYPE_INTEGER], // d mod (q-1) - 'coefficient' => ['type' => ASN1::TYPE_INTEGER], // (inverse of q) mod p - 'otherPrimeInfos' => OtherPrimeInfos::MAP + ['optional' => true] - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSAPublicKey.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSAPublicKey.php deleted file mode 100644 index 92c1ab4..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSAPublicKey.php +++ /dev/null @@ -1,32 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * RSAPublicKey - * - * @author Jim Wigginton - */ -abstract class RSAPublicKey -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'modulus' => ['type' => ASN1::TYPE_INTEGER], - 'publicExponent' => ['type' => ASN1::TYPE_INTEGER] - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSASSA_PSS_params.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSASSA_PSS_params.php deleted file mode 100644 index b9c4fb1..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RSASSA_PSS_params.php +++ /dev/null @@ -1,58 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * RSASSA_PSS_params - * - * @author Jim Wigginton - */ -abstract class RSASSA_PSS_params -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'hashAlgorithm' => [ - 'constant' => 0, - 'optional' => true, - 'explicit' => true, - //'default' => 'sha1Identifier' - ] + HashAlgorithm::MAP, - 'maskGenAlgorithm' => [ - 'constant' => 1, - 'optional' => true, - 'explicit' => true, - //'default' => 'mgf1SHA1Identifier' - ] + MaskGenAlgorithm::MAP, - 'saltLength' => [ - 'type' => ASN1::TYPE_INTEGER, - 'constant' => 2, - 'optional' => true, - 'explicit' => true, - 'default' => 20 - ], - 'trailerField' => [ - 'type' => ASN1::TYPE_INTEGER, - 'constant' => 3, - 'optional' => true, - 'explicit' => true, - 'default' => 1 - ] - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ReasonFlags.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ReasonFlags.php deleted file mode 100644 index 9ef460e..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/ReasonFlags.php +++ /dev/null @@ -1,39 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * ReasonFlags - * - * @author Jim Wigginton - */ -abstract class ReasonFlags -{ - const MAP = [ - 'type' => ASN1::TYPE_BIT_STRING, - 'mapping' => [ - 'unused', - 'keyCompromise', - 'cACompromise', - 'affiliationChanged', - 'superseded', - 'cessationOfOperation', - 'certificateHold', - 'privilegeWithdrawn', - 'aACompromise' - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RelativeDistinguishedName.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RelativeDistinguishedName.php deleted file mode 100644 index ffa5129..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RelativeDistinguishedName.php +++ /dev/null @@ -1,37 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * RelativeDistinguishedName - * - * In practice, RDNs containing multiple name-value pairs (called "multivalued RDNs") are rare, - * but they can be useful at times when either there is no unique attribute in the entry or you - * want to ensure that the entry's DN contains some useful identifying information. - * - * - https://www.opends.org/wiki/page/DefinitionRelativeDistinguishedName - * - * @author Jim Wigginton - */ -abstract class RelativeDistinguishedName -{ - const MAP = [ - 'type' => ASN1::TYPE_SET, - 'min' => 1, - 'max' => -1, - 'children' => AttributeTypeAndValue::MAP - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RevokedCertificate.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RevokedCertificate.php deleted file mode 100644 index 00cfaf3..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/RevokedCertificate.php +++ /dev/null @@ -1,35 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * RevokedCertificate - * - * @author Jim Wigginton - */ -abstract class RevokedCertificate -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'userCertificate' => CertificateSerialNumber::MAP, - 'revocationDate' => Time::MAP, - 'crlEntryExtensions' => [ - 'optional' => true - ] + Extensions::MAP - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SignedPublicKeyAndChallenge.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SignedPublicKeyAndChallenge.php deleted file mode 100644 index cbcc069..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SignedPublicKeyAndChallenge.php +++ /dev/null @@ -1,33 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * SignedPublicKeyAndChallenge - * - * @author Jim Wigginton - */ -abstract class SignedPublicKeyAndChallenge -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'publicKeyAndChallenge' => PublicKeyAndChallenge::MAP, - 'signatureAlgorithm' => AlgorithmIdentifier::MAP, - 'signature' => ['type' => ASN1::TYPE_BIT_STRING] - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SpecifiedECDomain.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SpecifiedECDomain.php deleted file mode 100644 index 5702a8a..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SpecifiedECDomain.php +++ /dev/null @@ -1,45 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * SpecifiedECDomain - * - * @author Jim Wigginton - */ -abstract class SpecifiedECDomain -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'version' => [ - 'type' => ASN1::TYPE_INTEGER, - 'mapping' => [1 => 'ecdpVer1', 'ecdpVer2', 'ecdpVer3'] - ], - 'fieldID' => FieldID::MAP, - 'curve' => Curve::MAP, - 'base' => ECPoint::MAP, - 'order' => ['type' => ASN1::TYPE_INTEGER], - 'cofactor' => [ - 'type' => ASN1::TYPE_INTEGER, - 'optional' => true - ], - 'hash' => ['optional' => true] + HashAlgorithm::MAP - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectAltName.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectAltName.php deleted file mode 100644 index 4c43ca5..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectAltName.php +++ /dev/null @@ -1,24 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -/** - * SubjectAltName - * - * @author Jim Wigginton - */ -abstract class SubjectAltName -{ - const MAP = GeneralNames::MAP; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectDirectoryAttributes.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectDirectoryAttributes.php deleted file mode 100644 index 5a3747b..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectDirectoryAttributes.php +++ /dev/null @@ -1,31 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * SubjectDirectoryAttributes - * - * @author Jim Wigginton - */ -abstract class SubjectDirectoryAttributes -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'min' => 1, - 'max' => -1, - 'children' => Attribute::MAP - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectInfoAccessSyntax.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectInfoAccessSyntax.php deleted file mode 100644 index a1edd40..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectInfoAccessSyntax.php +++ /dev/null @@ -1,31 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * SubjectInfoAccessSyntax - * - * @author Jim Wigginton - */ -abstract class SubjectInfoAccessSyntax -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'min' => 1, - 'max' => -1, - 'children' => AccessDescription::MAP - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectPublicKeyInfo.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectPublicKeyInfo.php deleted file mode 100644 index 2f3f4ac..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/SubjectPublicKeyInfo.php +++ /dev/null @@ -1,32 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * SubjectPublicKeyInfo - * - * @author Jim Wigginton - */ -abstract class SubjectPublicKeyInfo -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'algorithm' => AlgorithmIdentifier::MAP, - 'subjectPublicKey' => ['type' => ASN1::TYPE_BIT_STRING] - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TBSCertList.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TBSCertList.php deleted file mode 100644 index f681f1a..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TBSCertList.php +++ /dev/null @@ -1,54 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * TBSCertList - * - * @author Jim Wigginton - */ -abstract class TBSCertList -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'version' => [ - 'type' => ASN1::TYPE_INTEGER, - 'mapping' => ['v1', 'v2'], - 'optional' => true, - 'default' => 'v1' - ], - 'signature' => AlgorithmIdentifier::MAP, - 'issuer' => Name::MAP, - 'thisUpdate' => Time::MAP, - 'nextUpdate' => [ - 'optional' => true - ] + Time::MAP, - 'revokedCertificates' => [ - 'type' => ASN1::TYPE_SEQUENCE, - 'optional' => true, - 'min' => 0, - 'max' => -1, - 'children' => RevokedCertificate::MAP - ], - 'crlExtensions' => [ - 'constant' => 0, - 'optional' => true, - 'explicit' => true - ] + Extensions::MAP - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TBSCertificate.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TBSCertificate.php deleted file mode 100644 index 3758026..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TBSCertificate.php +++ /dev/null @@ -1,65 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * TBSCertificate - * - * @author Jim Wigginton - */ -abstract class TBSCertificate -{ - // assert($TBSCertificate['children']['signature'] == $Certificate['children']['signatureAlgorithm']) - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - // technically, default implies optional, but we'll define it as being optional, none-the-less, just to - // reenforce that fact - 'version' => [ - 'type' => ASN1::TYPE_INTEGER, - 'constant' => 0, - 'optional' => true, - 'explicit' => true, - 'mapping' => ['v1', 'v2', 'v3'], - 'default' => 'v1' - ], - 'serialNumber' => CertificateSerialNumber::MAP, - 'signature' => AlgorithmIdentifier::MAP, - 'issuer' => Name::MAP, - 'validity' => Validity::MAP, - 'subject' => Name::MAP, - 'subjectPublicKeyInfo' => SubjectPublicKeyInfo::MAP, - // implicit means that the T in the TLV structure is to be rewritten, regardless of the type - 'issuerUniqueID' => [ - 'constant' => 1, - 'optional' => true, - 'implicit' => true - ] + UniqueIdentifier::MAP, - 'subjectUniqueID' => [ - 'constant' => 2, - 'optional' => true, - 'implicit' => true - ] + UniqueIdentifier::MAP, - // doesn't use the EXPLICIT keyword but if - // it's not IMPLICIT, it's EXPLICIT - 'extensions' => [ - 'constant' => 3, - 'optional' => true, - 'explicit' => true - ] + Extensions::MAP - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TerminalIdentifier.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TerminalIdentifier.php deleted file mode 100644 index 8dd065c..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/TerminalIdentifier.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * TerminalIdentifier - * - * @author Jim Wigginton - */ -abstract class TerminalIdentifier -{ - const MAP = ['type' => ASN1::TYPE_PRINTABLE_STRING]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Time.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Time.php deleted file mode 100644 index fdc070f..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Time.php +++ /dev/null @@ -1,32 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * Time - * - * @author Jim Wigginton - */ -abstract class Time -{ - const MAP = [ - 'type' => ASN1::TYPE_CHOICE, - 'children' => [ - 'utcTime' => ['type' => ASN1::TYPE_UTC_TIME], - 'generalTime' => ['type' => ASN1::TYPE_GENERALIZED_TIME] - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Trinomial.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Trinomial.php deleted file mode 100644 index ed561a2..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Trinomial.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * Trinomial - * - * @author Jim Wigginton - */ -abstract class Trinomial -{ - const MAP = ['type' => ASN1::TYPE_INTEGER]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/UniqueIdentifier.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/UniqueIdentifier.php deleted file mode 100644 index 2651d5c..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/UniqueIdentifier.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * UniqueIdentifier - * - * @author Jim Wigginton - */ -abstract class UniqueIdentifier -{ - const MAP = ['type' => ASN1::TYPE_BIT_STRING]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/UserNotice.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/UserNotice.php deleted file mode 100644 index b1e3ad0..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/UserNotice.php +++ /dev/null @@ -1,38 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * UserNotice - * - * @author Jim Wigginton - */ -abstract class UserNotice -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'noticeRef' => [ - 'optional' => true, - 'implicit' => true - ] + NoticeReference::MAP, - 'explicitText' => [ - 'optional' => true, - 'implicit' => true - ] + DisplayText::MAP - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Validity.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Validity.php deleted file mode 100644 index 1ff4b3c..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/Validity.php +++ /dev/null @@ -1,32 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * Validity - * - * @author Jim Wigginton - */ -abstract class Validity -{ - const MAP = [ - 'type' => ASN1::TYPE_SEQUENCE, - 'children' => [ - 'notBefore' => Time::MAP, - 'notAfter' => Time::MAP - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_ca_policy_url.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_ca_policy_url.php deleted file mode 100644 index 0b7c078..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_ca_policy_url.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * netscape_ca_policy_url - * - * @author Jim Wigginton - */ -abstract class netscape_ca_policy_url -{ - const MAP = ['type' => ASN1::TYPE_IA5_STRING]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_cert_type.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_cert_type.php deleted file mode 100644 index 10126e3..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_cert_type.php +++ /dev/null @@ -1,40 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * netscape_cert_type - * - * mapping is from - * - * @author Jim Wigginton - */ -abstract class netscape_cert_type -{ - const MAP = [ - 'type' => ASN1::TYPE_BIT_STRING, - 'mapping' => [ - 'SSLClient', - 'SSLServer', - 'Email', - 'ObjectSigning', - 'Reserved', - 'SSLCA', - 'EmailCA', - 'ObjectSigningCA' - ] - ]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_comment.php b/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_comment.php deleted file mode 100644 index 991c5a8..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/ASN1/Maps/netscape_comment.php +++ /dev/null @@ -1,26 +0,0 @@ - - * @copyright 2016 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; - -use OCA\Libresign\Vendor\phpseclib3\File\ASN1; - -/** - * netscape_comment - * - * @author Jim Wigginton - */ -abstract class netscape_comment -{ - const MAP = ['type' => ASN1::TYPE_IA5_STRING]; -} diff --git a/composer/phpseclib/phpseclib/phpseclib/File/X509.php b/composer/phpseclib/phpseclib/phpseclib/File/X509.php deleted file mode 100644 index cbb4c39..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/File/X509.php +++ /dev/null @@ -1,4029 +0,0 @@ - - * @copyright 2012 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\File; - -use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\PrivateKey; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\PublicKey; -use OCA\Libresign\Vendor\phpseclib3\Crypt\DSA; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Hash; -use OCA\Libresign\Vendor\phpseclib3\Crypt\PublicKeyLoader; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Random; -use OCA\Libresign\Vendor\phpseclib3\Crypt\RSA; -use OCA\Libresign\Vendor\phpseclib3\Crypt\RSA\Formats\Keys\PSS; -use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedAlgorithmException; -use OCA\Libresign\Vendor\phpseclib3\File\ASN1\Element; -use OCA\Libresign\Vendor\phpseclib3\File\ASN1\Maps; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * Pure-PHP X.509 Parser - * - * @author Jim Wigginton - */ -class X509 -{ - /** - * Flag to only accept signatures signed by certificate authorities - * - * Not really used anymore but retained all the same to suppress E_NOTICEs from old installs - * - */ - const VALIDATE_SIGNATURE_BY_CA = 1; - - /** - * Return internal array representation - * - * @see \phpseclib3\File\X509::getDN() - */ - const DN_ARRAY = 0; - /** - * Return string - * - * @see \phpseclib3\File\X509::getDN() - */ - const DN_STRING = 1; - /** - * Return ASN.1 name string - * - * @see \phpseclib3\File\X509::getDN() - */ - const DN_ASN1 = 2; - /** - * Return OpenSSL compatible array - * - * @see \phpseclib3\File\X509::getDN() - */ - const DN_OPENSSL = 3; - /** - * Return canonical ASN.1 RDNs string - * - * @see \phpseclib3\File\X509::getDN() - */ - const DN_CANON = 4; - /** - * Return name hash for file indexing - * - * @see \phpseclib3\File\X509::getDN() - */ - const DN_HASH = 5; - - /** - * Save as PEM - * - * ie. a base64-encoded PEM with a header and a footer - * - * @see \phpseclib3\File\X509::saveX509() - * @see \phpseclib3\File\X509::saveCSR() - * @see \phpseclib3\File\X509::saveCRL() - */ - const FORMAT_PEM = 0; - /** - * Save as DER - * - * @see \phpseclib3\File\X509::saveX509() - * @see \phpseclib3\File\X509::saveCSR() - * @see \phpseclib3\File\X509::saveCRL() - */ - const FORMAT_DER = 1; - /** - * Save as a SPKAC - * - * @see \phpseclib3\File\X509::saveX509() - * @see \phpseclib3\File\X509::saveCSR() - * @see \phpseclib3\File\X509::saveCRL() - * - * Only works on CSRs. Not currently supported. - */ - const FORMAT_SPKAC = 2; - /** - * Auto-detect the format - * - * Used only by the load*() functions - * - * @see \phpseclib3\File\X509::saveX509() - * @see \phpseclib3\File\X509::saveCSR() - * @see \phpseclib3\File\X509::saveCRL() - */ - const FORMAT_AUTO_DETECT = 3; - - /** - * Attribute value disposition. - * If disposition is >= 0, this is the index of the target value. - */ - const ATTR_ALL = -1; // All attribute values (array). - const ATTR_APPEND = -2; // Add a value. - const ATTR_REPLACE = -3; // Clear first, then add a value. - - /** - * Distinguished Name - * - * @var array - */ - private $dn; - - /** - * Public key - * - * @var string|PublicKey - */ - private $publicKey; - - /** - * Private key - * - * @var string|PrivateKey - */ - private $privateKey; - - /** - * The certificate authorities - * - * @var array - */ - private $CAs = []; - - /** - * The currently loaded certificate - * - * @var array - */ - private $currentCert; - - /** - * The signature subject - * - * There's no guarantee \phpseclib3\File\X509 is going to re-encode an X.509 cert in the same way it was originally - * encoded so we take save the portion of the original cert that the signature would have made for. - * - * @var string - */ - private $signatureSubject; - - /** - * Certificate Start Date - * - * @var string - */ - private $startDate; - - /** - * Certificate End Date - * - * @var string|Element - */ - private $endDate; - - /** - * Serial Number - * - * @var string - */ - private $serialNumber; - - /** - * Key Identifier - * - * See {@link http://tools.ietf.org/html/rfc5280#section-4.2.1.1 RFC5280#section-4.2.1.1} and - * {@link http://tools.ietf.org/html/rfc5280#section-4.2.1.2 RFC5280#section-4.2.1.2}. - * - * @var string - */ - private $currentKeyIdentifier; - - /** - * CA Flag - * - * @var bool - */ - private $caFlag = false; - - /** - * SPKAC Challenge - * - * @var string - */ - private $challenge; - - /** - * @var array - */ - private $extensionValues = []; - - /** - * OIDs loaded - * - * @var bool - */ - private static $oidsLoaded = false; - - /** - * Recursion Limit - * - * @var int - */ - private static $recur_limit = 5; - - /** - * URL fetch flag - * - * @var bool - */ - private static $disable_url_fetch = false; - - /** - * @var array - */ - private static $extensions = []; - - /** - * @var ?array - */ - private $ipAddresses = null; - - /** - * @var ?array - */ - private $domains = null; - - /** - * Default Constructor. - * - * @return X509 - */ - public function __construct() - { - // Explicitly Tagged Module, 1988 Syntax - // http://tools.ietf.org/html/rfc5280#appendix-A.1 - - if (!self::$oidsLoaded) { - // OIDs from RFC5280 and those RFCs mentioned in RFC5280#section-4.1.1.2 - ASN1::loadOIDs([ - //'id-pkix' => '1.3.6.1.5.5.7', - //'id-pe' => '1.3.6.1.5.5.7.1', - //'id-qt' => '1.3.6.1.5.5.7.2', - //'id-kp' => '1.3.6.1.5.5.7.3', - //'id-ad' => '1.3.6.1.5.5.7.48', - 'id-qt-cps' => '1.3.6.1.5.5.7.2.1', - 'id-qt-unotice' => '1.3.6.1.5.5.7.2.2', - 'id-ad-ocsp' => '1.3.6.1.5.5.7.48.1', - 'id-ad-caIssuers' => '1.3.6.1.5.5.7.48.2', - 'id-ad-timeStamping' => '1.3.6.1.5.5.7.48.3', - 'id-ad-caRepository' => '1.3.6.1.5.5.7.48.5', - //'id-at' => '2.5.4', - 'id-at-name' => '2.5.4.41', - 'id-at-surname' => '2.5.4.4', - 'id-at-givenName' => '2.5.4.42', - 'id-at-initials' => '2.5.4.43', - 'id-at-generationQualifier' => '2.5.4.44', - 'id-at-commonName' => '2.5.4.3', - 'id-at-localityName' => '2.5.4.7', - 'id-at-stateOrProvinceName' => '2.5.4.8', - 'id-at-organizationName' => '2.5.4.10', - 'id-at-organizationalUnitName' => '2.5.4.11', - 'id-at-title' => '2.5.4.12', - 'id-at-description' => '2.5.4.13', - 'id-at-dnQualifier' => '2.5.4.46', - 'id-at-countryName' => '2.5.4.6', - 'id-at-serialNumber' => '2.5.4.5', - 'id-at-pseudonym' => '2.5.4.65', - 'id-at-postalCode' => '2.5.4.17', - 'id-at-streetAddress' => '2.5.4.9', - 'id-at-uniqueIdentifier' => '2.5.4.45', - 'id-at-role' => '2.5.4.72', - 'id-at-postalAddress' => '2.5.4.16', - 'jurisdictionOfIncorporationCountryName' => '1.3.6.1.4.1.311.60.2.1.3', - 'jurisdictionOfIncorporationStateOrProvinceName' => '1.3.6.1.4.1.311.60.2.1.2', - 'jurisdictionLocalityName' => '1.3.6.1.4.1.311.60.2.1.1', - 'id-at-businessCategory' => '2.5.4.15', - - //'id-domainComponent' => '0.9.2342.19200300.100.1.25', - //'pkcs-9' => '1.2.840.113549.1.9', - 'pkcs-9-at-emailAddress' => '1.2.840.113549.1.9.1', - //'id-ce' => '2.5.29', - 'id-ce-authorityKeyIdentifier' => '2.5.29.35', - 'id-ce-subjectKeyIdentifier' => '2.5.29.14', - 'id-ce-keyUsage' => '2.5.29.15', - 'id-ce-privateKeyUsagePeriod' => '2.5.29.16', - 'id-ce-certificatePolicies' => '2.5.29.32', - //'anyPolicy' => '2.5.29.32.0', - - 'id-ce-policyMappings' => '2.5.29.33', - - 'id-ce-subjectAltName' => '2.5.29.17', - 'id-ce-issuerAltName' => '2.5.29.18', - 'id-ce-subjectDirectoryAttributes' => '2.5.29.9', - 'id-ce-basicConstraints' => '2.5.29.19', - 'id-ce-nameConstraints' => '2.5.29.30', - 'id-ce-policyConstraints' => '2.5.29.36', - 'id-ce-cRLDistributionPoints' => '2.5.29.31', - 'id-ce-extKeyUsage' => '2.5.29.37', - //'anyExtendedKeyUsage' => '2.5.29.37.0', - 'id-kp-serverAuth' => '1.3.6.1.5.5.7.3.1', - 'id-kp-clientAuth' => '1.3.6.1.5.5.7.3.2', - 'id-kp-codeSigning' => '1.3.6.1.5.5.7.3.3', - 'id-kp-emailProtection' => '1.3.6.1.5.5.7.3.4', - 'id-kp-timeStamping' => '1.3.6.1.5.5.7.3.8', - 'id-kp-OCSPSigning' => '1.3.6.1.5.5.7.3.9', - 'id-ce-inhibitAnyPolicy' => '2.5.29.54', - 'id-ce-freshestCRL' => '2.5.29.46', - 'id-pe-authorityInfoAccess' => '1.3.6.1.5.5.7.1.1', - 'id-pe-subjectInfoAccess' => '1.3.6.1.5.5.7.1.11', - 'id-ce-cRLNumber' => '2.5.29.20', - 'id-ce-issuingDistributionPoint' => '2.5.29.28', - 'id-ce-deltaCRLIndicator' => '2.5.29.27', - 'id-ce-cRLReasons' => '2.5.29.21', - 'id-ce-certificateIssuer' => '2.5.29.29', - 'id-ce-holdInstructionCode' => '2.5.29.23', - //'holdInstruction' => '1.2.840.10040.2', - 'id-holdinstruction-none' => '1.2.840.10040.2.1', - 'id-holdinstruction-callissuer' => '1.2.840.10040.2.2', - 'id-holdinstruction-reject' => '1.2.840.10040.2.3', - 'id-ce-invalidityDate' => '2.5.29.24', - - 'rsaEncryption' => '1.2.840.113549.1.1.1', - 'md2WithRSAEncryption' => '1.2.840.113549.1.1.2', - 'md5WithRSAEncryption' => '1.2.840.113549.1.1.4', - 'sha1WithRSAEncryption' => '1.2.840.113549.1.1.5', - 'sha224WithRSAEncryption' => '1.2.840.113549.1.1.14', - 'sha256WithRSAEncryption' => '1.2.840.113549.1.1.11', - 'sha384WithRSAEncryption' => '1.2.840.113549.1.1.12', - 'sha512WithRSAEncryption' => '1.2.840.113549.1.1.13', - - 'id-ecPublicKey' => '1.2.840.10045.2.1', - 'ecdsa-with-SHA1' => '1.2.840.10045.4.1', - // from https://tools.ietf.org/html/rfc5758#section-3.2 - 'ecdsa-with-SHA224' => '1.2.840.10045.4.3.1', - 'ecdsa-with-SHA256' => '1.2.840.10045.4.3.2', - 'ecdsa-with-SHA384' => '1.2.840.10045.4.3.3', - 'ecdsa-with-SHA512' => '1.2.840.10045.4.3.4', - - 'id-dsa' => '1.2.840.10040.4.1', - 'id-dsa-with-sha1' => '1.2.840.10040.4.3', - // from https://tools.ietf.org/html/rfc5758#section-3.1 - 'id-dsa-with-sha224' => '2.16.840.1.101.3.4.3.1', - 'id-dsa-with-sha256' => '2.16.840.1.101.3.4.3.2', - - // from https://tools.ietf.org/html/rfc8410: - 'id-Ed25519' => '1.3.101.112', - 'id-Ed448' => '1.3.101.113', - - 'id-RSASSA-PSS' => '1.2.840.113549.1.1.10', - - //'id-sha224' => '2.16.840.1.101.3.4.2.4', - //'id-sha256' => '2.16.840.1.101.3.4.2.1', - //'id-sha384' => '2.16.840.1.101.3.4.2.2', - //'id-sha512' => '2.16.840.1.101.3.4.2.3', - //'id-GostR3411-94-with-GostR3410-94' => '1.2.643.2.2.4', - //'id-GostR3411-94-with-GostR3410-2001' => '1.2.643.2.2.3', - //'id-GostR3410-2001' => '1.2.643.2.2.20', - //'id-GostR3410-94' => '1.2.643.2.2.19', - // Netscape Object Identifiers from "Netscape Certificate Extensions" - 'netscape' => '2.16.840.1.113730', - 'netscape-cert-extension' => '2.16.840.1.113730.1', - 'netscape-cert-type' => '2.16.840.1.113730.1.1', - 'netscape-comment' => '2.16.840.1.113730.1.13', - 'netscape-ca-policy-url' => '2.16.840.1.113730.1.8', - // the following are X.509 extensions not supported by phpseclib - 'id-pe-logotype' => '1.3.6.1.5.5.7.1.12', - 'entrustVersInfo' => '1.2.840.113533.7.65.0', - 'verisignPrivate' => '2.16.840.1.113733.1.6.9', - // for Certificate Signing Requests - // see http://tools.ietf.org/html/rfc2985 - 'pkcs-9-at-unstructuredName' => '1.2.840.113549.1.9.2', // PKCS #9 unstructured name - 'pkcs-9-at-challengePassword' => '1.2.840.113549.1.9.7', // Challenge password for certificate revocations - 'pkcs-9-at-extensionRequest' => '1.2.840.113549.1.9.14' // Certificate extension request - ]); - } - } - - /** - * Load X.509 certificate - * - * Returns an associative array describing the X.509 cert or a false if the cert failed to load - * - * @param array|string $cert - * @param int $mode - * @return mixed - */ - public function loadX509($cert, $mode = self::FORMAT_AUTO_DETECT) - { - if (is_array($cert) && isset($cert['tbsCertificate'])) { - unset($this->currentCert); - unset($this->currentKeyIdentifier); - $this->dn = $cert['tbsCertificate']['subject']; - if (!isset($this->dn)) { - return false; - } - $this->currentCert = $cert; - - $currentKeyIdentifier = $this->getExtension('id-ce-subjectKeyIdentifier'); - $this->currentKeyIdentifier = is_string($currentKeyIdentifier) ? $currentKeyIdentifier : null; - - unset($this->signatureSubject); - - return $cert; - } - - if ($mode != self::FORMAT_DER) { - $newcert = ASN1::extractBER($cert); - if ($mode == self::FORMAT_PEM && $cert == $newcert) { - return false; - } - $cert = $newcert; - } - - if ($cert === false) { - $this->currentCert = false; - return false; - } - - $decoded = ASN1::decodeBER($cert); - - if ($decoded) { - $x509 = ASN1::asn1map($decoded[0], Maps\Certificate::MAP); - } - if (!isset($x509) || $x509 === false) { - $this->currentCert = false; - return false; - } - - $this->signatureSubject = substr($cert, $decoded[0]['content'][0]['start'], $decoded[0]['content'][0]['length']); - - if ($this->isSubArrayValid($x509, 'tbsCertificate/extensions')) { - $this->mapInExtensions($x509, 'tbsCertificate/extensions'); - } - $this->mapInDNs($x509, 'tbsCertificate/issuer/rdnSequence'); - $this->mapInDNs($x509, 'tbsCertificate/subject/rdnSequence'); - - $key = $x509['tbsCertificate']['subjectPublicKeyInfo']; - $key = ASN1::encodeDER($key, Maps\SubjectPublicKeyInfo::MAP); - $x509['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey'] = - "-----BEGIN PUBLIC KEY-----\r\n" . - chunk_split(base64_encode($key), 64) . - "-----END PUBLIC KEY-----"; - - $this->currentCert = $x509; - $this->dn = $x509['tbsCertificate']['subject']; - - $currentKeyIdentifier = $this->getExtension('id-ce-subjectKeyIdentifier'); - $this->currentKeyIdentifier = is_string($currentKeyIdentifier) ? $currentKeyIdentifier : null; - - return $x509; - } - - /** - * Save X.509 certificate - * - * @param array $cert - * @param int $format optional - * @return string - */ - public function saveX509(array $cert, $format = self::FORMAT_PEM) - { - if (!is_array($cert) || !isset($cert['tbsCertificate'])) { - return false; - } - - switch (true) { - // "case !$a: case !$b: break; default: whatever();" is the same thing as "if ($a && $b) whatever()" - case !($algorithm = $this->subArray($cert, 'tbsCertificate/subjectPublicKeyInfo/algorithm/algorithm')): - case is_object($cert['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey']): - break; - default: - $cert['tbsCertificate']['subjectPublicKeyInfo'] = new Element( - base64_decode(preg_replace('#-.+-|[\r\n]#', '', $cert['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey'])) - ); - } - - $filters = []; - $type_utf8_string = ['type' => ASN1::TYPE_UTF8_STRING]; - $filters['tbsCertificate']['signature']['parameters'] = $type_utf8_string; - $filters['tbsCertificate']['signature']['issuer']['rdnSequence']['value'] = $type_utf8_string; - $filters['tbsCertificate']['issuer']['rdnSequence']['value'] = $type_utf8_string; - $filters['tbsCertificate']['subject']['rdnSequence']['value'] = $type_utf8_string; - $filters['tbsCertificate']['subjectPublicKeyInfo']['algorithm']['parameters'] = $type_utf8_string; - $filters['signatureAlgorithm']['parameters'] = $type_utf8_string; - $filters['authorityCertIssuer']['directoryName']['rdnSequence']['value'] = $type_utf8_string; - //$filters['policyQualifiers']['qualifier'] = $type_utf8_string; - $filters['distributionPoint']['fullName']['directoryName']['rdnSequence']['value'] = $type_utf8_string; - $filters['directoryName']['rdnSequence']['value'] = $type_utf8_string; - - foreach (self::$extensions as $extension) { - $filters['tbsCertificate']['extensions'][] = $extension; - } - - /* in the case of policyQualifiers/qualifier, the type has to be \phpseclib3\File\ASN1::TYPE_IA5_STRING. - \phpseclib3\File\ASN1::TYPE_PRINTABLE_STRING will cause OpenSSL's X.509 parser to spit out random - characters. - */ - $filters['policyQualifiers']['qualifier'] - = ['type' => ASN1::TYPE_IA5_STRING]; - - ASN1::setFilters($filters); - - $this->mapOutExtensions($cert, 'tbsCertificate/extensions'); - $this->mapOutDNs($cert, 'tbsCertificate/issuer/rdnSequence'); - $this->mapOutDNs($cert, 'tbsCertificate/subject/rdnSequence'); - - $cert = ASN1::encodeDER($cert, Maps\Certificate::MAP); - - switch ($format) { - case self::FORMAT_DER: - return $cert; - // case self::FORMAT_PEM: - default: - return "-----BEGIN CERTIFICATE-----\r\n" . chunk_split(Strings::base64_encode($cert), 64) . '-----END CERTIFICATE-----'; - } - } - - /** - * Map extension values from octet string to extension-specific internal - * format. - * - * @param array $root (by reference) - * @param string $path - */ - private function mapInExtensions(array &$root, $path) - { - $extensions = &$this->subArrayUnchecked($root, $path); - - if ($extensions) { - for ($i = 0; $i < count($extensions); $i++) { - $id = $extensions[$i]['extnId']; - $value = &$extensions[$i]['extnValue']; - /* [extnValue] contains the DER encoding of an ASN.1 value - corresponding to the extension type identified by extnID */ - $map = $this->getMapping($id); - if (!is_bool($map)) { - $decoder = $id == 'id-ce-nameConstraints' ? - [static::class, 'decodeNameConstraintIP'] : - [static::class, 'decodeIP']; - $decoded = ASN1::decodeBER($value); - if (!$decoded) { - continue; - } - $mapped = ASN1::asn1map($decoded[0], $map, ['iPAddress' => $decoder]); - $value = $mapped === false ? $decoded[0] : $mapped; - - if ($id == 'id-ce-certificatePolicies') { - for ($j = 0; $j < count($value); $j++) { - if (!isset($value[$j]['policyQualifiers'])) { - continue; - } - for ($k = 0; $k < count($value[$j]['policyQualifiers']); $k++) { - $subid = $value[$j]['policyQualifiers'][$k]['policyQualifierId']; - $map = $this->getMapping($subid); - $subvalue = &$value[$j]['policyQualifiers'][$k]['qualifier']; - if ($map !== false) { - $decoded = ASN1::decodeBER($subvalue); - if (!$decoded) { - continue; - } - $mapped = ASN1::asn1map($decoded[0], $map); - $subvalue = $mapped === false ? $decoded[0] : $mapped; - } - } - } - } - } - } - } - } - - /** - * Map extension values from extension-specific internal format to - * octet string. - * - * @param array $root (by reference) - * @param string $path - */ - private function mapOutExtensions(array &$root, $path) - { - $extensions = &$this->subArray($root, $path, !empty($this->extensionValues)); - - foreach ($this->extensionValues as $id => $data) { - $critical = $data['critical']; - $replace = $data['replace']; - $value = $data['value']; - $newext = [ - 'extnId' => $id, - 'extnValue' => $value, - 'critical' => $critical - ]; - if ($replace) { - foreach ($extensions as $key => $value) { - if ($value['extnId'] == $id) { - $extensions[$key] = $newext; - continue 2; - } - } - } - $extensions[] = $newext; - } - - if (is_array($extensions)) { - $size = count($extensions); - for ($i = 0; $i < $size; $i++) { - if ($extensions[$i] instanceof Element) { - continue; - } - - $id = $extensions[$i]['extnId']; - $value = &$extensions[$i]['extnValue']; - - switch ($id) { - case 'id-ce-certificatePolicies': - for ($j = 0; $j < count($value); $j++) { - if (!isset($value[$j]['policyQualifiers'])) { - continue; - } - for ($k = 0; $k < count($value[$j]['policyQualifiers']); $k++) { - $subid = $value[$j]['policyQualifiers'][$k]['policyQualifierId']; - $map = $this->getMapping($subid); - $subvalue = &$value[$j]['policyQualifiers'][$k]['qualifier']; - if ($map !== false) { - // by default \phpseclib3\File\ASN1 will try to render qualifier as a \phpseclib3\File\ASN1::TYPE_IA5_STRING since it's - // actual type is \phpseclib3\File\ASN1::TYPE_ANY - $subvalue = new Element(ASN1::encodeDER($subvalue, $map)); - } - } - } - break; - case 'id-ce-authorityKeyIdentifier': // use 00 as the serial number instead of an empty string - if (isset($value['authorityCertSerialNumber'])) { - if ($value['authorityCertSerialNumber']->toBytes() == '') { - $temp = chr((ASN1::CLASS_CONTEXT_SPECIFIC << 6) | 2) . "\1\0"; - $value['authorityCertSerialNumber'] = new Element($temp); - } - } - } - - /* [extnValue] contains the DER encoding of an ASN.1 value - corresponding to the extension type identified by extnID */ - $map = $this->getMapping($id); - if (is_bool($map)) { - if (!$map) { - //user_error($id . ' is not a currently supported extension'); - unset($extensions[$i]); - } - } else { - $value = ASN1::encodeDER($value, $map, ['iPAddress' => [static::class, 'encodeIP']]); - } - } - } - } - - /** - * Map attribute values from ANY type to attribute-specific internal - * format. - * - * @param array $root (by reference) - * @param string $path - */ - private function mapInAttributes(&$root, $path) - { - $attributes = &$this->subArray($root, $path); - - if (is_array($attributes)) { - for ($i = 0; $i < count($attributes); $i++) { - $id = $attributes[$i]['type']; - /* $value contains the DER encoding of an ASN.1 value - corresponding to the attribute type identified by type */ - $map = $this->getMapping($id); - if (is_array($attributes[$i]['value'])) { - $values = &$attributes[$i]['value']; - for ($j = 0; $j < count($values); $j++) { - $value = ASN1::encodeDER($values[$j], Maps\AttributeValue::MAP); - $decoded = ASN1::decodeBER($value); - if (!is_bool($map)) { - if (!$decoded) { - continue; - } - $mapped = ASN1::asn1map($decoded[0], $map); - if ($mapped !== false) { - $values[$j] = $mapped; - } - if ($id == 'pkcs-9-at-extensionRequest' && $this->isSubArrayValid($values, $j)) { - $this->mapInExtensions($values, $j); - } - } elseif ($map) { - $values[$j] = $value; - } - } - } - } - } - } - - /** - * Map attribute values from attribute-specific internal format to - * ANY type. - * - * @param array $root (by reference) - * @param string $path - */ - private function mapOutAttributes(&$root, $path) - { - $attributes = &$this->subArray($root, $path); - - if (is_array($attributes)) { - $size = count($attributes); - for ($i = 0; $i < $size; $i++) { - /* [value] contains the DER encoding of an ASN.1 value - corresponding to the attribute type identified by type */ - $id = $attributes[$i]['type']; - $map = $this->getMapping($id); - if ($map === false) { - //user_error($id . ' is not a currently supported attribute', E_USER_NOTICE); - unset($attributes[$i]); - } elseif (is_array($attributes[$i]['value'])) { - $values = &$attributes[$i]['value']; - for ($j = 0; $j < count($values); $j++) { - switch ($id) { - case 'pkcs-9-at-extensionRequest': - $this->mapOutExtensions($values, $j); - break; - } - - if (!is_bool($map)) { - $temp = ASN1::encodeDER($values[$j], $map); - $decoded = ASN1::decodeBER($temp); - if (!$decoded) { - continue; - } - $values[$j] = ASN1::asn1map($decoded[0], Maps\AttributeValue::MAP); - } - } - } - } - } - } - - /** - * Map DN values from ANY type to DN-specific internal - * format. - * - * @param array $root (by reference) - * @param string $path - */ - private function mapInDNs(array &$root, $path) - { - $dns = &$this->subArray($root, $path); - - if (is_array($dns)) { - for ($i = 0; $i < count($dns); $i++) { - for ($j = 0; $j < count($dns[$i]); $j++) { - $type = $dns[$i][$j]['type']; - $value = &$dns[$i][$j]['value']; - if (is_object($value) && $value instanceof Element) { - $map = $this->getMapping($type); - if (!is_bool($map)) { - $decoded = ASN1::decodeBER($value); - if (!$decoded) { - continue; - } - $value = ASN1::asn1map($decoded[0], $map); - } - } - } - } - } - } - - /** - * Map DN values from DN-specific internal format to - * ANY type. - * - * @param array $root (by reference) - * @param string $path - */ - private function mapOutDNs(array &$root, $path) - { - $dns = &$this->subArray($root, $path); - - if (is_array($dns)) { - $size = count($dns); - for ($i = 0; $i < $size; $i++) { - for ($j = 0; $j < count($dns[$i]); $j++) { - $type = $dns[$i][$j]['type']; - $value = &$dns[$i][$j]['value']; - if (is_object($value) && $value instanceof Element) { - continue; - } - - $map = $this->getMapping($type); - if (!is_bool($map)) { - $value = new Element(ASN1::encodeDER($value, $map)); - } - } - } - } - } - - /** - * Associate an extension ID to an extension mapping - * - * @param string $extnId - * @return mixed - */ - private function getMapping($extnId) - { - if (!is_string($extnId)) { // eg. if it's a \phpseclib3\File\ASN1\Element object - return true; - } - - if (isset(self::$extensions[$extnId])) { - return self::$extensions[$extnId]; - } - - switch ($extnId) { - case 'id-ce-keyUsage': - return Maps\KeyUsage::MAP; - case 'id-ce-basicConstraints': - return Maps\BasicConstraints::MAP; - case 'id-ce-subjectKeyIdentifier': - return Maps\KeyIdentifier::MAP; - case 'id-ce-cRLDistributionPoints': - return Maps\CRLDistributionPoints::MAP; - case 'id-ce-authorityKeyIdentifier': - return Maps\AuthorityKeyIdentifier::MAP; - case 'id-ce-certificatePolicies': - return Maps\CertificatePolicies::MAP; - case 'id-ce-extKeyUsage': - return Maps\ExtKeyUsageSyntax::MAP; - case 'id-pe-authorityInfoAccess': - return Maps\AuthorityInfoAccessSyntax::MAP; - case 'id-ce-subjectAltName': - return Maps\SubjectAltName::MAP; - case 'id-ce-subjectDirectoryAttributes': - return Maps\SubjectDirectoryAttributes::MAP; - case 'id-ce-privateKeyUsagePeriod': - return Maps\PrivateKeyUsagePeriod::MAP; - case 'id-ce-issuerAltName': - return Maps\IssuerAltName::MAP; - case 'id-ce-policyMappings': - return Maps\PolicyMappings::MAP; - case 'id-ce-nameConstraints': - return Maps\NameConstraints::MAP; - - case 'netscape-cert-type': - return Maps\netscape_cert_type::MAP; - case 'netscape-comment': - return Maps\netscape_comment::MAP; - case 'netscape-ca-policy-url': - return Maps\netscape_ca_policy_url::MAP; - - // since id-qt-cps isn't a constructed type it will have already been decoded as a string by the time it gets - // back around to asn1map() and we don't want it decoded again. - //case 'id-qt-cps': - // return Maps\CPSuri::MAP; - case 'id-qt-unotice': - return Maps\UserNotice::MAP; - - // the following OIDs are unsupported but we don't want them to give notices when calling saveX509(). - case 'id-pe-logotype': // http://www.ietf.org/rfc/rfc3709.txt - case 'entrustVersInfo': - // http://support.microsoft.com/kb/287547 - case '1.3.6.1.4.1.311.20.2': // szOID_ENROLL_CERTTYPE_EXTENSION - case '1.3.6.1.4.1.311.21.1': // szOID_CERTSRV_CA_VERSION - // "SET Secure Electronic Transaction Specification" - // http://www.maithean.com/docs/set_bk3.pdf - case '2.23.42.7.0': // id-set-hashedRootKey - // "Certificate Transparency" - // https://tools.ietf.org/html/rfc6962 - case '1.3.6.1.4.1.11129.2.4.2': - // "Qualified Certificate statements" - // https://tools.ietf.org/html/rfc3739#section-3.2.6 - case '1.3.6.1.5.5.7.1.3': - return true; - - // CSR attributes - case 'pkcs-9-at-unstructuredName': - return Maps\PKCS9String::MAP; - case 'pkcs-9-at-challengePassword': - return Maps\DirectoryString::MAP; - case 'pkcs-9-at-extensionRequest': - return Maps\Extensions::MAP; - - // CRL extensions. - case 'id-ce-cRLNumber': - return Maps\CRLNumber::MAP; - case 'id-ce-deltaCRLIndicator': - return Maps\CRLNumber::MAP; - case 'id-ce-issuingDistributionPoint': - return Maps\IssuingDistributionPoint::MAP; - case 'id-ce-freshestCRL': - return Maps\CRLDistributionPoints::MAP; - case 'id-ce-cRLReasons': - return Maps\CRLReason::MAP; - case 'id-ce-invalidityDate': - return Maps\InvalidityDate::MAP; - case 'id-ce-certificateIssuer': - return Maps\CertificateIssuer::MAP; - case 'id-ce-holdInstructionCode': - return Maps\HoldInstructionCode::MAP; - case 'id-at-postalAddress': - return Maps\PostalAddress::MAP; - } - - return false; - } - - /** - * Load an X.509 certificate as a certificate authority - * - * @param string $cert - * @return bool - */ - public function loadCA($cert) - { - $olddn = $this->dn; - $oldcert = $this->currentCert; - $oldsigsubj = $this->signatureSubject; - $oldkeyid = $this->currentKeyIdentifier; - - $cert = $this->loadX509($cert); - if (!$cert) { - $this->dn = $olddn; - $this->currentCert = $oldcert; - $this->signatureSubject = $oldsigsubj; - $this->currentKeyIdentifier = $oldkeyid; - - return false; - } - - /* From RFC5280 "PKIX Certificate and CRL Profile": - - If the keyUsage extension is present, then the subject public key - MUST NOT be used to verify signatures on certificates or CRLs unless - the corresponding keyCertSign or cRLSign bit is set. */ - //$keyUsage = $this->getExtension('id-ce-keyUsage'); - //if ($keyUsage && !in_array('keyCertSign', $keyUsage)) { - // return false; - //} - - /* From RFC5280 "PKIX Certificate and CRL Profile": - - The cA boolean indicates whether the certified public key may be used - to verify certificate signatures. If the cA boolean is not asserted, - then the keyCertSign bit in the key usage extension MUST NOT be - asserted. If the basic constraints extension is not present in a - version 3 certificate, or the extension is present but the cA boolean - is not asserted, then the certified public key MUST NOT be used to - verify certificate signatures. */ - //$basicConstraints = $this->getExtension('id-ce-basicConstraints'); - //if (!$basicConstraints || !$basicConstraints['cA']) { - // return false; - //} - - $this->CAs[] = $cert; - - $this->dn = $olddn; - $this->currentCert = $oldcert; - $this->signatureSubject = $oldsigsubj; - - return true; - } - - /** - * Validate an X.509 certificate against a URL - * - * From RFC2818 "HTTP over TLS": - * - * Matching is performed using the matching rules specified by - * [RFC2459]. If more than one identity of a given type is present in - * the certificate (e.g., more than one dNSName name, a match in any one - * of the set is considered acceptable.) Names may contain the wildcard - * character * which is considered to match any single domain name - * component or component fragment. E.g., *.a.com matches foo.a.com but - * not bar.foo.a.com. f*.com matches foo.com but not bar.com. - * - * @param string $url - * @return bool - */ - public function validateURL($url) - { - if (!is_array($this->currentCert) || !isset($this->currentCert['tbsCertificate'])) { - return false; - } - - $components = parse_url($url); - if (!isset($components['host'])) { - return false; - } - - if ($names = $this->getExtension('id-ce-subjectAltName')) { - foreach ($names as $name) { - foreach ($name as $key => $value) { - $value = preg_quote($value); - $value = str_replace('\*', '[^.]*', $value); - switch ($key) { - case 'dNSName': - /* From RFC2818 "HTTP over TLS": - - If a subjectAltName extension of type dNSName is present, that MUST - be used as the identity. Otherwise, the (most specific) Common Name - field in the Subject field of the certificate MUST be used. Although - the use of the Common Name is existing practice, it is deprecated and - Certification Authorities are encouraged to use the dNSName instead. */ - if (preg_match('#^' . $value . '$#', $components['host'])) { - return true; - } - break; - case 'iPAddress': - /* From RFC2818 "HTTP over TLS": - - In some cases, the URI is specified as an IP address rather than a - hostname. In this case, the iPAddress subjectAltName must be present - in the certificate and must exactly match the IP in the URI. */ - if (preg_match('#(?:\d{1-3}\.){4}#', $components['host'] . '.') && preg_match('#^' . $value . '$#', $components['host'])) { - return true; - } - } - } - } - return false; - } - - if ($value = $this->getDNProp('id-at-commonName')) { - $value = str_replace(['.', '*'], ['\.', '[^.]*'], $value[0]); - return preg_match('#^' . $value . '$#', $components['host']) === 1; - } - - return false; - } - - /** - * Validate a date - * - * If $date isn't defined it is assumed to be the current date. - * - * @param \DateTimeInterface|string $date optional - * @return bool - */ - public function validateDate($date = null) - { - if (!is_array($this->currentCert) || !isset($this->currentCert['tbsCertificate'])) { - return false; - } - - if (!isset($date)) { - $date = new \DateTimeImmutable('now', new \DateTimeZone(@date_default_timezone_get())); - } - - $notBefore = $this->currentCert['tbsCertificate']['validity']['notBefore']; - $notBefore = isset($notBefore['generalTime']) ? $notBefore['generalTime'] : $notBefore['utcTime']; - - $notAfter = $this->currentCert['tbsCertificate']['validity']['notAfter']; - $notAfter = isset($notAfter['generalTime']) ? $notAfter['generalTime'] : $notAfter['utcTime']; - - if (is_string($date)) { - $date = new \DateTimeImmutable($date, new \DateTimeZone(@date_default_timezone_get())); - } - - $notBefore = new \DateTimeImmutable($notBefore, new \DateTimeZone(@date_default_timezone_get())); - $notAfter = new \DateTimeImmutable($notAfter, new \DateTimeZone(@date_default_timezone_get())); - - return $date >= $notBefore && $date <= $notAfter; - } - - /** - * Fetches a URL - * - * @param string $url - * @return bool|string - */ - private static function fetchURL($url) - { - if (self::$disable_url_fetch) { - return false; - } - - $parts = parse_url($url); - $data = ''; - switch ($parts['scheme']) { - case 'http': - $fsock = @fsockopen($parts['host'], isset($parts['port']) ? $parts['port'] : 80); - if (!$fsock) { - return false; - } - $path = $parts['path']; - if (isset($parts['query'])) { - $path .= '?' . $parts['query']; - } - fputs($fsock, "GET $path HTTP/1.0\r\n"); - fputs($fsock, "Host: $parts[host]\r\n\r\n"); - $line = fgets($fsock, 1024); - if (strlen($line) < 3) { - return false; - } - preg_match('#HTTP/1.\d (\d{3})#', $line, $temp); - if ($temp[1] != '200') { - return false; - } - - // skip the rest of the headers in the http response - while (!feof($fsock) && fgets($fsock, 1024) != "\r\n") { - } - - while (!feof($fsock)) { - $temp = fread($fsock, 1024); - if ($temp === false) { - return false; - } - $data .= $temp; - } - - break; - //case 'ftp': - //case 'ldap': - //default: - } - - return $data; - } - - /** - * Validates an intermediate cert as identified via authority info access extension - * - * See https://tools.ietf.org/html/rfc4325 for more info - * - * @param bool $caonly - * @param int $count - * @return bool - */ - private function testForIntermediate($caonly, $count) - { - $opts = $this->getExtension('id-pe-authorityInfoAccess'); - if (!is_array($opts)) { - return false; - } - foreach ($opts as $opt) { - if ($opt['accessMethod'] == 'id-ad-caIssuers') { - // accessLocation is a GeneralName. GeneralName fields support stuff like email addresses, IP addresses, LDAP, - // etc, but we're only supporting URI's. URI's and LDAP are the only thing https://tools.ietf.org/html/rfc4325 - // discusses - if (isset($opt['accessLocation']['uniformResourceIdentifier'])) { - $url = $opt['accessLocation']['uniformResourceIdentifier']; - break; - } - } - } - - if (!isset($url)) { - return false; - } - - $cert = static::fetchURL($url); - if (!is_string($cert)) { - return false; - } - - $parent = new static(); - $parent->CAs = $this->CAs; - /* - "Conforming applications that support HTTP or FTP for accessing - certificates MUST be able to accept .cer files and SHOULD be able - to accept .p7c files." -- https://tools.ietf.org/html/rfc4325 - - A .p7c file is 'a "certs-only" CMS message as specified in RFC 2797" - - These are currently unsupported - */ - if (!is_array($parent->loadX509($cert))) { - return false; - } - - if (!$parent->validateSignatureCountable($caonly, ++$count)) { - return false; - } - - $this->CAs[] = $parent->currentCert; - //$this->loadCA($cert); - - return true; - } - - /** - * Validate a signature - * - * Works on X.509 certs, CSR's and CRL's. - * Returns true if the signature is verified, false if it is not correct or null on error - * - * By default returns false for self-signed certs. Call validateSignature(false) to make this support - * self-signed. - * - * The behavior of this function is inspired by {@link http://php.net/openssl-verify openssl_verify}. - * - * @param bool $caonly optional - * @return mixed - */ - public function validateSignature($caonly = true) - { - return $this->validateSignatureCountable($caonly, 0); - } - - /** - * Validate a signature - * - * Performs said validation whilst keeping track of how many times validation method is called - * - * @param bool $caonly - * @param int $count - * @return mixed - */ - private function validateSignatureCountable($caonly, $count) - { - if (!is_array($this->currentCert) || !isset($this->signatureSubject)) { - return null; - } - - if ($count == self::$recur_limit) { - return false; - } - - /* TODO: - "emailAddress attribute values are not case-sensitive (e.g., "subscriber@example.com" is the same as "SUBSCRIBER@EXAMPLE.COM")." - -- http://tools.ietf.org/html/rfc5280#section-4.1.2.6 - - implement pathLenConstraint in the id-ce-basicConstraints extension */ - - switch (true) { - case isset($this->currentCert['tbsCertificate']): - // self-signed cert - switch (true) { - case !defined('FILE_X509_IGNORE_TYPE') && $this->currentCert['tbsCertificate']['issuer'] === $this->currentCert['tbsCertificate']['subject']: - case defined('FILE_X509_IGNORE_TYPE') && $this->getIssuerDN(self::DN_STRING) === $this->getDN(self::DN_STRING): - $authorityKey = $this->getExtension('id-ce-authorityKeyIdentifier'); - $subjectKeyID = $this->getExtension('id-ce-subjectKeyIdentifier'); - switch (true) { - case !is_array($authorityKey): - case !$subjectKeyID: - case isset($authorityKey['keyIdentifier']) && $authorityKey['keyIdentifier'] === $subjectKeyID: - $signingCert = $this->currentCert; // working cert - } - } - - if (!empty($this->CAs)) { - for ($i = 0; $i < count($this->CAs); $i++) { - // even if the cert is a self-signed one we still want to see if it's a CA; - // if not, we'll conditionally return an error - $ca = $this->CAs[$i]; - switch (true) { - case !defined('FILE_X509_IGNORE_TYPE') && $this->currentCert['tbsCertificate']['issuer'] === $ca['tbsCertificate']['subject']: - case defined('FILE_X509_IGNORE_TYPE') && $this->getDN(self::DN_STRING, $this->currentCert['tbsCertificate']['issuer']) === $this->getDN(self::DN_STRING, $ca['tbsCertificate']['subject']): - $authorityKey = $this->getExtension('id-ce-authorityKeyIdentifier'); - $subjectKeyID = $this->getExtension('id-ce-subjectKeyIdentifier', $ca); - switch (true) { - case !is_array($authorityKey): - case !$subjectKeyID: - case isset($authorityKey['keyIdentifier']) && $authorityKey['keyIdentifier'] === $subjectKeyID: - if (is_array($authorityKey) && isset($authorityKey['authorityCertSerialNumber']) && !$authorityKey['authorityCertSerialNumber']->equals($ca['tbsCertificate']['serialNumber'])) { - break 2; // serial mismatch - check other ca - } - $signingCert = $ca; // working cert - break 3; - } - } - } - if (count($this->CAs) == $i && $caonly) { - return $this->testForIntermediate($caonly, $count) && $this->validateSignature($caonly); - } - } elseif (!isset($signingCert) || $caonly) { - return $this->testForIntermediate($caonly, $count) && $this->validateSignature($caonly); - } - return $this->validateSignatureHelper( - $signingCert['tbsCertificate']['subjectPublicKeyInfo']['algorithm']['algorithm'], - $signingCert['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey'], - $this->currentCert['signatureAlgorithm']['algorithm'], - substr($this->currentCert['signature'], 1), - $this->signatureSubject - ); - case isset($this->currentCert['certificationRequestInfo']): - return $this->validateSignatureHelper( - $this->currentCert['certificationRequestInfo']['subjectPKInfo']['algorithm']['algorithm'], - $this->currentCert['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey'], - $this->currentCert['signatureAlgorithm']['algorithm'], - substr($this->currentCert['signature'], 1), - $this->signatureSubject - ); - case isset($this->currentCert['publicKeyAndChallenge']): - return $this->validateSignatureHelper( - $this->currentCert['publicKeyAndChallenge']['spki']['algorithm']['algorithm'], - $this->currentCert['publicKeyAndChallenge']['spki']['subjectPublicKey'], - $this->currentCert['signatureAlgorithm']['algorithm'], - substr($this->currentCert['signature'], 1), - $this->signatureSubject - ); - case isset($this->currentCert['tbsCertList']): - if (!empty($this->CAs)) { - for ($i = 0; $i < count($this->CAs); $i++) { - $ca = $this->CAs[$i]; - switch (true) { - case !defined('FILE_X509_IGNORE_TYPE') && $this->currentCert['tbsCertList']['issuer'] === $ca['tbsCertificate']['subject']: - case defined('FILE_X509_IGNORE_TYPE') && $this->getDN(self::DN_STRING, $this->currentCert['tbsCertList']['issuer']) === $this->getDN(self::DN_STRING, $ca['tbsCertificate']['subject']): - $authorityKey = $this->getExtension('id-ce-authorityKeyIdentifier'); - $subjectKeyID = $this->getExtension('id-ce-subjectKeyIdentifier', $ca); - switch (true) { - case !is_array($authorityKey): - case !$subjectKeyID: - case isset($authorityKey['keyIdentifier']) && $authorityKey['keyIdentifier'] === $subjectKeyID: - if (is_array($authorityKey) && isset($authorityKey['authorityCertSerialNumber']) && !$authorityKey['authorityCertSerialNumber']->equals($ca['tbsCertificate']['serialNumber'])) { - break 2; // serial mismatch - check other ca - } - $signingCert = $ca; // working cert - break 3; - } - } - } - } - if (!isset($signingCert)) { - return false; - } - return $this->validateSignatureHelper( - $signingCert['tbsCertificate']['subjectPublicKeyInfo']['algorithm']['algorithm'], - $signingCert['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey'], - $this->currentCert['signatureAlgorithm']['algorithm'], - substr($this->currentCert['signature'], 1), - $this->signatureSubject - ); - default: - return false; - } - } - - /** - * Validates a signature - * - * Returns true if the signature is verified and false if it is not correct. - * If the algorithms are unsupposed an exception is thrown. - * - * @param string $publicKeyAlgorithm - * @param string $publicKey - * @param string $signatureAlgorithm - * @param string $signature - * @param string $signatureSubject - * @throws UnsupportedAlgorithmException if the algorithm is unsupported - * @return bool - */ - private function validateSignatureHelper($publicKeyAlgorithm, $publicKey, $signatureAlgorithm, $signature, $signatureSubject) - { - switch ($publicKeyAlgorithm) { - case 'id-RSASSA-PSS': - $key = RSA::loadFormat('PSS', $publicKey); - break; - case 'rsaEncryption': - $key = RSA::loadFormat('PKCS8', $publicKey); - switch ($signatureAlgorithm) { - case 'id-RSASSA-PSS': - break; - case 'md2WithRSAEncryption': - case 'md5WithRSAEncryption': - case 'sha1WithRSAEncryption': - case 'sha224WithRSAEncryption': - case 'sha256WithRSAEncryption': - case 'sha384WithRSAEncryption': - case 'sha512WithRSAEncryption': - $key = $key - ->withHash(preg_replace('#WithRSAEncryption$#', '', $signatureAlgorithm)) - ->withPadding(RSA::SIGNATURE_PKCS1); - break; - default: - throw new UnsupportedAlgorithmException('Signature algorithm unsupported'); - } - break; - case 'id-Ed25519': - case 'id-Ed448': - $key = EC::loadFormat('PKCS8', $publicKey); - break; - case 'id-ecPublicKey': - $key = EC::loadFormat('PKCS8', $publicKey); - switch ($signatureAlgorithm) { - case 'ecdsa-with-SHA1': - case 'ecdsa-with-SHA224': - case 'ecdsa-with-SHA256': - case 'ecdsa-with-SHA384': - case 'ecdsa-with-SHA512': - $key = $key - ->withHash(preg_replace('#^ecdsa-with-#', '', strtolower($signatureAlgorithm))); - break; - default: - throw new UnsupportedAlgorithmException('Signature algorithm unsupported'); - } - break; - case 'id-dsa': - $key = DSA::loadFormat('PKCS8', $publicKey); - switch ($signatureAlgorithm) { - case 'id-dsa-with-sha1': - case 'id-dsa-with-sha224': - case 'id-dsa-with-sha256': - $key = $key - ->withHash(preg_replace('#^id-dsa-with-#', '', strtolower($signatureAlgorithm))); - break; - default: - throw new UnsupportedAlgorithmException('Signature algorithm unsupported'); - } - break; - default: - throw new UnsupportedAlgorithmException('Public key algorithm unsupported'); - } - - return $key->verify($signatureSubject, $signature); - } - - /** - * Sets the recursion limit - * - * When validating a signature it may be necessary to download intermediate certs from URI's. - * An intermediate cert that linked to itself would result in an infinite loop so to prevent - * that we set a recursion limit. A negative number means that there is no recursion limit. - * - * @param int $count - */ - public static function setRecurLimit($count) - { - self::$recur_limit = $count; - } - - /** - * Prevents URIs from being automatically retrieved - * - */ - public static function disableURLFetch() - { - self::$disable_url_fetch = true; - } - - /** - * Allows URIs to be automatically retrieved - * - */ - public static function enableURLFetch() - { - self::$disable_url_fetch = false; - } - - /** - * Decodes an IP address - * - * Takes in a base64 encoded "blob" and returns a human readable IP address - * - * @param string $ip - * @return string - */ - public static function decodeIP($ip) - { - return inet_ntop($ip); - } - - /** - * Decodes an IP address in a name constraints extension - * - * Takes in a base64 encoded "blob" and returns a human readable IP address / mask - * - * @param string $ip - * @return array - */ - public static function decodeNameConstraintIP($ip) - { - $size = strlen($ip) >> 1; - $mask = substr($ip, $size); - $ip = substr($ip, 0, $size); - return [inet_ntop($ip), inet_ntop($mask)]; - } - - /** - * Encodes an IP address - * - * Takes a human readable IP address into a base64-encoded "blob" - * - * @param string|array $ip - * @return string - */ - public static function encodeIP($ip) - { - return is_string($ip) ? - inet_pton($ip) : - inet_pton($ip[0]) . inet_pton($ip[1]); - } - - /** - * "Normalizes" a Distinguished Name property - * - * @param string $propName - * @return mixed - */ - private function translateDNProp($propName) - { - switch (strtolower($propName)) { - case 'jurisdictionofincorporationcountryname': - case 'jurisdictioncountryname': - case 'jurisdictionc': - return 'jurisdictionOfIncorporationCountryName'; - case 'jurisdictionofincorporationstateorprovincename': - case 'jurisdictionstateorprovincename': - case 'jurisdictionst': - return 'jurisdictionOfIncorporationStateOrProvinceName'; - case 'jurisdictionlocalityname': - case 'jurisdictionl': - return 'jurisdictionLocalityName'; - case 'id-at-businesscategory': - case 'businesscategory': - return 'id-at-businessCategory'; - case 'id-at-countryname': - case 'countryname': - case 'c': - return 'id-at-countryName'; - case 'id-at-organizationname': - case 'organizationname': - case 'o': - return 'id-at-organizationName'; - case 'id-at-dnqualifier': - case 'dnqualifier': - return 'id-at-dnQualifier'; - case 'id-at-commonname': - case 'commonname': - case 'cn': - return 'id-at-commonName'; - case 'id-at-stateorprovincename': - case 'stateorprovincename': - case 'state': - case 'province': - case 'provincename': - case 'st': - return 'id-at-stateOrProvinceName'; - case 'id-at-localityname': - case 'localityname': - case 'l': - return 'id-at-localityName'; - case 'id-emailaddress': - case 'emailaddress': - return 'pkcs-9-at-emailAddress'; - case 'id-at-serialnumber': - case 'serialnumber': - return 'id-at-serialNumber'; - case 'id-at-postalcode': - case 'postalcode': - return 'id-at-postalCode'; - case 'id-at-streetaddress': - case 'streetaddress': - return 'id-at-streetAddress'; - case 'id-at-name': - case 'name': - return 'id-at-name'; - case 'id-at-givenname': - case 'givenname': - return 'id-at-givenName'; - case 'id-at-surname': - case 'surname': - case 'sn': - return 'id-at-surname'; - case 'id-at-initials': - case 'initials': - return 'id-at-initials'; - case 'id-at-generationqualifier': - case 'generationqualifier': - return 'id-at-generationQualifier'; - case 'id-at-organizationalunitname': - case 'organizationalunitname': - case 'ou': - return 'id-at-organizationalUnitName'; - case 'id-at-pseudonym': - case 'pseudonym': - return 'id-at-pseudonym'; - case 'id-at-title': - case 'title': - return 'id-at-title'; - case 'id-at-description': - case 'description': - return 'id-at-description'; - case 'id-at-role': - case 'role': - return 'id-at-role'; - case 'id-at-uniqueidentifier': - case 'uniqueidentifier': - case 'x500uniqueidentifier': - return 'id-at-uniqueIdentifier'; - case 'postaladdress': - case 'id-at-postaladdress': - return 'id-at-postalAddress'; - default: - return false; - } - } - - /** - * Set a Distinguished Name property - * - * @param string $propName - * @param mixed $propValue - * @param string $type optional - * @return bool - */ - public function setDNProp($propName, $propValue, $type = 'utf8String') - { - if (empty($this->dn)) { - $this->dn = ['rdnSequence' => []]; - } - - if (($propName = $this->translateDNProp($propName)) === false) { - return false; - } - - foreach ((array) $propValue as $v) { - if (!is_array($v) && isset($type)) { - $v = [$type => $v]; - } - $this->dn['rdnSequence'][] = [ - [ - 'type' => $propName, - 'value' => $v - ] - ]; - } - - return true; - } - - /** - * Remove Distinguished Name properties - * - * @param string $propName - */ - public function removeDNProp($propName) - { - if (empty($this->dn)) { - return; - } - - if (($propName = $this->translateDNProp($propName)) === false) { - return; - } - - $dn = &$this->dn['rdnSequence']; - $size = count($dn); - for ($i = 0; $i < $size; $i++) { - if ($dn[$i][0]['type'] == $propName) { - unset($dn[$i]); - } - } - - $dn = array_values($dn); - // fix for https://bugs.php.net/75433 affecting PHP 7.2 - if (!isset($dn[0])) { - $dn = array_splice($dn, 0, 0); - } - } - - /** - * Get Distinguished Name properties - * - * @param string $propName - * @param array $dn optional - * @param bool $withType optional - * @return mixed - */ - public function getDNProp($propName, $dn = null, $withType = false) - { - if (!isset($dn)) { - $dn = $this->dn; - } - - if (empty($dn)) { - return false; - } - - if (($propName = $this->translateDNProp($propName)) === false) { - return false; - } - - $filters = []; - $filters['value'] = ['type' => ASN1::TYPE_UTF8_STRING]; - ASN1::setFilters($filters); - $this->mapOutDNs($dn, 'rdnSequence'); - $dn = $dn['rdnSequence']; - $result = []; - for ($i = 0; $i < count($dn); $i++) { - if ($dn[$i][0]['type'] == $propName) { - $v = $dn[$i][0]['value']; - if (!$withType) { - if (is_array($v)) { - foreach ($v as $type => $s) { - $type = array_search($type, ASN1::ANY_MAP); - if ($type !== false && array_key_exists($type, ASN1::STRING_TYPE_SIZE)) { - $s = ASN1::convert($s, $type); - if ($s !== false) { - $v = $s; - break; - } - } - } - if (is_array($v)) { - $v = array_pop($v); // Always strip data type. - } - } elseif (is_object($v) && $v instanceof Element) { - $map = $this->getMapping($propName); - if (!is_bool($map)) { - $decoded = ASN1::decodeBER($v); - if (!$decoded) { - return false; - } - $v = ASN1::asn1map($decoded[0], $map); - } - } - } - $result[] = $v; - } - } - - return $result; - } - - /** - * Set a Distinguished Name - * - * @param mixed $dn - * @param bool $merge optional - * @param string $type optional - * @return bool - */ - public function setDN($dn, $merge = false, $type = 'utf8String') - { - if (!$merge) { - $this->dn = null; - } - - if (is_array($dn)) { - if (isset($dn['rdnSequence'])) { - $this->dn = $dn; // No merge here. - return true; - } - - // handles stuff generated by openssl_x509_parse() - foreach ($dn as $prop => $value) { - if (!$this->setDNProp($prop, $value, $type)) { - return false; - } - } - return true; - } - - // handles everything else - $results = preg_split('#((?:^|, *|/)(?:C=|O=|OU=|CN=|L=|ST=|SN=|postalCode=|streetAddress=|emailAddress=|serialNumber=|organizationalUnitName=|title=|description=|role=|x500UniqueIdentifier=|postalAddress=))#', $dn, -1, PREG_SPLIT_DELIM_CAPTURE); - for ($i = 1; $i < count($results); $i += 2) { - $prop = trim($results[$i], ', =/'); - $value = $results[$i + 1]; - if (!$this->setDNProp($prop, $value, $type)) { - return false; - } - } - - return true; - } - - /** - * Get the Distinguished Name for a certificates subject - * - * @param mixed $format optional - * @param array $dn optional - * @return array|bool|string - */ - public function getDN($format = self::DN_ARRAY, $dn = null) - { - if (!isset($dn)) { - $dn = isset($this->currentCert['tbsCertList']) ? $this->currentCert['tbsCertList']['issuer'] : $this->dn; - } - - switch ((int) $format) { - case self::DN_ARRAY: - return $dn; - case self::DN_ASN1: - $filters = []; - $filters['rdnSequence']['value'] = ['type' => ASN1::TYPE_UTF8_STRING]; - ASN1::setFilters($filters); - $this->mapOutDNs($dn, 'rdnSequence'); - return ASN1::encodeDER($dn, Maps\Name::MAP); - case self::DN_CANON: - // No SEQUENCE around RDNs and all string values normalized as - // trimmed lowercase UTF-8 with all spacing as one blank. - // constructed RDNs will not be canonicalized - $filters = []; - $filters['value'] = ['type' => ASN1::TYPE_UTF8_STRING]; - ASN1::setFilters($filters); - $result = ''; - $this->mapOutDNs($dn, 'rdnSequence'); - foreach ($dn['rdnSequence'] as $rdn) { - foreach ($rdn as $i => $attr) { - $attr = &$rdn[$i]; - if (is_array($attr['value'])) { - foreach ($attr['value'] as $type => $v) { - $type = array_search($type, ASN1::ANY_MAP, true); - if ($type !== false && array_key_exists($type, ASN1::STRING_TYPE_SIZE)) { - $v = ASN1::convert($v, $type); - if ($v !== false) { - $v = preg_replace('/\s+/', ' ', $v); - $attr['value'] = strtolower(trim($v)); - break; - } - } - } - } - } - $result .= ASN1::encodeDER($rdn, Maps\RelativeDistinguishedName::MAP); - } - return $result; - case self::DN_HASH: - $dn = $this->getDN(self::DN_CANON, $dn); - $hash = new Hash('sha1'); - $hash = $hash->hash($dn); - $hash = unpack('Vhash', $hash)['hash']; - return strtolower(Strings::bin2hex(pack('N', $hash))); - } - - // Default is to return a string. - $start = true; - $output = ''; - - $result = []; - $filters = []; - $filters['rdnSequence']['value'] = ['type' => ASN1::TYPE_UTF8_STRING]; - ASN1::setFilters($filters); - $this->mapOutDNs($dn, 'rdnSequence'); - - foreach ($dn['rdnSequence'] as $field) { - $prop = $field[0]['type']; - $value = $field[0]['value']; - - $delim = ', '; - switch ($prop) { - case 'id-at-countryName': - $desc = 'C'; - break; - case 'id-at-stateOrProvinceName': - $desc = 'ST'; - break; - case 'id-at-organizationName': - $desc = 'O'; - break; - case 'id-at-organizationalUnitName': - $desc = 'OU'; - break; - case 'id-at-commonName': - $desc = 'CN'; - break; - case 'id-at-localityName': - $desc = 'L'; - break; - case 'id-at-surname': - $desc = 'SN'; - break; - case 'id-at-uniqueIdentifier': - $delim = '/'; - $desc = 'x500UniqueIdentifier'; - break; - case 'id-at-postalAddress': - $delim = '/'; - $desc = 'postalAddress'; - break; - default: - $delim = '/'; - $desc = preg_replace('#.+-([^-]+)$#', '$1', $prop); - } - - if (!$start) { - $output .= $delim; - } - if (is_array($value)) { - foreach ($value as $type => $v) { - $type = array_search($type, ASN1::ANY_MAP, true); - if ($type !== false && array_key_exists($type, ASN1::STRING_TYPE_SIZE)) { - $v = ASN1::convert($v, $type); - if ($v !== false) { - $value = $v; - break; - } - } - } - if (is_array($value)) { - $value = array_pop($value); // Always strip data type. - } - } elseif (is_object($value) && $value instanceof Element) { - $callback = function ($x) { - return '\x' . bin2hex($x[0]); - }; - $value = strtoupper(preg_replace_callback('#[^\x20-\x7E]#', $callback, $value->element)); - } - $output .= $desc . '=' . $value; - $result[$desc] = isset($result[$desc]) ? - array_merge((array) $result[$desc], [$value]) : - $value; - $start = false; - } - - return $format == self::DN_OPENSSL ? $result : $output; - } - - /** - * Get the Distinguished Name for a certificate/crl issuer - * - * @param int $format optional - * @return mixed - */ - public function getIssuerDN($format = self::DN_ARRAY) - { - switch (true) { - case !isset($this->currentCert) || !is_array($this->currentCert): - break; - case isset($this->currentCert['tbsCertificate']): - return $this->getDN($format, $this->currentCert['tbsCertificate']['issuer']); - case isset($this->currentCert['tbsCertList']): - return $this->getDN($format, $this->currentCert['tbsCertList']['issuer']); - } - - return false; - } - - /** - * Get the Distinguished Name for a certificate/csr subject - * Alias of getDN() - * - * @param int $format optional - * @return mixed - */ - public function getSubjectDN($format = self::DN_ARRAY) - { - switch (true) { - case !empty($this->dn): - return $this->getDN($format); - case !isset($this->currentCert) || !is_array($this->currentCert): - break; - case isset($this->currentCert['tbsCertificate']): - return $this->getDN($format, $this->currentCert['tbsCertificate']['subject']); - case isset($this->currentCert['certificationRequestInfo']): - return $this->getDN($format, $this->currentCert['certificationRequestInfo']['subject']); - } - - return false; - } - - /** - * Get an individual Distinguished Name property for a certificate/crl issuer - * - * @param string $propName - * @param bool $withType optional - * @return mixed - */ - public function getIssuerDNProp($propName, $withType = false) - { - switch (true) { - case !isset($this->currentCert) || !is_array($this->currentCert): - break; - case isset($this->currentCert['tbsCertificate']): - return $this->getDNProp($propName, $this->currentCert['tbsCertificate']['issuer'], $withType); - case isset($this->currentCert['tbsCertList']): - return $this->getDNProp($propName, $this->currentCert['tbsCertList']['issuer'], $withType); - } - - return false; - } - - /** - * Get an individual Distinguished Name property for a certificate/csr subject - * - * @param string $propName - * @param bool $withType optional - * @return mixed - */ - public function getSubjectDNProp($propName, $withType = false) - { - switch (true) { - case !empty($this->dn): - return $this->getDNProp($propName, null, $withType); - case !isset($this->currentCert) || !is_array($this->currentCert): - break; - case isset($this->currentCert['tbsCertificate']): - return $this->getDNProp($propName, $this->currentCert['tbsCertificate']['subject'], $withType); - case isset($this->currentCert['certificationRequestInfo']): - return $this->getDNProp($propName, $this->currentCert['certificationRequestInfo']['subject'], $withType); - } - - return false; - } - - /** - * Get the certificate chain for the current cert - * - * @return mixed - */ - public function getChain() - { - $chain = [$this->currentCert]; - - if (!is_array($this->currentCert) || !isset($this->currentCert['tbsCertificate'])) { - return false; - } - while (true) { - $currentCert = $chain[count($chain) - 1]; - for ($i = 0; $i < count($this->CAs); $i++) { - $ca = $this->CAs[$i]; - if ($currentCert['tbsCertificate']['issuer'] === $ca['tbsCertificate']['subject']) { - $authorityKey = $this->getExtension('id-ce-authorityKeyIdentifier', $currentCert); - $subjectKeyID = $this->getExtension('id-ce-subjectKeyIdentifier', $ca); - switch (true) { - case !is_array($authorityKey): - case is_array($authorityKey) && isset($authorityKey['keyIdentifier']) && $authorityKey['keyIdentifier'] === $subjectKeyID: - if ($currentCert === $ca) { - break 3; - } - $chain[] = $ca; - break 2; - } - } - } - if ($i == count($this->CAs)) { - break; - } - } - foreach ($chain as $key => $value) { - $chain[$key] = new X509(); - $chain[$key]->loadX509($value); - } - return $chain; - } - - /** - * Returns the current cert - * - * @return array|bool - */ - public function &getCurrentCert() - { - return $this->currentCert; - } - - /** - * Set public key - * - * Key needs to be a \phpseclib3\Crypt\RSA object - * - * @param PublicKey $key - * @return void - */ - public function setPublicKey(PublicKey $key) - { - $this->publicKey = $key; - } - - /** - * Set private key - * - * Key needs to be a \phpseclib3\Crypt\RSA object - * - * @param PrivateKey $key - */ - public function setPrivateKey(PrivateKey $key) - { - $this->privateKey = $key; - } - - /** - * Set challenge - * - * Used for SPKAC CSR's - * - * @param string $challenge - */ - public function setChallenge($challenge) - { - $this->challenge = $challenge; - } - - /** - * Gets the public key - * - * Returns a \phpseclib3\Crypt\RSA object or a false. - * - * @return mixed - */ - public function getPublicKey() - { - if (isset($this->publicKey)) { - return $this->publicKey; - } - - if (isset($this->currentCert) && is_array($this->currentCert)) { - $paths = [ - 'tbsCertificate/subjectPublicKeyInfo', - 'certificationRequestInfo/subjectPKInfo', - 'publicKeyAndChallenge/spki' - ]; - foreach ($paths as $path) { - $keyinfo = $this->subArray($this->currentCert, $path); - if (!empty($keyinfo)) { - break; - } - } - } - if (empty($keyinfo)) { - return false; - } - - $key = $keyinfo['subjectPublicKey']; - - switch ($keyinfo['algorithm']['algorithm']) { - case 'id-RSASSA-PSS': - return RSA::loadFormat('PSS', $key); - case 'rsaEncryption': - return RSA::loadFormat('PKCS8', $key)->withPadding(RSA::SIGNATURE_PKCS1); - case 'id-ecPublicKey': - case 'id-Ed25519': - case 'id-Ed448': - return EC::loadFormat('PKCS8', $key); - case 'id-dsa': - return DSA::loadFormat('PKCS8', $key); - } - - return false; - } - - /** - * Load a Certificate Signing Request - * - * @param string $csr - * @param int $mode - * @return mixed - */ - public function loadCSR($csr, $mode = self::FORMAT_AUTO_DETECT) - { - if (is_array($csr) && isset($csr['certificationRequestInfo'])) { - unset($this->currentCert); - unset($this->currentKeyIdentifier); - unset($this->signatureSubject); - $this->dn = $csr['certificationRequestInfo']['subject']; - if (!isset($this->dn)) { - return false; - } - - $this->currentCert = $csr; - return $csr; - } - - // see http://tools.ietf.org/html/rfc2986 - - if ($mode != self::FORMAT_DER) { - $newcsr = ASN1::extractBER($csr); - if ($mode == self::FORMAT_PEM && $csr == $newcsr) { - return false; - } - $csr = $newcsr; - } - $orig = $csr; - - if ($csr === false) { - $this->currentCert = false; - return false; - } - - $decoded = ASN1::decodeBER($csr); - - if (!$decoded) { - $this->currentCert = false; - return false; - } - - $csr = ASN1::asn1map($decoded[0], Maps\CertificationRequest::MAP); - if (!isset($csr) || $csr === false) { - $this->currentCert = false; - return false; - } - - $this->mapInAttributes($csr, 'certificationRequestInfo/attributes'); - $this->mapInDNs($csr, 'certificationRequestInfo/subject/rdnSequence'); - - $this->dn = $csr['certificationRequestInfo']['subject']; - - $this->signatureSubject = substr($orig, $decoded[0]['content'][0]['start'], $decoded[0]['content'][0]['length']); - - $key = $csr['certificationRequestInfo']['subjectPKInfo']; - $key = ASN1::encodeDER($key, Maps\SubjectPublicKeyInfo::MAP); - $csr['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey'] = - "-----BEGIN PUBLIC KEY-----\r\n" . - chunk_split(base64_encode($key), 64) . - "-----END PUBLIC KEY-----"; - - $this->currentKeyIdentifier = null; - $this->currentCert = $csr; - - $this->publicKey = null; - $this->publicKey = $this->getPublicKey(); - - return $csr; - } - - /** - * Save CSR request - * - * @param array $csr - * @param int $format optional - * @return string - */ - public function saveCSR(array $csr, $format = self::FORMAT_PEM) - { - if (!is_array($csr) || !isset($csr['certificationRequestInfo'])) { - return false; - } - - switch (true) { - case !($algorithm = $this->subArray($csr, 'certificationRequestInfo/subjectPKInfo/algorithm/algorithm')): - case is_object($csr['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey']): - break; - default: - $csr['certificationRequestInfo']['subjectPKInfo'] = new Element( - base64_decode(preg_replace('#-.+-|[\r\n]#', '', $csr['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey'])) - ); - } - - $filters = []; - $filters['certificationRequestInfo']['subject']['rdnSequence']['value'] - = ['type' => ASN1::TYPE_UTF8_STRING]; - - ASN1::setFilters($filters); - - $this->mapOutDNs($csr, 'certificationRequestInfo/subject/rdnSequence'); - $this->mapOutAttributes($csr, 'certificationRequestInfo/attributes'); - $csr = ASN1::encodeDER($csr, Maps\CertificationRequest::MAP); - - switch ($format) { - case self::FORMAT_DER: - return $csr; - // case self::FORMAT_PEM: - default: - return "-----BEGIN CERTIFICATE REQUEST-----\r\n" . chunk_split(Strings::base64_encode($csr), 64) . '-----END CERTIFICATE REQUEST-----'; - } - } - - /** - * Load a SPKAC CSR - * - * SPKAC's are produced by the HTML5 keygen element: - * - * https://developer.mozilla.org/en-US/docs/HTML/Element/keygen - * - * @param string $spkac - * @return mixed - */ - public function loadSPKAC($spkac) - { - if (is_array($spkac) && isset($spkac['publicKeyAndChallenge'])) { - unset($this->currentCert); - unset($this->currentKeyIdentifier); - unset($this->signatureSubject); - $this->currentCert = $spkac; - return $spkac; - } - - // see http://www.w3.org/html/wg/drafts/html/master/forms.html#signedpublickeyandchallenge - - // OpenSSL produces SPKAC's that are preceded by the string SPKAC= - $temp = preg_replace('#(?:SPKAC=)|[ \r\n\\\]#', '', $spkac); - $temp = preg_match('#^[a-zA-Z\d/+]*={0,2}$#', $temp) ? Strings::base64_decode($temp) : false; - if ($temp != false) { - $spkac = $temp; - } - $orig = $spkac; - - if ($spkac === false) { - $this->currentCert = false; - return false; - } - - $decoded = ASN1::decodeBER($spkac); - - if (!$decoded) { - $this->currentCert = false; - return false; - } - - $spkac = ASN1::asn1map($decoded[0], Maps\SignedPublicKeyAndChallenge::MAP); - - if (!isset($spkac) || !is_array($spkac)) { - $this->currentCert = false; - return false; - } - - $this->signatureSubject = substr($orig, $decoded[0]['content'][0]['start'], $decoded[0]['content'][0]['length']); - - $key = $spkac['publicKeyAndChallenge']['spki']; - $key = ASN1::encodeDER($key, Maps\SubjectPublicKeyInfo::MAP); - $spkac['publicKeyAndChallenge']['spki']['subjectPublicKey'] = - "-----BEGIN PUBLIC KEY-----\r\n" . - chunk_split(base64_encode($key), 64) . - "-----END PUBLIC KEY-----"; - - $this->currentKeyIdentifier = null; - $this->currentCert = $spkac; - - $this->publicKey = null; - $this->publicKey = $this->getPublicKey(); - - return $spkac; - } - - /** - * Save a SPKAC CSR request - * - * @param array $spkac - * @param int $format optional - * @return string - */ - public function saveSPKAC(array $spkac, $format = self::FORMAT_PEM) - { - if (!is_array($spkac) || !isset($spkac['publicKeyAndChallenge'])) { - return false; - } - - $algorithm = $this->subArray($spkac, 'publicKeyAndChallenge/spki/algorithm/algorithm'); - switch (true) { - case !$algorithm: - case is_object($spkac['publicKeyAndChallenge']['spki']['subjectPublicKey']): - break; - default: - $spkac['publicKeyAndChallenge']['spki'] = new Element( - base64_decode(preg_replace('#-.+-|[\r\n]#', '', $spkac['publicKeyAndChallenge']['spki']['subjectPublicKey'])) - ); - } - - $spkac = ASN1::encodeDER($spkac, Maps\SignedPublicKeyAndChallenge::MAP); - - switch ($format) { - case self::FORMAT_DER: - return $spkac; - // case self::FORMAT_PEM: - default: - // OpenSSL's implementation of SPKAC requires the SPKAC be preceded by SPKAC= and since there are pretty much - // no other SPKAC decoders phpseclib will use that same format - return 'SPKAC=' . Strings::base64_encode($spkac); - } - } - - /** - * Load a Certificate Revocation List - * - * @param string $crl - * @param int $mode - * @return mixed - */ - public function loadCRL($crl, $mode = self::FORMAT_AUTO_DETECT) - { - if (is_array($crl) && isset($crl['tbsCertList'])) { - $this->currentCert = $crl; - unset($this->signatureSubject); - return $crl; - } - - if ($mode != self::FORMAT_DER) { - $newcrl = ASN1::extractBER($crl); - if ($mode == self::FORMAT_PEM && $crl == $newcrl) { - return false; - } - $crl = $newcrl; - } - $orig = $crl; - - if ($crl === false) { - $this->currentCert = false; - return false; - } - - $decoded = ASN1::decodeBER($crl); - - if (!$decoded) { - $this->currentCert = false; - return false; - } - - $crl = ASN1::asn1map($decoded[0], Maps\CertificateList::MAP); - if (!isset($crl) || $crl === false) { - $this->currentCert = false; - return false; - } - - $this->signatureSubject = substr($orig, $decoded[0]['content'][0]['start'], $decoded[0]['content'][0]['length']); - - $this->mapInDNs($crl, 'tbsCertList/issuer/rdnSequence'); - if ($this->isSubArrayValid($crl, 'tbsCertList/crlExtensions')) { - $this->mapInExtensions($crl, 'tbsCertList/crlExtensions'); - } - if ($this->isSubArrayValid($crl, 'tbsCertList/revokedCertificates')) { - $rclist_ref = &$this->subArrayUnchecked($crl, 'tbsCertList/revokedCertificates'); - if ($rclist_ref) { - $rclist = $crl['tbsCertList']['revokedCertificates']; - foreach ($rclist as $i => $extension) { - if ($this->isSubArrayValid($rclist, "$i/crlEntryExtensions")) { - $this->mapInExtensions($rclist_ref, "$i/crlEntryExtensions"); - } - } - } - } - - $this->currentKeyIdentifier = null; - $this->currentCert = $crl; - - return $crl; - } - - /** - * Save Certificate Revocation List. - * - * @param array $crl - * @param int $format optional - * @return string - */ - public function saveCRL(array $crl, $format = self::FORMAT_PEM) - { - if (!is_array($crl) || !isset($crl['tbsCertList'])) { - return false; - } - - $filters = []; - $filters['tbsCertList']['issuer']['rdnSequence']['value'] - = ['type' => ASN1::TYPE_UTF8_STRING]; - $filters['tbsCertList']['signature']['parameters'] - = ['type' => ASN1::TYPE_UTF8_STRING]; - $filters['signatureAlgorithm']['parameters'] - = ['type' => ASN1::TYPE_UTF8_STRING]; - - if (empty($crl['tbsCertList']['signature']['parameters'])) { - $filters['tbsCertList']['signature']['parameters'] - = ['type' => ASN1::TYPE_NULL]; - } - - if (empty($crl['signatureAlgorithm']['parameters'])) { - $filters['signatureAlgorithm']['parameters'] - = ['type' => ASN1::TYPE_NULL]; - } - - ASN1::setFilters($filters); - - $this->mapOutDNs($crl, 'tbsCertList/issuer/rdnSequence'); - $this->mapOutExtensions($crl, 'tbsCertList/crlExtensions'); - $rclist = &$this->subArray($crl, 'tbsCertList/revokedCertificates'); - if (is_array($rclist)) { - foreach ($rclist as $i => $extension) { - $this->mapOutExtensions($rclist, "$i/crlEntryExtensions"); - } - } - - $crl = ASN1::encodeDER($crl, Maps\CertificateList::MAP); - - switch ($format) { - case self::FORMAT_DER: - return $crl; - // case self::FORMAT_PEM: - default: - return "-----BEGIN X509 CRL-----\r\n" . chunk_split(Strings::base64_encode($crl), 64) . '-----END X509 CRL-----'; - } - } - - /** - * Helper function to build a time field according to RFC 3280 section - * - 4.1.2.5 Validity - * - 5.1.2.4 This Update - * - 5.1.2.5 Next Update - * - 5.1.2.6 Revoked Certificates - * by choosing utcTime iff year of date given is before 2050 and generalTime else. - * - * @param string $date in format date('D, d M Y H:i:s O') - * @return array|Element - */ - private function timeField($date) - { - if ($date instanceof Element) { - return $date; - } - $dateObj = new \DateTimeImmutable($date, new \DateTimeZone('GMT')); - $year = $dateObj->format('Y'); // the same way ASN1.php parses this - if ($year < 2050) { - return ['utcTime' => $date]; - } else { - return ['generalTime' => $date]; - } - } - - /** - * Sign an X.509 certificate - * - * $issuer's private key needs to be loaded. - * $subject can be either an existing X.509 cert (if you want to resign it), - * a CSR or something with the DN and public key explicitly set. - * - * @return mixed - */ - public function sign(X509 $issuer, X509 $subject) - { - if (!is_object($issuer->privateKey) || empty($issuer->dn)) { - return false; - } - - if (isset($subject->publicKey) && !($subjectPublicKey = $subject->formatSubjectPublicKey())) { - return false; - } - - $currentCert = isset($this->currentCert) ? $this->currentCert : null; - $signatureSubject = isset($this->signatureSubject) ? $this->signatureSubject : null; - $signatureAlgorithm = self::identifySignatureAlgorithm($issuer->privateKey); - - if (isset($subject->currentCert) && is_array($subject->currentCert) && isset($subject->currentCert['tbsCertificate'])) { - $this->currentCert = $subject->currentCert; - $this->currentCert['tbsCertificate']['signature'] = $signatureAlgorithm; - $this->currentCert['signatureAlgorithm'] = $signatureAlgorithm; - - if (!empty($this->startDate)) { - $this->currentCert['tbsCertificate']['validity']['notBefore'] = $this->timeField($this->startDate); - } - if (!empty($this->endDate)) { - $this->currentCert['tbsCertificate']['validity']['notAfter'] = $this->timeField($this->endDate); - } - if (!empty($this->serialNumber)) { - $this->currentCert['tbsCertificate']['serialNumber'] = $this->serialNumber; - } - if (!empty($subject->dn)) { - $this->currentCert['tbsCertificate']['subject'] = $subject->dn; - } - if (!empty($subject->publicKey)) { - $this->currentCert['tbsCertificate']['subjectPublicKeyInfo'] = $subjectPublicKey; - } - $this->removeExtension('id-ce-authorityKeyIdentifier'); - if (isset($subject->domains)) { - $this->removeExtension('id-ce-subjectAltName'); - } - } elseif (isset($subject->currentCert) && is_array($subject->currentCert) && isset($subject->currentCert['tbsCertList'])) { - return false; - } else { - if (!isset($subject->publicKey)) { - return false; - } - - $startDate = new \DateTimeImmutable('now', new \DateTimeZone(@date_default_timezone_get())); - $startDate = !empty($this->startDate) ? $this->startDate : $startDate->format('D, d M Y H:i:s O'); - - $endDate = new \DateTimeImmutable('+1 year', new \DateTimeZone(@date_default_timezone_get())); - $endDate = !empty($this->endDate) ? $this->endDate : $endDate->format('D, d M Y H:i:s O'); - - /* "The serial number MUST be a positive integer" - "Conforming CAs MUST NOT use serialNumber values longer than 20 octets." - -- https://tools.ietf.org/html/rfc5280#section-4.1.2.2 - - for the integer to be positive the leading bit needs to be 0 hence the - application of a bitmap - */ - $serialNumber = !empty($this->serialNumber) ? - $this->serialNumber : - new BigInteger(Random::string(20) & ("\x7F" . str_repeat("\xFF", 19)), 256); - - $this->currentCert = [ - 'tbsCertificate' => - [ - 'version' => 'v3', - 'serialNumber' => $serialNumber, // $this->setSerialNumber() - 'signature' => $signatureAlgorithm, - 'issuer' => false, // this is going to be overwritten later - 'validity' => [ - 'notBefore' => $this->timeField($startDate), // $this->setStartDate() - 'notAfter' => $this->timeField($endDate) // $this->setEndDate() - ], - 'subject' => $subject->dn, - 'subjectPublicKeyInfo' => $subjectPublicKey - ], - 'signatureAlgorithm' => $signatureAlgorithm, - 'signature' => false // this is going to be overwritten later - ]; - - // Copy extensions from CSR. - $csrexts = $subject->getAttribute('pkcs-9-at-extensionRequest', 0); - - if (!empty($csrexts)) { - $this->currentCert['tbsCertificate']['extensions'] = $csrexts; - } - } - - $this->currentCert['tbsCertificate']['issuer'] = $issuer->dn; - - if (isset($issuer->currentKeyIdentifier)) { - $this->setExtension('id-ce-authorityKeyIdentifier', [ - //'authorityCertIssuer' => array( - // array( - // 'directoryName' => $issuer->dn - // ) - //), - 'keyIdentifier' => $issuer->currentKeyIdentifier - ]); - //$extensions = &$this->currentCert['tbsCertificate']['extensions']; - //if (isset($issuer->serialNumber)) { - // $extensions[count($extensions) - 1]['authorityCertSerialNumber'] = $issuer->serialNumber; - //} - //unset($extensions); - } - - if (isset($subject->currentKeyIdentifier)) { - $this->setExtension('id-ce-subjectKeyIdentifier', $subject->currentKeyIdentifier); - } - - $altName = []; - - if (isset($subject->domains) && count($subject->domains)) { - $altName = array_map(['\phpseclib3\File\X509', 'dnsName'], $subject->domains); - } - - if (isset($subject->ipAddresses) && count($subject->ipAddresses)) { - // should an IP address appear as the CN if no domain name is specified? idk - //$ips = count($subject->domains) ? $subject->ipAddresses : array_slice($subject->ipAddresses, 1); - $ipAddresses = []; - foreach ($subject->ipAddresses as $ipAddress) { - $encoded = $subject->ipAddress($ipAddress); - if ($encoded !== false) { - $ipAddresses[] = $encoded; - } - } - if (count($ipAddresses)) { - $altName = array_merge($altName, $ipAddresses); - } - } - - if (!empty($altName)) { - $this->setExtension('id-ce-subjectAltName', $altName); - } - - if ($this->caFlag) { - $keyUsage = $this->getExtension('id-ce-keyUsage'); - if (!$keyUsage) { - $keyUsage = []; - } - - $this->setExtension( - 'id-ce-keyUsage', - array_values(array_unique(array_merge($keyUsage, ['cRLSign', 'keyCertSign']))) - ); - - $basicConstraints = $this->getExtension('id-ce-basicConstraints'); - if (!$basicConstraints) { - $basicConstraints = []; - } - - $this->setExtension( - 'id-ce-basicConstraints', - array_merge(['cA' => true], $basicConstraints), - true - ); - - if (!isset($subject->currentKeyIdentifier)) { - $this->setExtension('id-ce-subjectKeyIdentifier', $this->computeKeyIdentifier($this->currentCert), false, false); - } - } - - // resync $this->signatureSubject - // save $tbsCertificate in case there are any \phpseclib3\File\ASN1\Element objects in it - $tbsCertificate = $this->currentCert['tbsCertificate']; - $this->loadX509($this->saveX509($this->currentCert)); - - $result = $this->currentCert; - $this->currentCert['signature'] = $result['signature'] = "\0" . $issuer->privateKey->sign($this->signatureSubject); - $result['tbsCertificate'] = $tbsCertificate; - - $this->currentCert = $currentCert; - $this->signatureSubject = $signatureSubject; - - return $result; - } - - /** - * Sign a CSR - * - * @return mixed - */ - public function signCSR() - { - if (!is_object($this->privateKey) || empty($this->dn)) { - return false; - } - - $origPublicKey = $this->publicKey; - $this->publicKey = $this->privateKey->getPublicKey(); - $publicKey = $this->formatSubjectPublicKey(); - $this->publicKey = $origPublicKey; - - $currentCert = isset($this->currentCert) ? $this->currentCert : null; - $signatureSubject = isset($this->signatureSubject) ? $this->signatureSubject : null; - $signatureAlgorithm = self::identifySignatureAlgorithm($this->privateKey); - - if (isset($this->currentCert) && is_array($this->currentCert) && isset($this->currentCert['certificationRequestInfo'])) { - $this->currentCert['signatureAlgorithm'] = $signatureAlgorithm; - if (!empty($this->dn)) { - $this->currentCert['certificationRequestInfo']['subject'] = $this->dn; - } - $this->currentCert['certificationRequestInfo']['subjectPKInfo'] = $publicKey; - } else { - $this->currentCert = [ - 'certificationRequestInfo' => - [ - 'version' => 'v1', - 'subject' => $this->dn, - 'subjectPKInfo' => $publicKey, - 'attributes' => [] - ], - 'signatureAlgorithm' => $signatureAlgorithm, - 'signature' => false // this is going to be overwritten later - ]; - } - - // resync $this->signatureSubject - // save $certificationRequestInfo in case there are any \phpseclib3\File\ASN1\Element objects in it - $certificationRequestInfo = $this->currentCert['certificationRequestInfo']; - $this->loadCSR($this->saveCSR($this->currentCert)); - - $result = $this->currentCert; - $this->currentCert['signature'] = $result['signature'] = "\0" . $this->privateKey->sign($this->signatureSubject); - $result['certificationRequestInfo'] = $certificationRequestInfo; - - $this->currentCert = $currentCert; - $this->signatureSubject = $signatureSubject; - - return $result; - } - - /** - * Sign a SPKAC - * - * @return mixed - */ - public function signSPKAC() - { - if (!is_object($this->privateKey)) { - return false; - } - - $origPublicKey = $this->publicKey; - $this->publicKey = $this->privateKey->getPublicKey(); - $publicKey = $this->formatSubjectPublicKey(); - $this->publicKey = $origPublicKey; - - $currentCert = isset($this->currentCert) ? $this->currentCert : null; - $signatureSubject = isset($this->signatureSubject) ? $this->signatureSubject : null; - $signatureAlgorithm = self::identifySignatureAlgorithm($this->privateKey); - - // re-signing a SPKAC seems silly but since everything else supports re-signing why not? - if (isset($this->currentCert) && is_array($this->currentCert) && isset($this->currentCert['publicKeyAndChallenge'])) { - $this->currentCert['signatureAlgorithm'] = $signatureAlgorithm; - $this->currentCert['publicKeyAndChallenge']['spki'] = $publicKey; - if (!empty($this->challenge)) { - // the bitwise AND ensures that the output is a valid IA5String - $this->currentCert['publicKeyAndChallenge']['challenge'] = $this->challenge & str_repeat("\x7F", strlen($this->challenge)); - } - } else { - $this->currentCert = [ - 'publicKeyAndChallenge' => - [ - 'spki' => $publicKey, - // quoting , - // "A challenge string that is submitted along with the public key. Defaults to an empty string if not specified." - // both Firefox and OpenSSL ("openssl spkac -key private.key") behave this way - // we could alternatively do this instead if we ignored the specs: - // Random::string(8) & str_repeat("\x7F", 8) - 'challenge' => !empty($this->challenge) ? $this->challenge : '' - ], - 'signatureAlgorithm' => $signatureAlgorithm, - 'signature' => false // this is going to be overwritten later - ]; - } - - // resync $this->signatureSubject - // save $publicKeyAndChallenge in case there are any \phpseclib3\File\ASN1\Element objects in it - $publicKeyAndChallenge = $this->currentCert['publicKeyAndChallenge']; - $this->loadSPKAC($this->saveSPKAC($this->currentCert)); - - $result = $this->currentCert; - $this->currentCert['signature'] = $result['signature'] = "\0" . $this->privateKey->sign($this->signatureSubject); - $result['publicKeyAndChallenge'] = $publicKeyAndChallenge; - - $this->currentCert = $currentCert; - $this->signatureSubject = $signatureSubject; - - return $result; - } - - /** - * Sign a CRL - * - * $issuer's private key needs to be loaded. - * - * @return mixed - */ - public function signCRL(X509 $issuer, X509 $crl) - { - if (!is_object($issuer->privateKey) || empty($issuer->dn)) { - return false; - } - - $currentCert = isset($this->currentCert) ? $this->currentCert : null; - $signatureSubject = isset($this->signatureSubject) ? $this->signatureSubject : null; - $signatureAlgorithm = self::identifySignatureAlgorithm($issuer->privateKey); - - $thisUpdate = new \DateTimeImmutable('now', new \DateTimeZone(@date_default_timezone_get())); - $thisUpdate = !empty($this->startDate) ? $this->startDate : $thisUpdate->format('D, d M Y H:i:s O'); - - if (isset($crl->currentCert) && is_array($crl->currentCert) && isset($crl->currentCert['tbsCertList'])) { - $this->currentCert = $crl->currentCert; - $this->currentCert['tbsCertList']['signature'] = $signatureAlgorithm; - $this->currentCert['signatureAlgorithm'] = $signatureAlgorithm; - } else { - $this->currentCert = [ - 'tbsCertList' => - [ - 'version' => 'v2', - 'signature' => $signatureAlgorithm, - 'issuer' => false, // this is going to be overwritten later - 'thisUpdate' => $this->timeField($thisUpdate) // $this->setStartDate() - ], - 'signatureAlgorithm' => $signatureAlgorithm, - 'signature' => false // this is going to be overwritten later - ]; - } - - $tbsCertList = &$this->currentCert['tbsCertList']; - $tbsCertList['issuer'] = $issuer->dn; - $tbsCertList['thisUpdate'] = $this->timeField($thisUpdate); - - if (!empty($this->endDate)) { - $tbsCertList['nextUpdate'] = $this->timeField($this->endDate); // $this->setEndDate() - } else { - unset($tbsCertList['nextUpdate']); - } - - if (!empty($this->serialNumber)) { - $crlNumber = $this->serialNumber; - } else { - $crlNumber = $this->getExtension('id-ce-cRLNumber'); - // "The CRL number is a non-critical CRL extension that conveys a - // monotonically increasing sequence number for a given CRL scope and - // CRL issuer. This extension allows users to easily determine when a - // particular CRL supersedes another CRL." - // -- https://tools.ietf.org/html/rfc5280#section-5.2.3 - $crlNumber = $crlNumber !== false ? $crlNumber->add(new BigInteger(1)) : null; - } - - $this->removeExtension('id-ce-authorityKeyIdentifier'); - $this->removeExtension('id-ce-issuerAltName'); - - // Be sure version >= v2 if some extension found. - $version = isset($tbsCertList['version']) ? $tbsCertList['version'] : 0; - if (!$version) { - if (!empty($tbsCertList['crlExtensions'])) { - $version = 'v2'; // v2. - } elseif (!empty($tbsCertList['revokedCertificates'])) { - foreach ($tbsCertList['revokedCertificates'] as $cert) { - if (!empty($cert['crlEntryExtensions'])) { - $version = 'v2'; // v2. - } - } - } - - if ($version) { - $tbsCertList['version'] = $version; - } - } - - // Store additional extensions. - if (!empty($tbsCertList['version'])) { // At least v2. - if (!empty($crlNumber)) { - $this->setExtension('id-ce-cRLNumber', $crlNumber); - } - - if (isset($issuer->currentKeyIdentifier)) { - $this->setExtension('id-ce-authorityKeyIdentifier', [ - //'authorityCertIssuer' => array( - // ] - // 'directoryName' => $issuer->dn - // ] - //), - 'keyIdentifier' => $issuer->currentKeyIdentifier - ]); - //$extensions = &$tbsCertList['crlExtensions']; - //if (isset($issuer->serialNumber)) { - // $extensions[count($extensions) - 1]['authorityCertSerialNumber'] = $issuer->serialNumber; - //} - //unset($extensions); - } - - $issuerAltName = $this->getExtension('id-ce-subjectAltName', $issuer->currentCert); - - if ($issuerAltName !== false) { - $this->setExtension('id-ce-issuerAltName', $issuerAltName); - } - } - - if (empty($tbsCertList['revokedCertificates'])) { - unset($tbsCertList['revokedCertificates']); - } - - unset($tbsCertList); - - // resync $this->signatureSubject - // save $tbsCertList in case there are any \phpseclib3\File\ASN1\Element objects in it - $tbsCertList = $this->currentCert['tbsCertList']; - $this->loadCRL($this->saveCRL($this->currentCert)); - - $result = $this->currentCert; - $this->currentCert['signature'] = $result['signature'] = "\0" . $issuer->privateKey->sign($this->signatureSubject); - $result['tbsCertList'] = $tbsCertList; - - $this->currentCert = $currentCert; - $this->signatureSubject = $signatureSubject; - - return $result; - } - - /** - * Identify signature algorithm from key settings - * - * @param PrivateKey $key - * @throws UnsupportedAlgorithmException if the algorithm is unsupported - * @return array - */ - private static function identifySignatureAlgorithm(PrivateKey $key) - { - if ($key instanceof RSA) { - if ($key->getPadding() & RSA::SIGNATURE_PSS) { - $r = PSS::load($key->withPassword()->toString('PSS')); - return [ - 'algorithm' => 'id-RSASSA-PSS', - 'parameters' => PSS::savePSSParams($r) - ]; - } - switch ($key->getHash()) { - case 'md2': - case 'md5': - case 'sha1': - case 'sha224': - case 'sha256': - case 'sha384': - case 'sha512': - return [ - 'algorithm' => $key->getHash() . 'WithRSAEncryption', - 'parameters' => null - ]; - } - throw new UnsupportedAlgorithmException('The only supported hash algorithms for RSA are: md2, md5, sha1, sha224, sha256, sha384, sha512'); - } - - if ($key instanceof DSA) { - switch ($key->getHash()) { - case 'sha1': - case 'sha224': - case 'sha256': - return ['algorithm' => 'id-dsa-with-' . $key->getHash()]; - } - throw new UnsupportedAlgorithmException('The only supported hash algorithms for DSA are: sha1, sha224, sha256'); - } - - if ($key instanceof EC) { - switch ($key->getCurve()) { - case 'Ed25519': - case 'Ed448': - return ['algorithm' => 'id-' . $key->getCurve()]; - } - switch ($key->getHash()) { - case 'sha1': - case 'sha224': - case 'sha256': - case 'sha384': - case 'sha512': - return ['algorithm' => 'ecdsa-with-' . strtoupper($key->getHash())]; - } - throw new UnsupportedAlgorithmException('The only supported hash algorithms for EC are: sha1, sha224, sha256, sha384, sha512'); - } - - throw new UnsupportedAlgorithmException('The only supported public key classes are: RSA, DSA, EC'); - } - - /** - * Set certificate start date - * - * @param \DateTimeInterface|string $date - */ - public function setStartDate($date) - { - if (!is_object($date) || !($date instanceof \DateTimeInterface)) { - $date = new \DateTimeImmutable($date, new \DateTimeZone(@date_default_timezone_get())); - } - - $this->startDate = $date->format('D, d M Y H:i:s O'); - } - - /** - * Set certificate end date - * - * @param \DateTimeInterface|string $date - */ - public function setEndDate($date) - { - /* - To indicate that a certificate has no well-defined expiration date, - the notAfter SHOULD be assigned the GeneralizedTime value of - 99991231235959Z. - - -- http://tools.ietf.org/html/rfc5280#section-4.1.2.5 - */ - if (is_string($date) && strtolower($date) === 'lifetime') { - $temp = '99991231235959Z'; - $temp = chr(ASN1::TYPE_GENERALIZED_TIME) . ASN1::encodeLength(strlen($temp)) . $temp; - $this->endDate = new Element($temp); - } else { - if (!is_object($date) || !($date instanceof \DateTimeInterface)) { - $date = new \DateTimeImmutable($date, new \DateTimeZone(@date_default_timezone_get())); - } - - $this->endDate = $date->format('D, d M Y H:i:s O'); - } - } - - /** - * Set Serial Number - * - * @param string $serial - * @param int $base optional - */ - public function setSerialNumber($serial, $base = -256) - { - $this->serialNumber = new BigInteger($serial, $base); - } - - /** - * Turns the certificate into a certificate authority - * - */ - public function makeCA() - { - $this->caFlag = true; - } - - /** - * Check for validity of subarray - * - * This is intended for use in conjunction with _subArrayUnchecked(), - * implementing the checks included in _subArray() but without copying - * a potentially large array by passing its reference by-value to is_array(). - * - * @param array $root - * @param string $path - * @return boolean - */ - private function isSubArrayValid(array $root, $path) - { - if (!is_array($root)) { - return false; - } - - foreach (explode('/', $path) as $i) { - if (!is_array($root)) { - return false; - } - - if (!isset($root[$i])) { - return true; - } - - $root = $root[$i]; - } - - return true; - } - - /** - * Get a reference to a subarray - * - * This variant of _subArray() does no is_array() checking, - * so $root should be checked with _isSubArrayValid() first. - * - * This is here for performance reasons: - * Passing a reference (i.e. $root) by-value (i.e. to is_array()) - * creates a copy. If $root is an especially large array, this is expensive. - * - * @param array $root - * @param string $path absolute path with / as component separator - * @param bool $create optional - * @return array|false - */ - private function &subArrayUnchecked(array &$root, $path, $create = false) - { - $false = false; - - foreach (explode('/', $path) as $i) { - if (!isset($root[$i])) { - if (!$create) { - return $false; - } - - $root[$i] = []; - } - - $root = &$root[$i]; - } - - return $root; - } - - /** - * Get a reference to a subarray - * - * @param array $root - * @param string $path absolute path with / as component separator - * @param bool $create optional - * @return array|false - */ - private function &subArray(&$root, $path, $create = false) - { - $false = false; - - if (!is_array($root)) { - return $false; - } - - foreach (explode('/', $path) as $i) { - if (!is_array($root)) { - return $false; - } - - if (!isset($root[$i])) { - if (!$create) { - return $false; - } - - $root[$i] = []; - } - - $root = &$root[$i]; - } - - return $root; - } - - /** - * Get a reference to an extension subarray - * - * @param array $root - * @param string $path optional absolute path with / as component separator - * @param bool $create optional - * @return array|false - */ - private function &extensions(&$root, $path = null, $create = false) - { - if (!isset($root)) { - $root = $this->currentCert; - } - - switch (true) { - case !empty($path): - case !is_array($root): - break; - case isset($root['tbsCertificate']): - $path = 'tbsCertificate/extensions'; - break; - case isset($root['tbsCertList']): - $path = 'tbsCertList/crlExtensions'; - break; - case isset($root['certificationRequestInfo']): - $pth = 'certificationRequestInfo/attributes'; - $attributes = &$this->subArray($root, $pth, $create); - - if (is_array($attributes)) { - foreach ($attributes as $key => $value) { - if ($value['type'] == 'pkcs-9-at-extensionRequest') { - $path = "$pth/$key/value/0"; - break 2; - } - } - if ($create) { - $key = count($attributes); - $attributes[] = ['type' => 'pkcs-9-at-extensionRequest', 'value' => []]; - $path = "$pth/$key/value/0"; - } - } - break; - } - - $extensions = &$this->subArray($root, $path, $create); - - if (!is_array($extensions)) { - $false = false; - return $false; - } - - return $extensions; - } - - /** - * Remove an Extension - * - * @param string $id - * @param string $path optional - * @return bool - */ - private function removeExtensionHelper($id, $path = null) - { - $extensions = &$this->extensions($this->currentCert, $path); - - if (!is_array($extensions)) { - return false; - } - - $result = false; - foreach ($extensions as $key => $value) { - if ($value['extnId'] == $id) { - unset($extensions[$key]); - $result = true; - } - } - - $extensions = array_values($extensions); - // fix for https://bugs.php.net/75433 affecting PHP 7.2 - if (!isset($extensions[0])) { - $extensions = array_splice($extensions, 0, 0); - } - return $result; - } - - /** - * Get an Extension - * - * Returns the extension if it exists and false if not - * - * @param string $id - * @param array $cert optional - * @param string $path optional - * @return mixed - */ - private function getExtensionHelper($id, $cert = null, $path = null) - { - $extensions = $this->extensions($cert, $path); - - if (!is_array($extensions)) { - return false; - } - - foreach ($extensions as $key => $value) { - if ($value['extnId'] == $id) { - return $value['extnValue']; - } - } - - return false; - } - - /** - * Returns a list of all extensions in use - * - * @param array $cert optional - * @param string $path optional - * @return array - */ - private function getExtensionsHelper($cert = null, $path = null) - { - $exts = $this->extensions($cert, $path); - $extensions = []; - - if (is_array($exts)) { - foreach ($exts as $extension) { - $extensions[] = $extension['extnId']; - } - } - - return $extensions; - } - - /** - * Set an Extension - * - * @param string $id - * @param mixed $value - * @param bool $critical optional - * @param bool $replace optional - * @param string $path optional - * @return bool - */ - private function setExtensionHelper($id, $value, $critical = false, $replace = true, $path = null) - { - $extensions = &$this->extensions($this->currentCert, $path, true); - - if (!is_array($extensions)) { - return false; - } - - $newext = ['extnId' => $id, 'critical' => $critical, 'extnValue' => $value]; - - foreach ($extensions as $key => $value) { - if ($value['extnId'] == $id) { - if (!$replace) { - return false; - } - - $extensions[$key] = $newext; - return true; - } - } - - $extensions[] = $newext; - return true; - } - - /** - * Remove a certificate, CSR or CRL Extension - * - * @param string $id - * @return bool - */ - public function removeExtension($id) - { - return $this->removeExtensionHelper($id); - } - - /** - * Get a certificate, CSR or CRL Extension - * - * Returns the extension if it exists and false if not - * - * @param string $id - * @param array $cert optional - * @param string $path - * @return mixed - */ - public function getExtension($id, $cert = null, $path = null) - { - return $this->getExtensionHelper($id, $cert, $path); - } - - /** - * Returns a list of all extensions in use in certificate, CSR or CRL - * - * @param array $cert optional - * @param string $path optional - * @return array - */ - public function getExtensions($cert = null, $path = null) - { - return $this->getExtensionsHelper($cert, $path); - } - - /** - * Set a certificate, CSR or CRL Extension - * - * @param string $id - * @param mixed $value - * @param bool $critical optional - * @param bool $replace optional - * @return bool - */ - public function setExtension($id, $value, $critical = false, $replace = true) - { - return $this->setExtensionHelper($id, $value, $critical, $replace); - } - - /** - * Remove a CSR attribute. - * - * @param string $id - * @param int $disposition optional - * @return bool - */ - public function removeAttribute($id, $disposition = self::ATTR_ALL) - { - $attributes = &$this->subArray($this->currentCert, 'certificationRequestInfo/attributes'); - - if (!is_array($attributes)) { - return false; - } - - $result = false; - foreach ($attributes as $key => $attribute) { - if ($attribute['type'] == $id) { - $n = count($attribute['value']); - switch (true) { - case $disposition == self::ATTR_APPEND: - case $disposition == self::ATTR_REPLACE: - return false; - case $disposition >= $n: - $disposition -= $n; - break; - case $disposition == self::ATTR_ALL: - case $n == 1: - unset($attributes[$key]); - $result = true; - break; - default: - unset($attributes[$key]['value'][$disposition]); - $attributes[$key]['value'] = array_values($attributes[$key]['value']); - $result = true; - break; - } - if ($result && $disposition != self::ATTR_ALL) { - break; - } - } - } - - $attributes = array_values($attributes); - return $result; - } - - /** - * Get a CSR attribute - * - * Returns the attribute if it exists and false if not - * - * @param string $id - * @param int $disposition optional - * @param array $csr optional - * @return mixed - */ - public function getAttribute($id, $disposition = self::ATTR_ALL, $csr = null) - { - if (empty($csr)) { - $csr = $this->currentCert; - } - - $attributes = $this->subArray($csr, 'certificationRequestInfo/attributes'); - - if (!is_array($attributes)) { - return false; - } - - foreach ($attributes as $key => $attribute) { - if ($attribute['type'] == $id) { - $n = count($attribute['value']); - switch (true) { - case $disposition == self::ATTR_APPEND: - case $disposition == self::ATTR_REPLACE: - return false; - case $disposition == self::ATTR_ALL: - return $attribute['value']; - case $disposition >= $n: - $disposition -= $n; - break; - default: - return $attribute['value'][$disposition]; - } - } - } - - return false; - } - - /** - * Get all requested CSR extensions - * - * Returns the list of extensions if there are any and false if not - * - * @param array $csr optional - * @return mixed - */ - public function getRequestedCertificateExtensions($csr = null) - { - if (empty($csr)) { - $csr = $this->currentCert; - } - - $requestedExtensions = $this->getAttribute('pkcs-9-at-extensionRequest'); - if ($requestedExtensions === false) { - return false; - } - - return $this->getAttribute('pkcs-9-at-extensionRequest')[0]; - } - - /** - * Returns a list of all CSR attributes in use - * - * @param array $csr optional - * @return array - */ - public function getAttributes($csr = null) - { - if (empty($csr)) { - $csr = $this->currentCert; - } - - $attributes = $this->subArray($csr, 'certificationRequestInfo/attributes'); - $attrs = []; - - if (is_array($attributes)) { - foreach ($attributes as $attribute) { - $attrs[] = $attribute['type']; - } - } - - return $attrs; - } - - /** - * Set a CSR attribute - * - * @param string $id - * @param mixed $value - * @param int $disposition optional - * @return bool - */ - public function setAttribute($id, $value, $disposition = self::ATTR_ALL) - { - $attributes = &$this->subArray($this->currentCert, 'certificationRequestInfo/attributes', true); - - if (!is_array($attributes)) { - return false; - } - - switch ($disposition) { - case self::ATTR_REPLACE: - $disposition = self::ATTR_APPEND; - // fall-through - case self::ATTR_ALL: - $this->removeAttribute($id); - break; - } - - foreach ($attributes as $key => $attribute) { - if ($attribute['type'] == $id) { - $n = count($attribute['value']); - switch (true) { - case $disposition == self::ATTR_APPEND: - $last = $key; - break; - case $disposition >= $n: - $disposition -= $n; - break; - default: - $attributes[$key]['value'][$disposition] = $value; - return true; - } - } - } - - switch (true) { - case $disposition >= 0: - return false; - case isset($last): - $attributes[$last]['value'][] = $value; - break; - default: - $attributes[] = ['type' => $id, 'value' => $disposition == self::ATTR_ALL ? $value : [$value]]; - break; - } - - return true; - } - - /** - * Sets the subject key identifier - * - * This is used by the id-ce-authorityKeyIdentifier and the id-ce-subjectKeyIdentifier extensions. - * - * @param string $value - */ - public function setKeyIdentifier($value) - { - if (empty($value)) { - unset($this->currentKeyIdentifier); - } else { - $this->currentKeyIdentifier = $value; - } - } - - /** - * Compute a public key identifier. - * - * Although key identifiers may be set to any unique value, this function - * computes key identifiers from public key according to the two - * recommended methods (4.2.1.2 RFC 3280). - * Highly polymorphic: try to accept all possible forms of key: - * - Key object - * - \phpseclib3\File\X509 object with public or private key defined - * - Certificate or CSR array - * - \phpseclib3\File\ASN1\Element object - * - PEM or DER string - * - * @param mixed $key optional - * @param int $method optional - * @return string binary key identifier - */ - public function computeKeyIdentifier($key = null, $method = 1) - { - if (is_null($key)) { - $key = $this; - } - - switch (true) { - case is_string($key): - break; - case is_array($key) && isset($key['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey']): - return $this->computeKeyIdentifier($key['tbsCertificate']['subjectPublicKeyInfo']['subjectPublicKey'], $method); - case is_array($key) && isset($key['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey']): - return $this->computeKeyIdentifier($key['certificationRequestInfo']['subjectPKInfo']['subjectPublicKey'], $method); - case !is_object($key): - return false; - case $key instanceof Element: - // Assume the element is a bitstring-packed key. - $decoded = ASN1::decodeBER($key->element); - if (!$decoded) { - return false; - } - $raw = ASN1::asn1map($decoded[0], ['type' => ASN1::TYPE_BIT_STRING]); - if (empty($raw)) { - return false; - } - // If the key is private, compute identifier from its corresponding public key. - $key = PublicKeyLoader::load($raw); - if ($key instanceof PrivateKey) { // If private. - return $this->computeKeyIdentifier($key, $method); - } - $key = $raw; // Is a public key. - break; - case $key instanceof X509: - if (isset($key->publicKey)) { - return $this->computeKeyIdentifier($key->publicKey, $method); - } - if (isset($key->privateKey)) { - return $this->computeKeyIdentifier($key->privateKey, $method); - } - if (isset($key->currentCert['tbsCertificate']) || isset($key->currentCert['certificationRequestInfo'])) { - return $this->computeKeyIdentifier($key->currentCert, $method); - } - return false; - default: // Should be a key object (i.e.: \phpseclib3\Crypt\RSA). - $key = $key->getPublicKey(); - break; - } - - // If in PEM format, convert to binary. - $key = ASN1::extractBER($key); - - // Now we have the key string: compute its sha-1 sum. - $hash = new Hash('sha1'); - $hash = $hash->hash($key); - - if ($method == 2) { - $hash = substr($hash, -8); - $hash[0] = chr((ord($hash[0]) & 0x0F) | 0x40); - } - - return $hash; - } - - /** - * Format a public key as appropriate - * - * @return array|false - */ - private function formatSubjectPublicKey() - { - $format = $this->publicKey instanceof RSA && ($this->publicKey->getPadding() & RSA::SIGNATURE_PSS) ? - 'PSS' : - 'PKCS8'; - - $publicKey = base64_decode(preg_replace('#-.+-|[\r\n]#', '', $this->publicKey->toString($format))); - - $decoded = ASN1::decodeBER($publicKey); - if (!$decoded) { - return false; - } - $mapped = ASN1::asn1map($decoded[0], Maps\SubjectPublicKeyInfo::MAP); - if (!is_array($mapped)) { - return false; - } - - $mapped['subjectPublicKey'] = $this->publicKey->toString($format); - - return $mapped; - } - - /** - * Set the domain name's which the cert is to be valid for - * - * @param mixed ...$domains - * @return void - */ - public function setDomain(...$domains) - { - $this->domains = $domains; - $this->removeDNProp('id-at-commonName'); - $this->setDNProp('id-at-commonName', $this->domains[0]); - } - - /** - * Set the IP Addresses's which the cert is to be valid for - * - * @param mixed[] ...$ipAddresses - */ - public function setIPAddress(...$ipAddresses) - { - $this->ipAddresses = $ipAddresses; - /* - if (!isset($this->domains)) { - $this->removeDNProp('id-at-commonName'); - $this->setDNProp('id-at-commonName', $this->ipAddresses[0]); - } - */ - } - - /** - * Helper function to build domain array - * - * @param string $domain - * @return array - */ - private static function dnsName($domain) - { - return ['dNSName' => $domain]; - } - - /** - * Helper function to build IP Address array - * - * (IPv6 is not currently supported) - * - * @param string $address - * @return array - */ - private function iPAddress($address) - { - return ['iPAddress' => $address]; - } - - /** - * Get the index of a revoked certificate. - * - * @param array $rclist - * @param string $serial - * @param bool $create optional - * @return int|false - */ - private function revokedCertificate(array &$rclist, $serial, $create = false) - { - $serial = new BigInteger($serial); - - foreach ($rclist as $i => $rc) { - if (!($serial->compare($rc['userCertificate']))) { - return $i; - } - } - - if (!$create) { - return false; - } - - $i = count($rclist); - $revocationDate = new \DateTimeImmutable('now', new \DateTimeZone(@date_default_timezone_get())); - $rclist[] = ['userCertificate' => $serial, - 'revocationDate' => $this->timeField($revocationDate->format('D, d M Y H:i:s O'))]; - return $i; - } - - /** - * Revoke a certificate. - * - * @param string $serial - * @param string $date optional - * @return bool - */ - public function revoke($serial, $date = null) - { - if (isset($this->currentCert['tbsCertList'])) { - if (is_array($rclist = &$this->subArray($this->currentCert, 'tbsCertList/revokedCertificates', true))) { - if ($this->revokedCertificate($rclist, $serial) === false) { // If not yet revoked - if (($i = $this->revokedCertificate($rclist, $serial, true)) !== false) { - if (!empty($date)) { - $rclist[$i]['revocationDate'] = $this->timeField($date); - } - - return true; - } - } - } - } - - return false; - } - - /** - * Unrevoke a certificate. - * - * @param string $serial - * @return bool - */ - public function unrevoke($serial) - { - if (is_array($rclist = &$this->subArray($this->currentCert, 'tbsCertList/revokedCertificates'))) { - if (($i = $this->revokedCertificate($rclist, $serial)) !== false) { - unset($rclist[$i]); - $rclist = array_values($rclist); - return true; - } - } - - return false; - } - - /** - * Get a revoked certificate. - * - * @param string $serial - * @return mixed - */ - public function getRevoked($serial) - { - if (is_array($rclist = $this->subArray($this->currentCert, 'tbsCertList/revokedCertificates'))) { - if (($i = $this->revokedCertificate($rclist, $serial)) !== false) { - return $rclist[$i]; - } - } - - return false; - } - - /** - * List revoked certificates - * - * @param array $crl optional - * @return array|bool - */ - public function listRevoked($crl = null) - { - if (!isset($crl)) { - $crl = $this->currentCert; - } - - if (!isset($crl['tbsCertList'])) { - return false; - } - - $result = []; - - if (is_array($rclist = $this->subArray($crl, 'tbsCertList/revokedCertificates'))) { - foreach ($rclist as $rc) { - $result[] = $rc['userCertificate']->toString(); - } - } - - return $result; - } - - /** - * Remove a Revoked Certificate Extension - * - * @param string $serial - * @param string $id - * @return bool - */ - public function removeRevokedCertificateExtension($serial, $id) - { - if (is_array($rclist = &$this->subArray($this->currentCert, 'tbsCertList/revokedCertificates'))) { - if (($i = $this->revokedCertificate($rclist, $serial)) !== false) { - return $this->removeExtensionHelper($id, "tbsCertList/revokedCertificates/$i/crlEntryExtensions"); - } - } - - return false; - } - - /** - * Get a Revoked Certificate Extension - * - * Returns the extension if it exists and false if not - * - * @param string $serial - * @param string $id - * @param array $crl optional - * @return mixed - */ - public function getRevokedCertificateExtension($serial, $id, $crl = null) - { - if (!isset($crl)) { - $crl = $this->currentCert; - } - - if (is_array($rclist = $this->subArray($crl, 'tbsCertList/revokedCertificates'))) { - if (($i = $this->revokedCertificate($rclist, $serial)) !== false) { - return $this->getExtension($id, $crl, "tbsCertList/revokedCertificates/$i/crlEntryExtensions"); - } - } - - return false; - } - - /** - * Returns a list of all extensions in use for a given revoked certificate - * - * @param string $serial - * @param array $crl optional - * @return array|bool - */ - public function getRevokedCertificateExtensions($serial, $crl = null) - { - if (!isset($crl)) { - $crl = $this->currentCert; - } - - if (is_array($rclist = $this->subArray($crl, 'tbsCertList/revokedCertificates'))) { - if (($i = $this->revokedCertificate($rclist, $serial)) !== false) { - return $this->getExtensions($crl, "tbsCertList/revokedCertificates/$i/crlEntryExtensions"); - } - } - - return false; - } - - /** - * Set a Revoked Certificate Extension - * - * @param string $serial - * @param string $id - * @param mixed $value - * @param bool $critical optional - * @param bool $replace optional - * @return bool - */ - public function setRevokedCertificateExtension($serial, $id, $value, $critical = false, $replace = true) - { - if (isset($this->currentCert['tbsCertList'])) { - if (is_array($rclist = &$this->subArray($this->currentCert, 'tbsCertList/revokedCertificates', true))) { - if (($i = $this->revokedCertificate($rclist, $serial, true)) !== false) { - return $this->setExtensionHelper($id, $value, $critical, $replace, "tbsCertList/revokedCertificates/$i/crlEntryExtensions"); - } - } - } - - return false; - } - - /** - * Register the mapping for a custom/unsupported extension. - * - * @param string $id - * @param array $mapping - */ - public static function registerExtension($id, array $mapping) - { - if (isset(self::$extensions[$id]) && self::$extensions[$id] !== $mapping) { - throw new \RuntimeException( - 'Extension ' . $id . ' has already been defined with a different mapping.' - ); - } - - self::$extensions[$id] = $mapping; - } - - /** - * Register the mapping for a custom/unsupported extension. - * - * @param string $id - * - * @return array|null - */ - public static function getRegisteredExtension($id) - { - return isset(self::$extensions[$id]) ? self::$extensions[$id] : null; - } - - /** - * Register the mapping for a custom/unsupported extension. - * - * @param string $id - * @param mixed $value - * @param bool $critical - * @param bool $replace - */ - public function setExtensionValue($id, $value, $critical = false, $replace = false) - { - $this->extensionValues[$id] = compact('critical', 'replace', 'value'); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger.php deleted file mode 100644 index 9438ce3..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger.php +++ /dev/null @@ -1,926 +0,0 @@ - - * add($b); - * - * echo $c->toString(); // outputs 5 - * ?> - * - * - * @author Jim Wigginton - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Math; - -use OCA\Libresign\Vendor\phpseclib3\Exception\BadConfigurationException; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\Engine; - -/** - * Pure-PHP arbitrary precision integer arithmetic library. Supports base-2, base-10, base-16, and base-256 - * numbers. - * - * @author Jim Wigginton - */ -class BigInteger implements \JsonSerializable -{ - /** - * Main Engine - * - * @var class-string - */ - private static $mainEngine; - - /** - * Selected Engines - * - * @var list - */ - private static $engines; - - /** - * The actual BigInteger object - * - * @var object - */ - private $value; - - /** - * Mode independent value used for serialization. - * - * @see self::__sleep() - * @see self::__wakeup() - * @var string - */ - private $hex; - - /** - * Precision (used only for serialization) - * - * @see self::__sleep() - * @see self::__wakeup() - * @var int - */ - private $precision; - - /** - * Sets engine type. - * - * Throws an exception if the type is invalid - * - * @param string $main - * @param list $modexps optional - * @return void - */ - public static function setEngine($main, array $modexps = ['DefaultEngine']) - { - self::$engines = []; - - $fqmain = '\\OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\' . $main; - if (!class_exists($fqmain) || !method_exists($fqmain, 'isValidEngine')) { - throw new \InvalidArgumentException("$main is not a valid engine"); - } - if (!$fqmain::isValidEngine()) { - throw new BadConfigurationException("$main is not setup correctly on this system"); - } - /** @var class-string $fqmain */ - self::$mainEngine = $fqmain; - - $found = false; - foreach ($modexps as $modexp) { - try { - $fqmain::setModExpEngine($modexp); - $found = true; - break; - } catch (\Exception $e) { - } - } - - if (!$found) { - throw new BadConfigurationException("No valid modular exponentiation engine found for $main"); - } - - self::$engines = [$main, $modexp]; - } - - /** - * Returns the engine type - * - * @return string[] - */ - public static function getEngine() - { - self::initialize_static_variables(); - - return self::$engines; - } - - /** - * Initialize static variables - */ - private static function initialize_static_variables() - { - if (!isset(self::$mainEngine)) { - $engines = [ - ['GMP', ['DefaultEngine']], - ['PHP64', ['OpenSSL']], - ['BCMath', ['OpenSSL']], - ['PHP32', ['OpenSSL']], - ['PHP64', ['DefaultEngine']], - ['PHP32', ['DefaultEngine']] - ]; - // per https://phpseclib.com/docs/speed PHP 8.4.0+ _significantly_ sped up BCMath - if (version_compare(PHP_VERSION, '8.4.0') >= 0) { - $engines[1][0] = 'BCMath'; - $engines[2][0] = 'PHP64'; - } - - foreach ($engines as $engine) { - try { - self::setEngine($engine[0], $engine[1]); - return; - } catch (\Exception $e) { - } - } - - throw new \UnexpectedValueException('No valid BigInteger found. This is only possible when JIT is enabled on Windows and neither the GMP or BCMath extensions are available so either disable JIT or install GMP / BCMath'); - } - } - - /** - * Converts base-2, base-10, base-16, and binary strings (base-256) to BigIntegers. - * - * If the second parameter - $base - is negative, then it will be assumed that the number's are encoded using - * two's compliment. The sole exception to this is -10, which is treated the same as 10 is. - * - * @param string|int|Engine $x Base-10 number or base-$base number if $base set. - * @param int $base - */ - public function __construct($x = 0, $base = 10) - { - self::initialize_static_variables(); - - if ($x instanceof self::$mainEngine) { - $this->value = clone $x; - } elseif ($x instanceof Engine) { - $this->value = new static("$x"); - $this->value->setPrecision($x->getPrecision()); - } else { - $this->value = new self::$mainEngine($x, $base); - } - } - - /** - * Converts a BigInteger to a base-10 number. - * - * @return string - */ - public function toString() - { - return $this->value->toString(); - } - - /** - * __toString() magic method - */ - public function __toString() - { - return (string)$this->value; - } - - /** - * __debugInfo() magic method - * - * Will be called, automatically, when print_r() or var_dump() are called - */ - public function __debugInfo() - { - return $this->value->__debugInfo(); - } - - /** - * Converts a BigInteger to a byte string (eg. base-256). - * - * @param bool $twos_compliment - * @return string - */ - public function toBytes($twos_compliment = false) - { - return $this->value->toBytes($twos_compliment); - } - - /** - * Converts a BigInteger to a hex string (eg. base-16). - * - * @param bool $twos_compliment - * @return string - */ - public function toHex($twos_compliment = false) - { - return $this->value->toHex($twos_compliment); - } - - /** - * Converts a BigInteger to a bit string (eg. base-2). - * - * Negative numbers are saved as positive numbers, unless $twos_compliment is set to true, at which point, they're - * saved as two's compliment. - * - * @param bool $twos_compliment - * @return string - */ - public function toBits($twos_compliment = false) - { - return $this->value->toBits($twos_compliment); - } - - /** - * Adds two BigIntegers. - * - * @param BigInteger $y - * @return BigInteger - */ - public function add(BigInteger $y) - { - return new static($this->value->add($y->value)); - } - - /** - * Subtracts two BigIntegers. - * - * @param BigInteger $y - * @return BigInteger - */ - public function subtract(BigInteger $y) - { - return new static($this->value->subtract($y->value)); - } - - /** - * Multiplies two BigIntegers - * - * @param BigInteger $x - * @return BigInteger - */ - public function multiply(BigInteger $x) - { - return new static($this->value->multiply($x->value)); - } - - /** - * Divides two BigIntegers. - * - * Returns an array whose first element contains the quotient and whose second element contains the - * "common residue". If the remainder would be positive, the "common residue" and the remainder are the - * same. If the remainder would be negative, the "common residue" is equal to the sum of the remainder - * and the divisor (basically, the "common residue" is the first positive modulo). - * - * Here's an example: - * - * divide($b); - * - * echo $quotient->toString(); // outputs 0 - * echo "\r\n"; - * echo $remainder->toString(); // outputs 10 - * ?> - * - * - * @param BigInteger $y - * @return BigInteger[] - */ - public function divide(BigInteger $y) - { - list($q, $r) = $this->value->divide($y->value); - return [ - new static($q), - new static($r) - ]; - } - - /** - * Calculates modular inverses. - * - * Say you have (30 mod 17 * x mod 17) mod 17 == 1. x can be found using modular inverses. - * - * @param BigInteger $n - * @return BigInteger - */ - public function modInverse(BigInteger $n) - { - return new static($this->value->modInverse($n->value)); - } - - /** - * Calculates modular inverses. - * - * Say you have (30 mod 17 * x mod 17) mod 17 == 1. x can be found using modular inverses. - * - * @param BigInteger $n - * @return BigInteger[] - */ - public function extendedGCD(BigInteger $n) - { - $extended = $this->value->extendedGCD($n->value); - $gcd = $extended['gcd']; - $x = $extended['x']; - $y = $extended['y']; - return [ - 'gcd' => new static($gcd), - 'x' => new static($x), - 'y' => new static($y) - ]; - } - - /** - * Calculates the greatest common divisor - * - * Say you have 693 and 609. The GCD is 21. - * - * @param BigInteger $n - * @return BigInteger - */ - public function gcd(BigInteger $n) - { - return new static($this->value->gcd($n->value)); - } - - /** - * Absolute value. - * - * @return BigInteger - */ - public function abs() - { - return new static($this->value->abs()); - } - - /** - * Set Precision - * - * Some bitwise operations give different results depending on the precision being used. Examples include left - * shift, not, and rotates. - * - * @param int $bits - */ - public function setPrecision($bits) - { - $this->value->setPrecision($bits); - } - - /** - * Get Precision - * - * Returns the precision if it exists, false if it doesn't - * - * @return int|bool - */ - public function getPrecision() - { - return $this->value->getPrecision(); - } - - /** - * Serialize - * - * Will be called, automatically, when serialize() is called on a BigInteger object. - * - * __sleep() / __wakeup() have been around since PHP 4.0 but were deprecated in PHP 8.5 - * - * \Serializable was introduced in PHP 5.1 and deprecated in PHP 8.1: - * https://wiki.php.net/rfc/phase_out_serializable - * - * __serialize() / __unserialize() were introduced in PHP 7.4: - * https://wiki.php.net/rfc/custom_object_serialization - * - * @return array - */ - public function __sleep() - { - $this->hex = $this->toHex(true); - $vars = ['hex']; - if ($this->getPrecision() > 0) { - $vars[] = 'precision'; - } - return $vars; - } - - /** - * Serialize - * - * Will be called, automatically, when unserialize() is called on a BigInteger object. - */ - public function __wakeup() - { - $temp = new static($this->hex, -16); - $this->value = $temp->value; - if ($this->precision > 0) { - // recalculate $this->bitmask - $this->setPrecision($this->precision); - } - } - - /** - * __serialize() magic method - * - * @see self::__unserialize() - * @return array - * @access public - */ - public function __serialize() - { - $result = ['hex' => $this->toHex(true)]; - if ($this->getPrecision() > 0) { - $result['precision'] = $this->getPrecision(); - } - return $result; - } - - /** - * __unserialize() magic method - * - * @see self::__serialize() - * @access public - */ - public function __unserialize(array $data) - { - $temp = new static($data['hex'], -16); - $this->value = $temp->value; - if (isset($data['precision']) && $data['precision'] > 0) { - // recalculate $this->bitmask - $this->setPrecision($data['precision']); - } - } - - /** - * JSON Serialize - * - * Will be called, automatically, when json_encode() is called on a BigInteger object. - * - * @return array{hex: string, precision?: int] - */ - #[\ReturnTypeWillChange] - public function jsonSerialize() - { - $result = ['hex' => $this->toHex(true)]; - if ($this->precision > 0) { - $result['precision'] = $this->getPrecision(); - } - return $result; - } - - /** - * Performs modular exponentiation. - * - * @param BigInteger $e - * @param BigInteger $n - * @return BigInteger - */ - public function powMod(BigInteger $e, BigInteger $n) - { - return new static($this->value->powMod($e->value, $n->value)); - } - - /** - * Performs modular exponentiation. - * - * @param BigInteger $e - * @param BigInteger $n - * @return BigInteger - */ - public function modPow(BigInteger $e, BigInteger $n) - { - return new static($this->value->modPow($e->value, $n->value)); - } - - /** - * Compares two numbers. - * - * Although one might think !$x->compare($y) means $x != $y, it, in fact, means the opposite. The reason for this - * is demonstrated thusly: - * - * $x > $y: $x->compare($y) > 0 - * $x < $y: $x->compare($y) < 0 - * $x == $y: $x->compare($y) == 0 - * - * Note how the same comparison operator is used. If you want to test for equality, use $x->equals($y). - * - * {@internal Could return $this->subtract($x), but that's not as fast as what we do do.} - * - * @param BigInteger $y - * @return int in case < 0 if $this is less than $y; > 0 if $this is greater than $y, and 0 if they are equal. - * @see self::equals() - */ - public function compare(BigInteger $y) - { - return $this->value->compare($y->value); - } - - /** - * Tests the equality of two numbers. - * - * If you need to see if one number is greater than or less than another number, use BigInteger::compare() - * - * @param BigInteger $x - * @return bool - */ - public function equals(BigInteger $x) - { - return $this->value->equals($x->value); - } - - /** - * Logical Not - * - * @return BigInteger - */ - public function bitwise_not() - { - return new static($this->value->bitwise_not()); - } - - /** - * Logical And - * - * @param BigInteger $x - * @return BigInteger - */ - public function bitwise_and(BigInteger $x) - { - return new static($this->value->bitwise_and($x->value)); - } - - /** - * Logical Or - * - * @param BigInteger $x - * @return BigInteger - */ - public function bitwise_or(BigInteger $x) - { - return new static($this->value->bitwise_or($x->value)); - } - - /** - * Logical Exclusive Or - * - * @param BigInteger $x - * @return BigInteger - */ - public function bitwise_xor(BigInteger $x) - { - return new static($this->value->bitwise_xor($x->value)); - } - - /** - * Logical Right Shift - * - * Shifts BigInteger's by $shift bits, effectively dividing by 2**$shift. - * - * @param int $shift - * @return BigInteger - */ - public function bitwise_rightShift($shift) - { - return new static($this->value->bitwise_rightShift($shift)); - } - - /** - * Logical Left Shift - * - * Shifts BigInteger's by $shift bits, effectively multiplying by 2**$shift. - * - * @param int $shift - * @return BigInteger - */ - public function bitwise_leftShift($shift) - { - return new static($this->value->bitwise_leftShift($shift)); - } - - /** - * Logical Left Rotate - * - * Instead of the top x bits being dropped they're appended to the shifted bit string. - * - * @param int $shift - * @return BigInteger - */ - public function bitwise_leftRotate($shift) - { - return new static($this->value->bitwise_leftRotate($shift)); - } - - /** - * Logical Right Rotate - * - * Instead of the bottom x bits being dropped they're prepended to the shifted bit string. - * - * @param int $shift - * @return BigInteger - */ - public function bitwise_rightRotate($shift) - { - return new static($this->value->bitwise_rightRotate($shift)); - } - - /** - * Returns the smallest and largest n-bit number - * - * @param int $bits - * @return BigInteger[] - */ - public static function minMaxBits($bits) - { - self::initialize_static_variables(); - - $class = self::$mainEngine; - $minMax = $class::minMaxBits($bits); - $min = $minMax['min']; - $max = $minMax['max']; - return [ - 'min' => new static($min), - 'max' => new static($max) - ]; - } - - /** - * Return the size of a BigInteger in bits - * - * @return int - */ - public function getLength() - { - return $this->value->getLength(); - } - - /** - * Return the size of a BigInteger in bytes - * - * @return int - */ - public function getLengthInBytes() - { - return $this->value->getLengthInBytes(); - } - - /** - * Generates a random number of a certain size - * - * Bit length is equal to $size - * - * @param int $size - * @return BigInteger - */ - public static function random($size) - { - self::initialize_static_variables(); - - $class = self::$mainEngine; - return new static($class::random($size)); - } - - /** - * Generates a random prime number of a certain size - * - * Bit length is equal to $size - * - * @param int $size - * @return BigInteger - */ - public static function randomPrime($size) - { - self::initialize_static_variables(); - - $class = self::$mainEngine; - return new static($class::randomPrime($size)); - } - - /** - * Generate a random prime number between a range - * - * If there's not a prime within the given range, false will be returned. - * - * @param BigInteger $min - * @param BigInteger $max - * @return false|BigInteger - */ - public static function randomRangePrime(BigInteger $min, BigInteger $max) - { - $class = self::$mainEngine; - return new static($class::randomRangePrime($min->value, $max->value)); - } - - /** - * Generate a random number between a range - * - * Returns a random number between $min and $max where $min and $max - * can be defined using one of the two methods: - * - * BigInteger::randomRange($min, $max) - * BigInteger::randomRange($max, $min) - * - * @param BigInteger $min - * @param BigInteger $max - * @return BigInteger - */ - public static function randomRange(BigInteger $min, BigInteger $max) - { - $class = self::$mainEngine; - return new static($class::randomRange($min->value, $max->value)); - } - - /** - * Checks a numer to see if it's prime - * - * Assuming the $t parameter is not set, this function has an error rate of 2**-80. The main motivation for the - * $t parameter is distributability. BigInteger::randomPrime() can be distributed across multiple pageloads - * on a website instead of just one. - * - * @param int|bool $t - * @return bool - */ - public function isPrime($t = false) - { - return $this->value->isPrime($t); - } - - /** - * Calculates the nth root of a biginteger. - * - * Returns the nth root of a positive biginteger, where n defaults to 2 - * - * @param int $n optional - * @return BigInteger - */ - public function root($n = 2) - { - return new static($this->value->root($n)); - } - - /** - * Performs exponentiation. - * - * @param BigInteger $n - * @return BigInteger - */ - public function pow(BigInteger $n) - { - return new static($this->value->pow($n->value)); - } - - /** - * Return the minimum BigInteger between an arbitrary number of BigIntegers. - * - * @param BigInteger ...$nums - * @return BigInteger - */ - public static function min(BigInteger ...$nums) - { - $class = self::$mainEngine; - $nums = array_map(function ($num) { - return $num->value; - }, $nums); - return new static($class::min(...$nums)); - } - - /** - * Return the maximum BigInteger between an arbitrary number of BigIntegers. - * - * @param BigInteger ...$nums - * @return BigInteger - */ - public static function max(BigInteger ...$nums) - { - $class = self::$mainEngine; - $nums = array_map(function ($num) { - return $num->value; - }, $nums); - return new static($class::max(...$nums)); - } - - /** - * Tests BigInteger to see if it is between two integers, inclusive - * - * @param BigInteger $min - * @param BigInteger $max - * @return bool - */ - public function between(BigInteger $min, BigInteger $max) - { - return $this->value->between($min->value, $max->value); - } - - /** - * Clone - */ - public function __clone() - { - $this->value = clone $this->value; - } - - /** - * Is Odd? - * - * @return bool - */ - public function isOdd() - { - return $this->value->isOdd(); - } - - /** - * Tests if a bit is set - * - * @param int $x - * @return bool - */ - public function testBit($x) - { - return $this->value->testBit($x); - } - - /** - * Is Negative? - * - * @return bool - */ - public function isNegative() - { - return $this->value->isNegative(); - } - - /** - * Negate - * - * Given $k, returns -$k - * - * @return BigInteger - */ - public function negate() - { - return new static($this->value->negate()); - } - - /** - * Scan for 1 and right shift by that amount - * - * ie. $s = gmp_scan1($n, 0) and $r = gmp_div_q($n, gmp_pow(gmp_init('2'), $s)); - * - * @param BigInteger $r - * @return int - */ - public static function scan1divide(BigInteger $r) - { - $class = self::$mainEngine; - return $class::scan1divide($r->value); - } - - /** - * Create Recurring Modulo Function - * - * Sometimes it may be desirable to do repeated modulos with the same number outside of - * modular exponentiation - * - * @return callable - */ - public function createRecurringModuloFunction() - { - $func = $this->value->createRecurringModuloFunction(); - return function (BigInteger $x) use ($func) { - return new static($func($x->value)); - }; - } - - /** - * Bitwise Split - * - * Splits BigInteger's into chunks of $split bits - * - * @param int $split - * @return BigInteger[] - */ - public function bitwise_split($split) - { - return array_map(function ($val) { - return new static($val); - }, $this->value->bitwise_split($split)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath.php deleted file mode 100644 index c3d6708..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath.php +++ /dev/null @@ -1,702 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines; - -use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; -use OCA\Libresign\Vendor\phpseclib3\Exception\BadConfigurationException; - -/** - * BCMath Engine. - * - * @author Jim Wigginton - */ -class BCMath extends Engine -{ - /** - * Can Bitwise operations be done fast? - * - * @see parent::bitwise_leftRotate() - * @see parent::bitwise_rightRotate() - */ - const FAST_BITWISE = false; - - /** - * Engine Directory - * - * @see parent::setModExpEngine - */ - const ENGINE_DIR = 'BCMath'; - - /** - * Test to see if bcmod() accepts 2 or 3 parameters - */ - const BCMOD_THREE_PARAMS = PHP_VERSION_ID >= 72000; - - /** - * Test for engine validity - * - * @return bool - * @see parent::__construct() - */ - public static function isValidEngine() - { - return extension_loaded('bcmath'); - } - - /** - * Default constructor - * - * @param mixed $x integer Base-10 number or base-$base number if $base set. - * @param int $base - * @see parent::__construct() - */ - public function __construct($x = 0, $base = 10) - { - if (!isset(static::$isValidEngine[static::class])) { - static::$isValidEngine[static::class] = self::isValidEngine(); - } - if (!static::$isValidEngine[static::class]) { - throw new BadConfigurationException('BCMath is not setup correctly on this system'); - } - - $this->value = '0'; - - parent::__construct($x, $base); - } - - /** - * Initialize a BCMath BigInteger Engine instance - * - * @param int $base - * @see parent::__construct() - */ - protected function initialize($base) - { - switch (abs($base)) { - case 256: - // round $len to the nearest 4 - $len = (strlen($this->value) + 3) & ~3; - - $x = str_pad($this->value, $len, chr(0), STR_PAD_LEFT); - - $this->value = '0'; - for ($i = 0; $i < $len; $i += 4) { - $this->value = bcmul($this->value, '4294967296', 0); // 4294967296 == 2**32 - $this->value = bcadd( - $this->value, - 0x1000000 * ord($x[$i]) + ((ord($x[$i + 1]) << 16) | (ord( - $x[$i + 2] - ) << 8) | ord($x[$i + 3])), - 0 - ); - } - - if ($this->is_negative) { - $this->value = '-' . $this->value; - } - break; - case 16: - $x = (strlen($this->value) & 1) ? '0' . $this->value : $this->value; - $temp = new self(Strings::hex2bin($x), 256); - $this->value = $this->is_negative ? '-' . $temp->value : $temp->value; - $this->is_negative = false; - break; - case 10: - // explicitly casting $x to a string is necessary, here, since doing $x[0] on -1 yields different - // results then doing it on '-1' does (modInverse does $x[0]) - $this->value = $this->value === '-' ? '0' : (string)$this->value; - } - } - - /** - * Converts a BigInteger to a base-10 number. - * - * @return string - */ - public function toString() - { - if ($this->value === '0') { - return '0'; - } - - return ltrim($this->value, '0'); - } - - /** - * Converts a BigInteger to a byte string (eg. base-256). - * - * @param bool $twos_compliment - * @return string - */ - public function toBytes($twos_compliment = false) - { - if ($twos_compliment) { - return $this->toBytesHelper(); - } - - $value = ''; - $current = $this->value; - - if ($current[0] == '-') { - $current = substr($current, 1); - } - - while (bccomp($current, '0', 0) > 0) { - $temp = self::BCMOD_THREE_PARAMS ? bcmod($current, '16777216', 0) : bcmod($current, '16777216'); - $value = chr($temp >> 16) . chr($temp >> 8) . chr($temp) . $value; - $current = bcdiv($current, '16777216', 0); - } - - return $this->precision > 0 ? - substr(str_pad($value, $this->precision >> 3, chr(0), STR_PAD_LEFT), -($this->precision >> 3)) : - ltrim($value, chr(0)); - } - - /** - * Adds two BigIntegers. - * - * @param BCMath $y - * @return BCMath - */ - public function add(BCMath $y) - { - $temp = new self(); - $temp->value = bcadd($this->value, $y->value, 0); - - return $this->normalize($temp); - } - - /** - * Subtracts two BigIntegers. - * - * @param BCMath $y - * @return BCMath - */ - public function subtract(BCMath $y) - { - $temp = new self(); - $temp->value = bcsub($this->value, $y->value, 0); - - return $this->normalize($temp); - } - - /** - * Multiplies two BigIntegers. - * - * @param BCMath $x - * @return BCMath - */ - public function multiply(BCMath $x) - { - $temp = new self(); - $temp->value = bcmul($this->value, $x->value, 0); - - return $this->normalize($temp); - } - - /** - * Divides two BigIntegers. - * - * Returns an array whose first element contains the quotient and whose second element contains the - * "common residue". If the remainder would be positive, the "common residue" and the remainder are the - * same. If the remainder would be negative, the "common residue" is equal to the sum of the remainder - * and the divisor (basically, the "common residue" is the first positive modulo). - * - * @param BCMath $y - * @return array{static, static} - */ - public function divide(BCMath $y) - { - $quotient = new self(); - $remainder = new self(); - - $quotient->value = bcdiv($this->value, $y->value, 0); - $remainder->value = self::BCMOD_THREE_PARAMS ? bcmod($this->value, $y->value, 0) : bcmod($this->value, $y->value); - - if ($remainder->value[0] == '-') { - $remainder->value = bcadd($remainder->value, $y->value[0] == '-' ? substr($y->value, 1) : $y->value, 0); - } - - return [$this->normalize($quotient), $this->normalize($remainder)]; - } - - /** - * Calculates modular inverses. - * - * Say you have (30 mod 17 * x mod 17) mod 17 == 1. x can be found using modular inverses. - * - * @param BCMath $n - * @return false|BCMath - */ - public function modInverse(BCMath $n) - { - return $this->modInverseHelper($n); - } - - /** - * Calculates the greatest common divisor and Bezout's identity. - * - * Say you have 693 and 609. The GCD is 21. Bezout's identity states that there exist integers x and y such that - * 693*x + 609*y == 21. In point of fact, there are actually an infinite number of x and y combinations and which - * combination is returned is dependent upon which mode is in use. See - * {@link http://en.wikipedia.org/wiki/B%C3%A9zout%27s_identity Bezout's identity - Wikipedia} for more information. - * - * @param BCMath $n - * @return array{gcd: static, x: static, y: static} - */ - public function extendedGCD(BCMath $n) - { - // it might be faster to use the binary xGCD algorithim here, as well, but (1) that algorithim works - // best when the base is a power of 2 and (2) i don't think it'd make much difference, anyway. as is, - // the basic extended euclidean algorithim is what we're using. - - $u = $this->value; - $v = $n->value; - - $a = '1'; - $b = '0'; - $c = '0'; - $d = '1'; - - while (bccomp($v, '0', 0) != 0) { - $q = bcdiv($u, $v, 0); - - $temp = $u; - $u = $v; - $v = bcsub($temp, bcmul($v, $q, 0), 0); - - $temp = $a; - $a = $c; - $c = bcsub($temp, bcmul($a, $q, 0), 0); - - $temp = $b; - $b = $d; - $d = bcsub($temp, bcmul($b, $q, 0), 0); - } - - return [ - 'gcd' => $this->normalize(new static($u)), - 'x' => $this->normalize(new static($a)), - 'y' => $this->normalize(new static($b)) - ]; - } - - /** - * Calculates the greatest common divisor - * - * Say you have 693 and 609. The GCD is 21. - * - * @param BCMath $n - * @return BCMath - */ - public function gcd(BCMath $n) - { - $gcd = $this->extendedGCD($n)['gcd']; - return $gcd; - } - - /** - * Absolute value. - * - * @return BCMath - */ - public function abs() - { - $temp = new static(); - $temp->value = strlen($this->value) && $this->value[0] == '-' ? - substr($this->value, 1) : - $this->value; - - return $temp; - } - - /** - * Logical And - * - * @param BCMath $x - * @return BCMath - */ - public function bitwise_and(BCMath $x) - { - return $this->bitwiseAndHelper($x); - } - - /** - * Logical Or - * - * @param BCMath $x - * @return BCMath - */ - public function bitwise_or(BCMath $x) - { - return $this->bitwiseOrHelper($x); - } - - /** - * Logical Exclusive Or - * - * @param BCMath $x - * @return BCMath - */ - public function bitwise_xor(BCMath $x) - { - return $this->bitwiseXorHelper($x); - } - - /** - * Logical Right Shift - * - * Shifts BigInteger's by $shift bits, effectively dividing by 2**$shift. - * - * @param int $shift - * @return BCMath - */ - public function bitwise_rightShift($shift) - { - $temp = new static(); - $temp->value = bcdiv($this->value, bcpow('2', $shift, 0), 0); - - return $this->normalize($temp); - } - - /** - * Logical Left Shift - * - * Shifts BigInteger's by $shift bits, effectively multiplying by 2**$shift. - * - * @param int $shift - * @return BCMath - */ - public function bitwise_leftShift($shift) - { - $temp = new static(); - $temp->value = bcmul($this->value, bcpow('2', $shift, 0), 0); - - return $this->normalize($temp); - } - - /** - * Compares two numbers. - * - * Although one might think !$x->compare($y) means $x != $y, it, in fact, means the opposite. The reason for this - * is demonstrated thusly: - * - * $x > $y: $x->compare($y) > 0 - * $x < $y: $x->compare($y) < 0 - * $x == $y: $x->compare($y) == 0 - * - * Note how the same comparison operator is used. If you want to test for equality, use $x->equals($y). - * - * {@internal Could return $this->subtract($x), but that's not as fast as what we do do.} - * - * @param BCMath $y - * @return int in case < 0 if $this is less than $y; > 0 if $this is greater than $y, and 0 if they are equal. - * @see self::equals() - */ - public function compare(BCMath $y) - { - return bccomp($this->value, $y->value, 0); - } - - /** - * Tests the equality of two numbers. - * - * If you need to see if one number is greater than or less than another number, use BigInteger::compare() - * - * @param BCMath $x - * @return bool - */ - public function equals(BCMath $x) - { - return $this->value == $x->value; - } - - /** - * Performs modular exponentiation. - * - * @param BCMath $e - * @param BCMath $n - * @return BCMath - */ - public function modPow(BCMath $e, BCMath $n) - { - return $this->powModOuter($e, $n); - } - - /** - * Performs modular exponentiation. - * - * Alias for modPow(). - * - * @param BCMath $e - * @param BCMath $n - * @return BCMath - */ - public function powMod(BCMath $e, BCMath $n) - { - return $this->powModOuter($e, $n); - } - - /** - * Performs modular exponentiation. - * - * @param BCMath $e - * @param BCMath $n - * @return BCMath - */ - protected function powModInner(BCMath $e, BCMath $n) - { - try { - $class = static::$modexpEngine[static::class]; - return $class::powModHelper($this, $e, $n, static::class); - } catch (\Exception $err) { - return BCMath\DefaultEngine::powModHelper($this, $e, $n, static::class); - } - } - - /** - * Normalize - * - * Removes leading zeros and truncates (if necessary) to maintain the appropriate precision - * - * @param BCMath $result - * @return BCMath - */ - protected function normalize(BCMath $result) - { - $result->precision = $this->precision; - $result->bitmask = $this->bitmask; - - if ($result->bitmask !== false) { - $result->value = self::BCMOD_THREE_PARAMS ? bcmod($result->value, $result->bitmask->value, 0) : bcmod($result->value, $result->bitmask->value); - } - - return $result; - } - - /** - * Generate a random prime number between a range - * - * If there's not a prime within the given range, false will be returned. - * - * @param BCMath $min - * @param BCMath $max - * @return false|BCMath - */ - public static function randomRangePrime(BCMath $min, BCMath $max) - { - return self::randomRangePrimeOuter($min, $max); - } - - /** - * Generate a random number between a range - * - * Returns a random number between $min and $max where $min and $max - * can be defined using one of the two methods: - * - * BigInteger::randomRange($min, $max) - * BigInteger::randomRange($max, $min) - * - * @param BCMath $min - * @param BCMath $max - * @return BCMath - */ - public static function randomRange(BCMath $min, BCMath $max) - { - return self::randomRangeHelper($min, $max); - } - - /** - * Make the current number odd - * - * If the current number is odd it'll be unchanged. If it's even, one will be added to it. - * - * @see self::randomPrime() - */ - protected function make_odd() - { - if (!$this->isOdd()) { - $this->value = bcadd($this->value, '1', 0); - } - } - - /** - * Test the number against small primes. - * - * @see self::isPrime() - */ - protected function testSmallPrimes() - { - if ($this->value === '1') { - return false; - } - if ($this->value === '2') { - return true; - } - if ($this->value[strlen($this->value) - 1] % 2 == 0) { - return false; - } - - $value = $this->value; - - foreach (self::PRIMES as $prime) { - $r = self::BCMOD_THREE_PARAMS ? bcmod($this->value, $prime, 0) : bcmod($this->value, $prime); - if ($r == '0') { - return $this->value == $prime; - } - } - - return true; - } - - /** - * Scan for 1 and right shift by that amount - * - * ie. $s = gmp_scan1($n, 0) and $r = gmp_div_q($n, gmp_pow(gmp_init('2'), $s)); - * - * @param BCMath $r - * @return int - * @see self::isPrime() - */ - public static function scan1divide(BCMath $r) - { - $r_value = &$r->value; - $s = 0; - // if $n was 1, $r would be 0 and this would be an infinite loop, hence our $this->equals(static::$one[static::class]) check earlier - while ($r_value[strlen($r_value) - 1] % 2 == 0) { - $r_value = bcdiv($r_value, '2', 0); - ++$s; - } - - return $s; - } - - /** - * Performs exponentiation. - * - * @param BCMath $n - * @return BCMath - */ - public function pow(BCMath $n) - { - $temp = new self(); - $temp->value = bcpow($this->value, $n->value, 0); - - return $this->normalize($temp); - } - - /** - * Return the minimum BigInteger between an arbitrary number of BigIntegers. - * - * @param BCMath ...$nums - * @return BCMath - */ - public static function min(BCMath ...$nums) - { - return self::minHelper($nums); - } - - /** - * Return the maximum BigInteger between an arbitrary number of BigIntegers. - * - * @param BCMath ...$nums - * @return BCMath - */ - public static function max(BCMath ...$nums) - { - return self::maxHelper($nums); - } - - /** - * Tests BigInteger to see if it is between two integers, inclusive - * - * @param BCMath $min - * @param BCMath $max - * @return bool - */ - public function between(BCMath $min, BCMath $max) - { - return $this->compare($min) >= 0 && $this->compare($max) <= 0; - } - - /** - * Set Bitmask - * - * @param int $bits - * @return Engine - * @see self::setPrecision() - */ - protected static function setBitmask($bits) - { - $temp = parent::setBitmask($bits); - return $temp->add(static::$one[static::class]); - } - - /** - * Is Odd? - * - * @return bool - */ - public function isOdd() - { - return $this->value[strlen($this->value) - 1] % 2 == 1; - } - - /** - * Tests if a bit is set - * - * @return bool - */ - public function testBit($x) - { - $divisor = bcpow('2', $x + 1, 0); - return bccomp( - self::BCMOD_THREE_PARAMS ? bcmod($this->value, $divisor, 0) : bcmod($this->value, $divisor), - bcpow('2', $x, 0), - 0 - ) >= 0; - } - - /** - * Is Negative? - * - * @return bool - */ - public function isNegative() - { - return strlen($this->value) && $this->value[0] == '-'; - } - - /** - * Negate - * - * Given $k, returns -$k - * - * @return BCMath - */ - public function negate() - { - $temp = clone $this; - - if (!strlen($temp->value)) { - return $temp; - } - - $temp->value = $temp->value[0] == '-' ? - substr($this->value, 1) : - '-' . $this->value; - - return $temp; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Base.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Base.php deleted file mode 100644 index 9c5c71a..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Base.php +++ /dev/null @@ -1,110 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\BCMath; - -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\BCMath; - -/** - * Sliding Window Exponentiation Engine - * - * @author Jim Wigginton - */ -abstract class Base extends BCMath -{ - /** - * Cache constants - * - * $cache[self::VARIABLE] tells us whether or not the cached data is still valid. - * - */ - const VARIABLE = 0; - /** - * $cache[self::DATA] contains the cached data. - * - */ - const DATA = 1; - - /** - * Test for engine validity - * - * @return bool - */ - public static function isValidEngine() - { - return static::class != __CLASS__; - } - - /** - * Performs modular exponentiation. - * - * @param BCMath $x - * @param BCMath $e - * @param BCMath $n - * @param string $class - * @return BCMath - */ - protected static function powModHelper(BCMath $x, BCMath $e, BCMath $n, $class) - { - if (empty($e->value)) { - $temp = new $class(); - $temp->value = '1'; - return $x->normalize($temp); - } - - return $x->normalize(static::slidingWindow($x, $e, $n, $class)); - } - - /** - * Modular reduction preparation - * - * @param string $x - * @param string $n - * @param string $class - * @see self::slidingWindow() - * @return string - */ - protected static function prepareReduce($x, $n, $class) - { - return static::reduce($x, $n); - } - - /** - * Modular multiply - * - * @param string $x - * @param string $y - * @param string $n - * @param string $class - * @see self::slidingWindow() - * @return string - */ - protected static function multiplyReduce($x, $y, $n, $class) - { - return static::reduce(bcmul($x, $y, 0), $n); - } - - /** - * Modular square - * - * @param string $x - * @param string $n - * @param string $class - * @see self::slidingWindow() - * @return string - */ - protected static function squareReduce($x, $n, $class) - { - return static::reduce(bcmul($x, $x, 0), $n); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/BuiltIn.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/BuiltIn.php deleted file mode 100644 index 3f76459..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/BuiltIn.php +++ /dev/null @@ -1,40 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\BCMath; - -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\BCMath; - -/** - * Built-In BCMath Modular Exponentiation Engine - * - * @author Jim Wigginton - */ -abstract class BuiltIn extends BCMath -{ - /** - * Performs modular exponentiation. - * - * @param BCMath $x - * @param BCMath $e - * @param BCMath $n - * @return BCMath - */ - protected static function powModHelper(BCMath $x, BCMath $e, BCMath $n) - { - $temp = new BCMath(); - $temp->value = bcpowmod($x->value, $e->value, $n->value, 0); - - return $x->normalize($temp); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/DefaultEngine.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/DefaultEngine.php deleted file mode 100644 index aefc134..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/DefaultEngine.php +++ /dev/null @@ -1,25 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\BCMath; - -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\BCMath\Reductions\Barrett; - -/** - * PHP Default Modular Exponentiation Engine - * - * @author Jim Wigginton - */ -abstract class DefaultEngine extends Barrett -{ -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/OpenSSL.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/OpenSSL.php deleted file mode 100644 index 92a94f5..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/OpenSSL.php +++ /dev/null @@ -1,25 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\BCMath; - -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\OpenSSL as Progenitor; - -/** - * OpenSSL Modular Exponentiation Engine - * - * @author Jim Wigginton - */ -abstract class OpenSSL extends Progenitor -{ -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Reductions/Barrett.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Reductions/Barrett.php deleted file mode 100644 index 2898ef5..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Reductions/Barrett.php +++ /dev/null @@ -1,196 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\BCMath\Reductions; - -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\BCMath\Base; - -/** - * PHP Barrett Modular Exponentiation Engine - * - * @author Jim Wigginton - */ -abstract class Barrett extends Base -{ - /** - * Cache constants - * - * $cache[self::VARIABLE] tells us whether or not the cached data is still valid. - * - */ - const VARIABLE = 0; - /** - * $cache[self::DATA] contains the cached data. - * - */ - const DATA = 1; - - /** - * Barrett Modular Reduction - * - * See {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=14 HAC 14.3.3} / - * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=165 MPM 6.2.5} for more information. Modified slightly, - * so as not to require negative numbers (initially, this script didn't support negative numbers). - * - * Employs "folding", as described at - * {@link http://www.cosic.esat.kuleuven.be/publications/thesis-149.pdf#page=66 thesis-149.pdf#page=66}. To quote from - * it, "the idea [behind folding] is to find a value x' such that x (mod m) = x' (mod m), with x' being smaller than x." - * - * Unfortunately, the "Barrett Reduction with Folding" algorithm described in thesis-149.pdf is not, as written, all that - * usable on account of (1) its not using reasonable radix points as discussed in - * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=162 MPM 6.2.2} and (2) the fact that, even with reasonable - * radix points, it only works when there are an even number of digits in the denominator. The reason for (2) is that - * (x >> 1) + (x >> 1) != x / 2 + x / 2. If x is even, they're the same, but if x is odd, they're not. See the in-line - * comments for details. - * - * @param string $n - * @param string $m - * @return string - */ - protected static function reduce($n, $m) - { - static $cache = [ - self::VARIABLE => [], - self::DATA => [] - ]; - - $m_length = strlen($m); - - if (strlen($n) > 2 * $m_length) { - return self::BCMOD_THREE_PARAMS ? bcmod($n, $m, 0) : bcmod($n, $m); - } - - // if (m.length >> 1) + 2 <= m.length then m is too small and n can't be reduced - if ($m_length < 5) { - return self::regularBarrett($n, $m); - } - // n = 2 * m.length - $correctionNeeded = false; - if ($m_length & 1) { - $correctionNeeded = true; - $n .= '0'; - $m .= '0'; - $m_length++; - } - - if (($key = array_search($m, $cache[self::VARIABLE])) === false) { - $key = count($cache[self::VARIABLE]); - $cache[self::VARIABLE][] = $m; - - $lhs = '1' . str_repeat('0', $m_length + ($m_length >> 1)); - $u = bcdiv($lhs, $m, 0); - $m1 = bcsub($lhs, bcmul($u, $m, 0), 0); - - $cache[self::DATA][] = [ - 'u' => $u, // m.length >> 1 (technically (m.length >> 1) + 1) - 'm1' => $m1 // m.length - ]; - } else { - $cacheValues = $cache[self::DATA][$key]; - $u = $cacheValues['u']; - $m1 = $cacheValues['m1']; - } - - $cutoff = $m_length + ($m_length >> 1); - - $lsd = substr($n, -$cutoff); - $msd = substr($n, 0, -$cutoff); - - $temp = bcmul($msd, $m1, 0); // m.length + (m.length >> 1) - $n = bcadd($lsd, $temp, 0); // m.length + (m.length >> 1) + 1 (so basically we're adding two same length numbers) - //if ($m_length & 1) { - // return self::regularBarrett($n, $m); - //} - - // (m.length + (m.length >> 1) + 1) - (m.length - 1) == (m.length >> 1) + 2 - $temp = substr($n, 0, -$m_length + 1); - // if even: ((m.length >> 1) + 2) + (m.length >> 1) == m.length + 2 - // if odd: ((m.length >> 1) + 2) + (m.length >> 1) == (m.length - 1) + 2 == m.length + 1 - $temp = bcmul($temp, $u, 0); - // if even: (m.length + 2) - ((m.length >> 1) + 1) = m.length - (m.length >> 1) + 1 - // if odd: (m.length + 1) - ((m.length >> 1) + 1) = m.length - (m.length >> 1) - $temp = substr($temp, 0, -($m_length >> 1) - 1); - // if even: (m.length - (m.length >> 1) + 1) + m.length = 2 * m.length - (m.length >> 1) + 1 - // if odd: (m.length - (m.length >> 1)) + m.length = 2 * m.length - (m.length >> 1) - $temp = bcmul($temp, $m, 0); - - // at this point, if m had an odd number of digits, we'd be subtracting a 2 * m.length - (m.length >> 1) digit - // number from a m.length + (m.length >> 1) + 1 digit number. ie. there'd be an extra digit and the while loop - // following this comment would loop a lot (hence our calling _regularBarrett() in that situation). - - $result = bcsub($n, $temp, 0); - - //if (bccomp($result, '0') < 0) { - if ($result[0] == '-') { - $temp = '1' . str_repeat('0', $m_length + 1); - $result = bcadd($result, $temp, 0); - } - - while (bccomp($result, $m, 0) >= 0) { - $result = bcsub($result, $m, 0); - } - - return $correctionNeeded && $result != '0' ? substr($result, 0, -1) : $result; - } - - /** - * (Regular) Barrett Modular Reduction - * - * For numbers with more than four digits BigInteger::_barrett() is faster. The difference between that and this - * is that this function does not fold the denominator into a smaller form. - * - * @param string $x - * @param string $n - * @return string - */ - private static function regularBarrett($x, $n) - { - static $cache = [ - self::VARIABLE => [], - self::DATA => [] - ]; - - $n_length = strlen($n); - - if (strlen($x) > 2 * $n_length) { - return self::BCMOD_THREE_PARAMS ? bcmod($x, $n, 0) : bcmod($x, $n); - } - - if (($key = array_search($n, $cache[self::VARIABLE])) === false) { - $key = count($cache[self::VARIABLE]); - $cache[self::VARIABLE][] = $n; - $lhs = '1' . str_repeat('0', 2 * $n_length); - $cache[self::DATA][] = bcdiv($lhs, $n, 0); - } - - $temp = substr($x, 0, -$n_length + 1); - $temp = bcmul($temp, $cache[self::DATA][$key], 0); - $temp = substr($temp, 0, -$n_length - 1); - - $r1 = substr($x, -$n_length - 1); - $r2 = substr(bcmul($temp, $n, 0), -$n_length - 1); - $result = bcsub($r1, $r2); - - //if (bccomp($result, '0') < 0) { - if ($result[0] == '-') { - $q = '1' . str_repeat('0', $n_length + 1); - $result = bcadd($result, $q, 0); - } - - while (bccomp($result, $n, 0) >= 0) { - $result = bcsub($result, $n, 0); - } - - return $result; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Reductions/EvalBarrett.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Reductions/EvalBarrett.php deleted file mode 100644 index 7ec3678..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/BCMath/Reductions/EvalBarrett.php +++ /dev/null @@ -1,108 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\BCMath\Reductions; - -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\BCMath; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\BCMath\Base; - -/** - * PHP Barrett Modular Exponentiation Engine - * - * @author Jim Wigginton - */ -abstract class EvalBarrett extends Base -{ - /** - * Custom Reduction Function - * - * @see self::generateCustomReduction - */ - private static $custom_reduction; - - /** - * Barrett Modular Reduction - * - * This calls a dynamically generated loop unrolled function that's specific to a given modulo. - * Array lookups are avoided as are if statements testing for how many bits the host OS supports, etc. - * - * @param string $n - * @param string $m - * @return string - */ - protected static function reduce($n, $m) - { - $inline = self::$custom_reduction; - return $inline($n); - } - - /** - * Generate Custom Reduction - * - * @param BCMath $m - * @param string $class - * @return callable|void - */ - protected static function generateCustomReduction(BCMath $m, $class) - { - $m_length = strlen($m); - - if ($m_length < 5) { - $code = 'return self::BCMOD_THREE_PARAMS ? bcmod($x, $n, 0) : bcmod($x, $n);'; - eval('$func = function ($n) { ' . $code . '};'); - self::$custom_reduction = $func; - return; - } - - $lhs = '1' . str_repeat('0', $m_length + ($m_length >> 1)); - $u = bcdiv($lhs, $m, 0); - $m1 = bcsub($lhs, bcmul($u, $m, 0), 0); - - $cutoff = $m_length + ($m_length >> 1); - - $m = "'$m'"; - $u = "'$u'"; - $m1 = "'$m1'"; - - $code = ' - $lsd = substr($n, -' . $cutoff . '); - $msd = substr($n, 0, -' . $cutoff . '); - - $temp = bcmul($msd, ' . $m1 . ', 0); - $n = bcadd($lsd, $temp, 0); - - $temp = substr($n, 0, ' . (-$m_length + 1) . '); - $temp = bcmul($temp, ' . $u . ', 0); - $temp = substr($temp, 0, ' . (-($m_length >> 1) - 1) . '); - $temp = bcmul($temp, ' . $m . ', 0); - - $result = bcsub($n, $temp, 0); - - if ($result[0] == \'-\') { - $temp = \'1' . str_repeat('0', $m_length + 1) . '\'; - $result = bcadd($result, $temp, 0); - } - - while (bccomp($result, ' . $m . ') >= 0) { - $result = bcsub($result, ' . $m . ', 0); - } - - return $result;'; - - eval('$func = function ($n) { ' . $code . '};'); - - self::$custom_reduction = $func; - - return $func; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/Engine.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/Engine.php deleted file mode 100644 index 9122e34..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/Engine.php +++ /dev/null @@ -1,1331 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines; - -use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Random; -use OCA\Libresign\Vendor\phpseclib3\Exception\BadConfigurationException; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * Base Engine. - * - * @author Jim Wigginton - */ -abstract class Engine implements \JsonSerializable -{ - /* final protected */ const PRIMES = [ - 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, - 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, - 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, - 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, - 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, - 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, - 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, - 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, - 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, - 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, - 953, 967, 971, 977, 983, 991, 997, - ]; - - /** - * BigInteger(0) - * - * @var array, static> - */ - protected static $zero = []; - - /** - * BigInteger(1) - * - * @var array, static> - */ - protected static $one = []; - - /** - * BigInteger(2) - * - * @var array, static> - */ - protected static $two = []; - - /** - * Modular Exponentiation Engine - * - * @var array, class-string> - */ - protected static $modexpEngine; - - /** - * Engine Validity Flag - * - * @var array, bool> - */ - protected static $isValidEngine; - - /** - * Holds the BigInteger's value - * - * @var \GMP|string|array|int - */ - protected $value; - - /** - * Holds the BigInteger's sign - * - * @var bool - */ - protected $is_negative; - - /** - * Precision - * - * @see static::setPrecision() - * @var int - */ - protected $precision = -1; - - /** - * Precision Bitmask - * - * @see static::setPrecision() - * @var static|false - */ - protected $bitmask = false; - - /** - * Recurring Modulo Function - * - * @var callable - */ - protected $reduce; - - /** - * Mode independent value used for serialization. - * - * @see self::__sleep() - * @see self::__wakeup() - * @var string - */ - protected $hex; - - /** - * Default constructor - * - * @param int|numeric-string $x integer Base-10 number or base-$base number if $base set. - * @param int $base - */ - public function __construct($x = 0, $base = 10) - { - if (!array_key_exists(static::class, static::$zero)) { - static::$zero[static::class] = null; // Placeholder to prevent infinite loop. - static::$zero[static::class] = new static(0); - static::$one[static::class] = new static(1); - static::$two[static::class] = new static(2); - } - - // '0' counts as empty() but when the base is 256 '0' is equal to ord('0') or 48 - // '0' is the only value like this per http://php.net/empty - if (empty($x) && (abs($base) != 256 || $x !== '0')) { - return; - } - - switch ($base) { - case -256: - case 256: - if ($base == -256 && (ord($x[0]) & 0x80)) { - $this->value = ~$x; - $this->is_negative = true; - } else { - $this->value = $x; - $this->is_negative = false; - } - - $this->initialize($base); - - if ($this->is_negative) { - $temp = $this->add(new static('-1')); - $this->value = $temp->value; - } - break; - case -16: - case 16: - if ($base > 0 && $x[0] == '-') { - $this->is_negative = true; - $x = substr($x, 1); - } - - $x = preg_replace('#^(?:0x)?([A-Fa-f0-9]*).*#s', '$1', $x); - - $is_negative = false; - if ($base < 0 && hexdec($x[0]) >= 8) { - $this->is_negative = $is_negative = true; - $x = Strings::bin2hex(~Strings::hex2bin($x)); - } - - $this->value = $x; - $this->initialize($base); - - if ($is_negative) { - $temp = $this->add(new static('-1')); - $this->value = $temp->value; - } - break; - case -10: - case 10: - // (?value = preg_replace('#(?value) || $this->value == '-') { - $this->value = '0'; - } - $this->initialize($base); - break; - case -2: - case 2: - if ($base > 0 && $x[0] == '-') { - $this->is_negative = true; - $x = substr($x, 1); - } - - $x = preg_replace('#^([01]*).*#s', '$1', $x); - - $temp = new static(Strings::bits2bin($x), 128 * $base); // ie. either -16 or +16 - $this->value = $temp->value; - if ($temp->is_negative) { - $this->is_negative = true; - } - - break; - default: - // base not supported, so we'll let $this == 0 - } - } - - /** - * Sets engine type. - * - * Throws an exception if the type is invalid - * - * @param class-string $engine - */ - public static function setModExpEngine($engine) - { - $fqengine = '\\OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\' . static::ENGINE_DIR . '\\' . $engine; - if (!class_exists($fqengine) || !method_exists($fqengine, 'isValidEngine')) { - throw new \InvalidArgumentException("$engine is not a valid engine"); - } - if (!$fqengine::isValidEngine()) { - throw new BadConfigurationException("$engine is not setup correctly on this system"); - } - static::$modexpEngine[static::class] = $fqengine; - } - - /** - * Converts a BigInteger to a byte string (eg. base-256). - * - * Negative numbers are saved as positive numbers, unless $twos_compliment is set to true, at which point, they're - * saved as two's compliment. - * @return string - */ - protected function toBytesHelper() - { - $comparison = $this->compare(new static()); - if ($comparison == 0) { - return $this->precision > 0 ? str_repeat(chr(0), ($this->precision + 1) >> 3) : ''; - } - - $temp = $comparison < 0 ? $this->add(new static(1)) : $this; - $bytes = $temp->toBytes(); - - if (!strlen($bytes)) { // eg. if the number we're trying to convert is -1 - $bytes = chr(0); - } - - if (ord($bytes[0]) & 0x80) { - $bytes = chr(0) . $bytes; - } - - return $comparison < 0 ? ~$bytes : $bytes; - } - - /** - * Converts a BigInteger to a hex string (eg. base-16). - * - * @param bool $twos_compliment - * @return string - */ - public function toHex($twos_compliment = false) - { - return Strings::bin2hex($this->toBytes($twos_compliment)); - } - - /** - * Converts a BigInteger to a bit string (eg. base-2). - * - * Negative numbers are saved as positive numbers, unless $twos_compliment is set to true, at which point, they're - * saved as two's compliment. - * - * @param bool $twos_compliment - * @return string - */ - public function toBits($twos_compliment = false) - { - $hex = $this->toBytes($twos_compliment); - $bits = Strings::bin2bits($hex); - - $result = $this->precision > 0 ? substr($bits, -$this->precision) : ltrim($bits, '0'); - - if ($twos_compliment && $this->compare(new static()) > 0 && $this->precision <= 0) { - return '0' . $result; - } - - return $result; - } - - /** - * Calculates modular inverses. - * - * Say you have (30 mod 17 * x mod 17) mod 17 == 1. x can be found using modular inverses. - * - * {@internal See {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=21 HAC 14.64} for more information.} - * - * @param Engine $n - * @return static|false - */ - protected function modInverseHelper(Engine $n) - { - // $x mod -$n == $x mod $n. - $n = $n->abs(); - - if ($this->compare(static::$zero[static::class]) < 0) { - $temp = $this->abs(); - $temp = $temp->modInverse($n); - return $this->normalize($n->subtract($temp)); - } - - $extended = $this->extendedGCD($n); - $gcd = $extended['gcd']; - $x = $extended['x']; - - if (!$gcd->equals(static::$one[static::class])) { - return false; - } - - $x = $x->compare(static::$zero[static::class]) < 0 ? $x->add($n) : $x; - - return $this->compare(static::$zero[static::class]) < 0 ? $this->normalize($n->subtract($x)) : $this->normalize($x); - } - - /** - * Serialize - * - * Will be called, automatically, when serialize() is called on a BigInteger object. - * - * @return array - */ - public function __sleep() - { - $this->hex = $this->toHex(true); - $vars = ['hex']; - if ($this->precision > 0) { - $vars[] = 'precision'; - } - return $vars; - } - - /** - * Serialize - * - * Will be called, automatically, when unserialize() is called on a BigInteger object. - * - * @return void - */ - public function __wakeup() - { - $temp = new static($this->hex, -16); - $this->value = $temp->value; - $this->is_negative = $temp->is_negative; - if ($this->precision > 0) { - // recalculate $this->bitmask - $this->setPrecision($this->precision); - } - } - - /** - * __serialize() magic method - * - * __sleep / __wakeup were depreciated in PHP 8.5 - * Will be called, automatically, when serialize() is called on a Math_BigInteger object. - * - * @see self::__unserialize() - * @access public - */ - public function __serialize() - { - $result = ['hex' => $this->toHex(true)]; - if ($this->precision > 0) { - $result['precision'] = $this->precision; - } - return $result; - } - - /** - * __unserialize() magic method - * - * __sleep / __wakeup were depreciated in PHP 8.5 - * Will be called, automatically, when unserialize() is called on a Math_BigInteger object. - * - * @see self::__serialize() - * @access public - */ - public function __unserialize(array $data) - { - $temp = new static($data['hex'], -16); - $this->value = $temp->value; - $this->is_negative = $temp->is_negative; - if (isset($data['precision']) && $data['precision'] > 0) { - // recalculate $this->bitmask - $this->setPrecision($data['precision']); - } - } - - /** - * JSON Serialize - * - * Will be called, automatically, when json_encode() is called on a BigInteger object. - * - * @return array{hex: string, precision?: int] - */ - #[\ReturnTypeWillChange] - public function jsonSerialize() - { - $result = ['hex' => $this->toHex(true)]; - if ($this->precision > 0) { - $result['precision'] = $this->precision; - } - return $result; - } - - /** - * Converts a BigInteger to a base-10 number. - * - * @return string - */ - public function __toString() - { - return $this->toString(); - } - - /** - * __debugInfo() magic method - * - * Will be called, automatically, when print_r() or var_dump() are called - * - * @return array - */ - public function __debugInfo() - { - $result = [ - 'value' => '0x' . $this->toHex(true), - 'engine' => basename(static::class) - ]; - return $this->precision > 0 ? $result + ['precision' => $this->precision] : $result; - } - - /** - * Set Precision - * - * Some bitwise operations give different results depending on the precision being used. Examples include left - * shift, not, and rotates. - * - * @param int $bits - */ - public function setPrecision($bits) - { - if ($bits < 1) { - $this->precision = -1; - $this->bitmask = false; - - return; - } - $this->precision = $bits; - $this->bitmask = static::setBitmask($bits); - - $temp = $this->normalize($this); - $this->value = $temp->value; - } - - /** - * Get Precision - * - * Returns the precision if it exists, -1 if it doesn't - * - * @return int - */ - public function getPrecision() - { - return $this->precision; - } - - /** - * Set Bitmask - * @return static - * @param int $bits - * @see self::setPrecision() - */ - protected static function setBitmask($bits) - { - return new static(chr((1 << ($bits & 0x7)) - 1) . str_repeat(chr(0xFF), $bits >> 3), 256); - } - - /** - * Logical Not - * - * @return Engine|string - */ - public function bitwise_not() - { - // calculuate "not" without regard to $this->precision - // (will always result in a smaller number. ie. ~1 isn't 1111 1110 - it's 0) - $temp = $this->toBytes(); - if ($temp == '') { - return $this->normalize(static::$zero[static::class]); - } - $pre_msb = decbin(ord($temp[0])); - $temp = ~$temp; - $msb = decbin(ord($temp[0])); - if (strlen($msb) == 8) { - $msb = substr($msb, strpos($msb, '0')); - } - $temp[0] = chr(bindec($msb)); - - // see if we need to add extra leading 1's - $current_bits = strlen($pre_msb) + 8 * strlen($temp) - 8; - $new_bits = $this->precision - $current_bits; - if ($new_bits <= 0) { - return $this->normalize(new static($temp, 256)); - } - - // generate as many leading 1's as we need to. - $leading_ones = chr((1 << ($new_bits & 0x7)) - 1) . str_repeat(chr(0xFF), $new_bits >> 3); - - self::base256_lshift($leading_ones, $current_bits); - - $temp = str_pad($temp, strlen($leading_ones), chr(0), STR_PAD_LEFT); - - return $this->normalize(new static($leading_ones | $temp, 256)); - } - - /** - * Logical Left Shift - * - * Shifts binary strings $shift bits, essentially multiplying by 2**$shift. - * - * @param string $x - * @param int $shift - * @return void - */ - protected static function base256_lshift(&$x, $shift) - { - if ($shift == 0) { - return; - } - - $num_bytes = $shift >> 3; // eg. floor($shift/8) - $shift &= 7; // eg. $shift % 8 - - $carry = 0; - for ($i = strlen($x) - 1; $i >= 0; --$i) { - $temp = ord($x[$i]) << $shift | $carry; - $x[$i] = chr($temp); - $carry = $temp >> 8; - } - $carry = ($carry != 0) ? chr($carry) : ''; - $x = $carry . $x . str_repeat(chr(0), $num_bytes); - } - - /** - * Logical Left Rotate - * - * Instead of the top x bits being dropped they're appended to the shifted bit string. - * - * @param int $shift - * @return Engine - */ - public function bitwise_leftRotate($shift) - { - $bits = $this->toBytes(); - - if ($this->precision > 0) { - $precision = $this->precision; - if (static::FAST_BITWISE) { - $mask = $this->bitmask->toBytes(); - } else { - $mask = $this->bitmask->subtract(new static(1)); - $mask = $mask->toBytes(); - } - } else { - $temp = ord($bits[0]); - for ($i = 0; $temp >> $i; ++$i) { - } - $precision = 8 * strlen($bits) - 8 + $i; - $mask = chr((1 << ($precision & 0x7)) - 1) . str_repeat(chr(0xFF), $precision >> 3); - } - - if ($shift < 0) { - $shift += $precision; - } - $shift %= $precision; - - if (!$shift) { - return clone $this; - } - - $left = $this->bitwise_leftShift($shift); - $left = $left->bitwise_and(new static($mask, 256)); - $right = $this->bitwise_rightShift($precision - $shift); - $result = static::FAST_BITWISE ? $left->bitwise_or($right) : $left->add($right); - return $this->normalize($result); - } - - /** - * Logical Right Rotate - * - * Instead of the bottom x bits being dropped they're prepended to the shifted bit string. - * - * @param int $shift - * @return Engine - */ - public function bitwise_rightRotate($shift) - { - return $this->bitwise_leftRotate(-$shift); - } - - /** - * Returns the smallest and largest n-bit number - * - * @param int $bits - * @return array{min: static, max: static} - */ - public static function minMaxBits($bits) - { - $bytes = $bits >> 3; - $min = str_repeat(chr(0), $bytes); - $max = str_repeat(chr(0xFF), $bytes); - $msb = $bits & 7; - if ($msb) { - $min = chr(1 << ($msb - 1)) . $min; - $max = chr((1 << $msb) - 1) . $max; - } else { - $min[0] = chr(0x80); - } - return [ - 'min' => new static($min, 256), - 'max' => new static($max, 256) - ]; - } - - /** - * Return the size of a BigInteger in bits - * - * @return int - */ - public function getLength() - { - return strlen($this->toBits()); - } - - /** - * Return the size of a BigInteger in bytes - * - * @return int - */ - public function getLengthInBytes() - { - return (int) ceil($this->getLength() / 8); - } - - /** - * Performs some pre-processing for powMod - * - * @param Engine $e - * @param Engine $n - * @return static|false - */ - protected function powModOuter(Engine $e, Engine $n) - { - $n = $this->bitmask !== false && $this->bitmask->compare($n) < 0 ? $this->bitmask : $n->abs(); - - if ($e->compare(new static()) < 0) { - $e = $e->abs(); - - $temp = $this->modInverse($n); - if ($temp === false) { - return false; - } - - return $this->normalize($temp->powModInner($e, $n)); - } - - if ($this->compare($n) > 0 || $this->isNegative()) { - list(, $temp) = $this->divide($n); - return $temp->powModInner($e, $n); - } - - return $this->powModInner($e, $n); - } - - /** - * Sliding Window k-ary Modular Exponentiation - * - * Based on {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=27 HAC 14.85} / - * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=210 MPM 7.7}. In a departure from those algorithims, - * however, this function performs a modular reduction after every multiplication and squaring operation. - * As such, this function has the same preconditions that the reductions being used do. - * - * @template T of Engine - * @param Engine $x - * @param Engine $e - * @param Engine $n - * @param class-string $class - * @return T - */ - protected static function slidingWindow(Engine $x, Engine $e, Engine $n, $class) - { - static $window_ranges = [7, 25, 81, 241, 673, 1793]; // from BigInteger.java's oddModPow function - //static $window_ranges = [0, 7, 36, 140, 450, 1303, 3529]; // from MPM 7.3.1 - - $e_bits = $e->toBits(); - $e_length = strlen($e_bits); - - // calculate the appropriate window size. - // $window_size == 3 if $window_ranges is between 25 and 81, for example. - for ($i = 0, $window_size = 1; $i < count($window_ranges) && $e_length > $window_ranges[$i]; ++$window_size, ++$i) { - } - - $n_value = $n->value; - - if (method_exists(static::class, 'generateCustomReduction')) { - static::generateCustomReduction($n, $class); - } - - // precompute $this^0 through $this^$window_size - $powers = []; - $powers[1] = static::prepareReduce($x->value, $n_value, $class); - $powers[2] = static::squareReduce($powers[1], $n_value, $class); - - // we do every other number since substr($e_bits, $i, $j+1) (see below) is supposed to end - // in a 1. ie. it's supposed to be odd. - $temp = 1 << ($window_size - 1); - for ($i = 1; $i < $temp; ++$i) { - $i2 = $i << 1; - $powers[$i2 + 1] = static::multiplyReduce($powers[$i2 - 1], $powers[2], $n_value, $class); - } - - $result = new $class(1); - $result = static::prepareReduce($result->value, $n_value, $class); - - for ($i = 0; $i < $e_length;) { - if (!$e_bits[$i]) { - $result = static::squareReduce($result, $n_value, $class); - ++$i; - } else { - for ($j = $window_size - 1; $j > 0; --$j) { - if (!empty($e_bits[$i + $j])) { - break; - } - } - - // eg. the length of substr($e_bits, $i, $j + 1) - for ($k = 0; $k <= $j; ++$k) { - $result = static::squareReduce($result, $n_value, $class); - } - - $result = static::multiplyReduce($result, $powers[bindec(substr($e_bits, $i, $j + 1))], $n_value, $class); - - $i += $j + 1; - } - } - - $temp = new $class(); - $temp->value = static::reduce($result, $n_value, $class); - - return $temp; - } - - /** - * Generates a random number of a certain size - * - * Bit length is equal to $size - * - * @param int $size - * @return Engine - */ - public static function random($size) - { - $minMax = static::minMaxBits($size); - $min = $minMax['min']; - $max = $minMax['max']; - return static::randomRange($min, $max); - } - - /** - * Generates a random prime number of a certain size - * - * Bit length is equal to $size - * - * @param int $size - * @return Engine - */ - public static function randomPrime($size) - { - $minMax = static::minMaxBits($size); - $min = $minMax['min']; - $max = $minMax['max']; - return static::randomRangePrime($min, $max); - } - - /** - * Performs some pre-processing for randomRangePrime - * - * @param Engine $min - * @param Engine $max - * @return static|false - */ - protected static function randomRangePrimeOuter(Engine $min, Engine $max) - { - $compare = $max->compare($min); - - if (!$compare) { - return $min->isPrime() ? $min : false; - } elseif ($compare < 0) { - // if $min is bigger then $max, swap $min and $max - $temp = $max; - $max = $min; - $min = $temp; - } - - $length = $max->getLength(); - if ($length > 8196) { - throw new \RuntimeException("Generation of random prime numbers larger than 8196 has been disabled ($length)"); - } - - $x = static::randomRange($min, $max); - - return static::randomRangePrimeInner($x, $min, $max); - } - - /** - * Generate a random number between a range - * - * Returns a random number between $min and $max where $min and $max - * can be defined using one of the two methods: - * - * BigInteger::randomRange($min, $max) - * BigInteger::randomRange($max, $min) - * - * @param Engine $min - * @param Engine $max - * @return Engine - */ - protected static function randomRangeHelper(Engine $min, Engine $max) - { - $compare = $max->compare($min); - - if (!$compare) { - return $min; - } elseif ($compare < 0) { - // if $min is bigger then $max, swap $min and $max - $temp = $max; - $max = $min; - $min = $temp; - } - - if (!isset(static::$one[static::class])) { - static::$one[static::class] = new static(1); - } - - $max = $max->subtract($min->subtract(static::$one[static::class])); - - $size = strlen(ltrim($max->toBytes(), chr(0))); - - /* - doing $random % $max doesn't work because some numbers will be more likely to occur than others. - eg. if $max is 140 and $random's max is 255 then that'd mean both $random = 5 and $random = 145 - would produce 5 whereas the only value of random that could produce 139 would be 139. ie. - not all numbers would be equally likely. some would be more likely than others. - - creating a whole new random number until you find one that is within the range doesn't work - because, for sufficiently small ranges, the likelihood that you'd get a number within that range - would be pretty small. eg. with $random's max being 255 and if your $max being 1 the probability - would be pretty high that $random would be greater than $max. - - phpseclib works around this using the technique described here: - - http://crypto.stackexchange.com/questions/5708/creating-a-small-number-from-a-cryptographically-secure-random-string - */ - $random_max = new static(chr(1) . str_repeat("\0", $size), 256); - $random = new static(Random::string($size), 256); - - list($max_multiple) = $random_max->divide($max); - $max_multiple = $max_multiple->multiply($max); - - while ($random->compare($max_multiple) >= 0) { - $random = $random->subtract($max_multiple); - $random_max = $random_max->subtract($max_multiple); - $random = $random->bitwise_leftShift(8); - $random = $random->add(new static(Random::string(1), 256)); - $random_max = $random_max->bitwise_leftShift(8); - list($max_multiple) = $random_max->divide($max); - $max_multiple = $max_multiple->multiply($max); - } - list(, $random) = $random->divide($max); - - return $random->add($min); - } - - /** - * Performs some post-processing for randomRangePrime - * - * @param Engine $x - * @param Engine $min - * @param Engine $max - * @return static|false - */ - protected static function randomRangePrimeInner(Engine $x, Engine $min, Engine $max) - { - if (!isset(static::$two[static::class])) { - static::$two[static::class] = new static('2'); - } - - $x->make_odd(); - if ($x->compare($max) > 0) { - // if $x > $max then $max is even and if $min == $max then no prime number exists between the specified range - if ($min->equals($max)) { - return false; - } - $x = clone $min; - $x->make_odd(); - } - - $initial_x = clone $x; - - while (true) { - if ($x->isPrime()) { - return $x; - } - - $x = $x->add(static::$two[static::class]); - - if ($x->compare($max) > 0) { - $x = clone $min; - if ($x->equals(static::$two[static::class])) { - return $x; - } - $x->make_odd(); - } - - if ($x->equals($initial_x)) { - return false; - } - } - } - - /** - * Sets the $t parameter for primality testing - * - * @return int - */ - protected function setupIsPrime() - { - $length = $this->getLengthInBytes(); - - // see HAC 4.49 "Note (controlling the error probability)" - // @codingStandardsIgnoreStart - if ($length >= 163) { $t = 2; } // floor(1300 / 8) - else if ($length >= 106) { $t = 3; } // floor( 850 / 8) - else if ($length >= 81 ) { $t = 4; } // floor( 650 / 8) - else if ($length >= 68 ) { $t = 5; } // floor( 550 / 8) - else if ($length >= 56 ) { $t = 6; } // floor( 450 / 8) - else if ($length >= 50 ) { $t = 7; } // floor( 400 / 8) - else if ($length >= 43 ) { $t = 8; } // floor( 350 / 8) - else if ($length >= 37 ) { $t = 9; } // floor( 300 / 8) - else if ($length >= 31 ) { $t = 12; } // floor( 250 / 8) - else if ($length >= 25 ) { $t = 15; } // floor( 200 / 8) - else if ($length >= 18 ) { $t = 18; } // floor( 150 / 8) - else { $t = 27; } - // @codingStandardsIgnoreEnd - - return $t; - } - - /** - * Tests Primality - * - * Uses the {@link http://en.wikipedia.org/wiki/Miller%E2%80%93Rabin_primality_test Miller-Rabin primality test}. - * See {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap4.pdf#page=8 HAC 4.24} for more info. - * - * @param int $t - * @return bool - */ - protected function testPrimality($t) - { - if (!$this->testSmallPrimes()) { - return false; - } - - $n = clone $this; - $n_1 = $n->subtract(static::$one[static::class]); - $n_2 = $n->subtract(static::$two[static::class]); - - $r = clone $n_1; - $s = static::scan1divide($r); - - for ($i = 0; $i < $t; ++$i) { - $a = static::randomRange(static::$two[static::class], $n_2); - $y = $a->modPow($r, $n); - - if (!$y->equals(static::$one[static::class]) && !$y->equals($n_1)) { - for ($j = 1; $j < $s && !$y->equals($n_1); ++$j) { - $y = $y->modPow(static::$two[static::class], $n); - if ($y->equals(static::$one[static::class])) { - return false; - } - } - - if (!$y->equals($n_1)) { - return false; - } - } - } - - return true; - } - - /** - * Checks a numer to see if it's prime - * - * Assuming the $t parameter is not set, this function has an error rate of 2**-80. The main motivation for the - * $t parameter is distributability. BigInteger::randomPrime() can be distributed across multiple pageloads - * on a website instead of just one. - * - * @param int|bool $t - * @return bool - */ - public function isPrime($t = false) - { - // OpenSSL limits RSA keys to 16384 bits. The length of an RSA key is equal to the length of the modulo, which is - // produced by multiplying the primes p and q by one another. The largest number two 8196 bit primes can produce is - // a 16384 bit number so, basically, 8196 bit primes are the largest OpenSSL will generate and if that's the largest - // that it'll generate it also stands to reason that that's the largest you'll be able to test primality on - $length = $this->getLength(); - if ($length > 8196) { - throw new \RuntimeException("Primality testing is not supported for numbers larger than 8196 bits ($length)"); - } - - if (!$t) { - $t = $this->setupIsPrime(); - } - return $this->testPrimality($t); - } - - /** - * Performs a few preliminary checks on root - * - * @param int $n - * @return Engine - */ - protected function rootHelper($n) - { - if ($n < 1) { - return clone static::$zero[static::class]; - } // we want positive exponents - if ($this->compare(static::$one[static::class]) < 0) { - return clone static::$zero[static::class]; - } // we want positive numbers - if ($this->compare(static::$two[static::class]) < 0) { - return clone static::$one[static::class]; - } // n-th root of 1 or 2 is 1 - - return $this->rootInner($n); - } - - /** - * Calculates the nth root of a biginteger. - * - * Returns the nth root of a positive biginteger, where n defaults to 2 - * - * {@internal This function is based off of {@link http://mathforum.org/library/drmath/view/52605.html this page} and {@link http://stackoverflow.com/questions/11242920/calculating-nth-root-with-bcmath-in-php this stackoverflow question}.} - * - * @param int $n - * @return Engine - */ - protected function rootInner($n) - { - $n = new static($n); - - // g is our guess number - $g = static::$two[static::class]; - // while (g^n < num) g=g*2 - while ($g->pow($n)->compare($this) < 0) { - $g = $g->multiply(static::$two[static::class]); - } - // if (g^n==num) num is a power of 2, we're lucky, end of job - // == 0 bccomp(bcpow($g, $n), $n->value)==0 - if ($g->pow($n)->equals($this) > 0) { - $root = $g; - return $this->normalize($root); - } - - // if we're here num wasn't a power of 2 :( - $og = $g; // og means original guess and here is our upper bound - $g = $g->divide(static::$two[static::class])[0]; // g is set to be our lower bound - $step = $og->subtract($g)->divide(static::$two[static::class])[0]; // step is the half of upper bound - lower bound - $g = $g->add($step); // we start at lower bound + step , basically in the middle of our interval - - // while step>1 - - while ($step->compare(static::$one[static::class]) == 1) { - $guess = $g->pow($n); - $step = $step->divide(static::$two[static::class])[0]; - $comp = $guess->compare($this); // compare our guess with real number - switch ($comp) { - case -1: // if guess is lower we add the new step - $g = $g->add($step); - break; - case 1: // if guess is higher we sub the new step - $g = $g->subtract($step); - break; - case 0: // if guess is exactly the num we're done, we return the value - $root = $g; - break 2; - } - } - - if ($comp == 1) { - $g = $g->subtract($step); - } - - // whatever happened, g is the closest guess we can make so return it - $root = $g; - - return $this->normalize($root); - } - - /** - * Calculates the nth root of a biginteger. - * - * @param int $n - * @return Engine - */ - public function root($n = 2) - { - return $this->rootHelper($n); - } - - /** - * Return the minimum BigInteger between an arbitrary number of BigIntegers. - * - * @param array $nums - * @return Engine - */ - protected static function minHelper(array $nums) - { - if (count($nums) == 1) { - return $nums[0]; - } - $min = $nums[0]; - for ($i = 1; $i < count($nums); $i++) { - $min = $min->compare($nums[$i]) > 0 ? $nums[$i] : $min; - } - return $min; - } - - /** - * Return the minimum BigInteger between an arbitrary number of BigIntegers. - * - * @param array $nums - * @return Engine - */ - protected static function maxHelper(array $nums) - { - if (count($nums) == 1) { - return $nums[0]; - } - $max = $nums[0]; - for ($i = 1; $i < count($nums); $i++) { - $max = $max->compare($nums[$i]) < 0 ? $nums[$i] : $max; - } - return $max; - } - - /** - * Create Recurring Modulo Function - * - * Sometimes it may be desirable to do repeated modulos with the same number outside of - * modular exponentiation - * - * @return callable - */ - public function createRecurringModuloFunction() - { - $class = static::class; - - $fqengine = !method_exists(static::$modexpEngine[static::class], 'reduce') ? - '\\OCA\\Libresign\\Vendor\\phpseclib3\\Math\\BigInteger\\Engines\\' . static::ENGINE_DIR . '\\DefaultEngine' : - static::$modexpEngine[static::class]; - if (method_exists($fqengine, 'generateCustomReduction')) { - $func = $fqengine::generateCustomReduction($this, static::class); - return eval('return function(' . static::class . ' $x) use ($func, $class) { - $r = new $class(); - $r->value = $func($x->value); - return $r; - };'); - } - $n = $this->value; - return eval('return function(' . static::class . ' $x) use ($n, $fqengine, $class) { - $r = new $class(); - $r->value = $fqengine::reduce($x->value, $n, $class); - return $r; - };'); - } - - /** - * Calculates the greatest common divisor and Bezout's identity. - * - * @param Engine $n - * @return array{gcd: Engine, x: Engine, y: Engine} - */ - protected function extendedGCDHelper(Engine $n) - { - $u = clone $this; - $v = clone $n; - - $one = new static(1); - $zero = new static(); - - $a = clone $one; - $b = clone $zero; - $c = clone $zero; - $d = clone $one; - - while (!$v->equals($zero)) { - list($q) = $u->divide($v); - - $temp = $u; - $u = $v; - $v = $temp->subtract($v->multiply($q)); - - $temp = $a; - $a = $c; - $c = $temp->subtract($a->multiply($q)); - - $temp = $b; - $b = $d; - $d = $temp->subtract($b->multiply($q)); - } - - return [ - 'gcd' => $u, - 'x' => $a, - 'y' => $b - ]; - } - - /** - * Bitwise Split - * - * Splits BigInteger's into chunks of $split bits - * - * @param int $split - * @return Engine[] - */ - public function bitwise_split($split) - { - if ($split < 1) { - throw new \RuntimeException('Offset must be greater than 1'); - } - - $mask = static::$one[static::class]->bitwise_leftShift($split)->subtract(static::$one[static::class]); - - $num = clone $this; - - $vals = []; - while (!$num->equals(static::$zero[static::class])) { - $vals[] = $num->bitwise_and($mask); - $num = $num->bitwise_rightShift($split); - } - - return array_reverse($vals); - } - - /** - * Logical And - * - * @param Engine $x - * @return Engine - */ - protected function bitwiseAndHelper(Engine $x) - { - $left = $this->toBytes(true); - $right = $x->toBytes(true); - - $length = max(strlen($left), strlen($right)); - - $left = str_pad($left, $length, chr(0), STR_PAD_LEFT); - $right = str_pad($right, $length, chr(0), STR_PAD_LEFT); - - return $this->normalize(new static($left & $right, -256)); - } - - /** - * Logical Or - * - * @param Engine $x - * @return Engine - */ - protected function bitwiseOrHelper(Engine $x) - { - $left = $this->toBytes(true); - $right = $x->toBytes(true); - - $length = max(strlen($left), strlen($right)); - - $left = str_pad($left, $length, chr(0), STR_PAD_LEFT); - $right = str_pad($right, $length, chr(0), STR_PAD_LEFT); - - return $this->normalize(new static($left | $right, -256)); - } - - /** - * Logical Exclusive Or - * - * @param Engine $x - * @return Engine - */ - protected function bitwiseXorHelper(Engine $x) - { - $left = $this->toBytes(true); - $right = $x->toBytes(true); - - $length = max(strlen($left), strlen($right)); - - - $left = str_pad($left, $length, chr(0), STR_PAD_LEFT); - $right = str_pad($right, $length, chr(0), STR_PAD_LEFT); - return $this->normalize(new static($left ^ $right, -256)); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/GMP.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/GMP.php deleted file mode 100644 index e9c185c..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/GMP.php +++ /dev/null @@ -1,697 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines; - -use OCA\Libresign\Vendor\phpseclib3\Exception\BadConfigurationException; - -/** - * GMP Engine. - * - * @author Jim Wigginton - */ -class GMP extends Engine -{ - /** - * Can Bitwise operations be done fast? - * - * @see parent::bitwise_leftRotate() - * @see parent::bitwise_rightRotate() - */ - const FAST_BITWISE = true; - - /** - * Engine Directory - * - * @see parent::setModExpEngine - */ - const ENGINE_DIR = 'GMP'; - - /** - * Test for engine validity - * - * @return bool - * @see parent::__construct() - */ - public static function isValidEngine() - { - return extension_loaded('gmp'); - } - - /** - * Default constructor - * - * @param mixed $x integer Base-10 number or base-$base number if $base set. - * @param int $base - * @see parent::__construct() - */ - public function __construct($x = 0, $base = 10) - { - if (!isset(static::$isValidEngine[static::class])) { - static::$isValidEngine[static::class] = self::isValidEngine(); - } - if (!static::$isValidEngine[static::class]) { - throw new BadConfigurationException('GMP is not setup correctly on this system'); - } - - if ($x instanceof \GMP) { - $this->value = $x; - return; - } - - $this->value = gmp_init(0); - - parent::__construct($x, $base); - } - - /** - * Initialize a GMP BigInteger Engine instance - * - * @param int $base - * @see parent::__construct() - */ - protected function initialize($base) - { - switch (abs($base)) { - case 256: - $this->value = gmp_import($this->value); - if ($this->is_negative) { - $this->value = -$this->value; - } - break; - case 16: - $temp = $this->is_negative ? '-0x' . $this->value : '0x' . $this->value; - $this->value = gmp_init($temp); - break; - case 10: - $this->value = gmp_init(isset($this->value) ? $this->value : '0'); - } - } - - /** - * Converts a BigInteger to a base-10 number. - * - * @return string - */ - public function toString() - { - return (string)$this->value; - } - - /** - * Converts a BigInteger to a bit string (eg. base-2). - * - * Negative numbers are saved as positive numbers, unless $twos_compliment is set to true, at which point, they're - * saved as two's compliment. - * - * @param bool $twos_compliment - * @return string - */ - public function toBits($twos_compliment = false) - { - $hex = $this->toHex($twos_compliment); - - $bits = gmp_strval(gmp_init($hex, 16), 2); - - if ($this->precision > 0) { - $bits = substr($bits, -$this->precision); - } - - if ($twos_compliment && $this->compare(new static()) > 0 && $this->precision <= 0) { - return '0' . $bits; - } - - return $bits; - } - - /** - * Converts a BigInteger to a byte string (eg. base-256). - * - * @param bool $twos_compliment - * @return string - */ - public function toBytes($twos_compliment = false) - { - if ($twos_compliment) { - return $this->toBytesHelper(); - } - - if (gmp_cmp($this->value, gmp_init(0)) == 0) { - return $this->precision > 0 ? str_repeat(chr(0), ($this->precision + 1) >> 3) : ''; - } - - $temp = gmp_export($this->value); - - return $this->precision > 0 ? - substr(str_pad($temp, $this->precision >> 3, chr(0), STR_PAD_LEFT), -($this->precision >> 3)) : - ltrim($temp, chr(0)); - } - - /** - * Adds two BigIntegers. - * - * @param GMP $y - * @return GMP - */ - public function add(GMP $y) - { - $temp = new self(); - $temp->value = $this->value + $y->value; - - return $this->normalize($temp); - } - - /** - * Subtracts two BigIntegers. - * - * @param GMP $y - * @return GMP - */ - public function subtract(GMP $y) - { - $temp = new self(); - $temp->value = $this->value - $y->value; - - return $this->normalize($temp); - } - - /** - * Multiplies two BigIntegers. - * - * @param GMP $x - * @return GMP - */ - public function multiply(GMP $x) - { - $temp = new self(); - $temp->value = $this->value * $x->value; - - return $this->normalize($temp); - } - - /** - * Divides two BigIntegers. - * - * Returns an array whose first element contains the quotient and whose second element contains the - * "common residue". If the remainder would be positive, the "common residue" and the remainder are the - * same. If the remainder would be negative, the "common residue" is equal to the sum of the remainder - * and the divisor (basically, the "common residue" is the first positive modulo). - * - * @param GMP $y - * @return array{GMP, GMP} - */ - public function divide(GMP $y) - { - $quotient = new self(); - $remainder = new self(); - - list($quotient->value, $remainder->value) = gmp_div_qr($this->value, $y->value); - - if (gmp_sign($remainder->value) < 0) { - $remainder->value = $remainder->value + gmp_abs($y->value); - } - - return [$this->normalize($quotient), $this->normalize($remainder)]; - } - - /** - * Compares two numbers. - * - * Although one might think !$x->compare($y) means $x != $y, it, in fact, means the opposite. The reason for this - * is demonstrated thusly: - * - * $x > $y: $x->compare($y) > 0 - * $x < $y: $x->compare($y) < 0 - * $x == $y: $x->compare($y) == 0 - * - * Note how the same comparison operator is used. If you want to test for equality, use $x->equals($y). - * - * {@internal Could return $this->subtract($x), but that's not as fast as what we do do.} - * - * @param GMP $y - * @return int in case < 0 if $this is less than $y; > 0 if $this is greater than $y, and 0 if they are equal. - * @see self::equals() - */ - public function compare(GMP $y) - { - $r = gmp_cmp($this->value, $y->value); - if ($r < -1) { - $r = -1; - } - if ($r > 1) { - $r = 1; - } - return $r; - } - - /** - * Tests the equality of two numbers. - * - * If you need to see if one number is greater than or less than another number, use BigInteger::compare() - * - * @param GMP $x - * @return bool - */ - public function equals(GMP $x) - { - return $this->value == $x->value; - } - - /** - * Calculates modular inverses. - * - * Say you have (30 mod 17 * x mod 17) mod 17 == 1. x can be found using modular inverses. - * - * @param GMP $n - * @return false|GMP - */ - public function modInverse(GMP $n) - { - $temp = new self(); - $temp->value = gmp_invert($this->value, $n->value); - - return $temp->value === false ? false : $this->normalize($temp); - } - - /** - * Calculates the greatest common divisor and Bezout's identity. - * - * Say you have 693 and 609. The GCD is 21. Bezout's identity states that there exist integers x and y such that - * 693*x + 609*y == 21. In point of fact, there are actually an infinite number of x and y combinations and which - * combination is returned is dependent upon which mode is in use. See - * {@link http://en.wikipedia.org/wiki/B%C3%A9zout%27s_identity Bezout's identity - Wikipedia} for more information. - * - * @param GMP $n - * @return GMP[] - */ - public function extendedGCD(GMP $n) - { - $extended = gmp_gcdext($this->value, $n->value); - $g = $extended['g']; - $s = $extended['s']; - $t = $extended['t']; - - return [ - 'gcd' => $this->normalize(new self($g)), - 'x' => $this->normalize(new self($s)), - 'y' => $this->normalize(new self($t)) - ]; - } - - /** - * Calculates the greatest common divisor - * - * Say you have 693 and 609. The GCD is 21. - * - * @param GMP $n - * @return GMP - */ - public function gcd(GMP $n) - { - $r = gmp_gcd($this->value, $n->value); - return $this->normalize(new self($r)); - } - - /** - * Absolute value. - * - * @return GMP - */ - public function abs() - { - $temp = new self(); - $temp->value = gmp_abs($this->value); - - return $temp; - } - - /** - * Logical And - * - * @param GMP $x - * @return GMP - */ - public function bitwise_and(GMP $x) - { - $temp = new self(); - $temp->value = $this->value & $x->value; - - return $this->normalize($temp); - } - - /** - * Logical Or - * - * @param GMP $x - * @return GMP - */ - public function bitwise_or(GMP $x) - { - $temp = new self(); - $temp->value = $this->value | $x->value; - - return $this->normalize($temp); - } - - /** - * Logical Exclusive Or - * - * @param GMP $x - * @return GMP - */ - public function bitwise_xor(GMP $x) - { - $temp = new self(); - $temp->value = $this->value ^ $x->value; - - return $this->normalize($temp); - } - - /** - * Logical Right Shift - * - * Shifts BigInteger's by $shift bits, effectively dividing by 2**$shift. - * - * @param int $shift - * @return GMP - */ - public function bitwise_rightShift($shift) - { - // 0xFFFFFFFF >> 2 == -1 (on 32-bit systems) - // gmp_init('0xFFFFFFFF') >> 2 == gmp_init('0x3FFFFFFF') - - $temp = new self(); - $temp->value = $this->value >> $shift; - - return $this->normalize($temp); - } - - /** - * Logical Left Shift - * - * Shifts BigInteger's by $shift bits, effectively multiplying by 2**$shift. - * - * @param int $shift - * @return GMP - */ - public function bitwise_leftShift($shift) - { - $temp = new self(); - $temp->value = $this->value << $shift; - - return $this->normalize($temp); - } - - /** - * Performs modular exponentiation. - * - * @param GMP $e - * @param GMP $n - * @return GMP - */ - public function modPow(GMP $e, GMP $n) - { - return $this->powModOuter($e, $n); - } - - /** - * Performs modular exponentiation. - * - * Alias for modPow(). - * - * @param GMP $e - * @param GMP $n - * @return GMP - */ - public function powMod(GMP $e, GMP $n) - { - return $this->powModOuter($e, $n); - } - - /** - * Performs modular exponentiation. - * - * @param GMP $e - * @param GMP $n - * @return GMP - */ - protected function powModInner(GMP $e, GMP $n) - { - $class = static::$modexpEngine[static::class]; - return $class::powModHelper($this, $e, $n); - } - - /** - * Normalize - * - * Removes leading zeros and truncates (if necessary) to maintain the appropriate precision - * - * @param GMP $result - * @return GMP - */ - protected function normalize(GMP $result) - { - $result->precision = $this->precision; - $result->bitmask = $this->bitmask; - - if ($result->bitmask !== false) { - $flip = $result->value < 0; - if ($flip) { - $result->value = -$result->value; - } - $result->value = $result->value & $result->bitmask->value; - if ($flip) { - $result->value = -$result->value; - } - } - - return $result; - } - - /** - * Performs some post-processing for randomRangePrime - * - * @param Engine $x - * @param Engine $min - * @param Engine $max - * @return GMP - */ - protected static function randomRangePrimeInner(Engine $x, Engine $min, Engine $max) - { - $p = gmp_nextprime($x->value); - - if ($p <= $max->value) { - return new self($p); - } - - if ($min->value != $x->value) { - $x = new self($x->value - 1); - } - - return self::randomRangePrime($min, $x); - } - - /** - * Generate a random prime number between a range - * - * If there's not a prime within the given range, false will be returned. - * - * @param GMP $min - * @param GMP $max - * @return false|GMP - */ - public static function randomRangePrime(GMP $min, GMP $max) - { - return self::randomRangePrimeOuter($min, $max); - } - - /** - * Generate a random number between a range - * - * Returns a random number between $min and $max where $min and $max - * can be defined using one of the two methods: - * - * BigInteger::randomRange($min, $max) - * BigInteger::randomRange($max, $min) - * - * @param GMP $min - * @param GMP $max - * @return GMP - */ - public static function randomRange(GMP $min, GMP $max) - { - return self::randomRangeHelper($min, $max); - } - - /** - * Make the current number odd - * - * If the current number is odd it'll be unchanged. If it's even, one will be added to it. - * - * @see self::randomPrime() - */ - protected function make_odd() - { - gmp_setbit($this->value, 0); - } - - /** - * Tests Primality - * - * @param int $t - * @return bool - */ - protected function testPrimality($t) - { - return gmp_prob_prime($this->value, $t) != 0; - } - - /** - * Calculates the nth root of a biginteger. - * - * Returns the nth root of a positive biginteger, where n defaults to 2 - * - * @param int $n - * @return GMP - */ - protected function rootInner($n) - { - $root = new self(); - $root->value = gmp_root($this->value, $n); - return $this->normalize($root); - } - - /** - * Performs exponentiation. - * - * @param GMP $n - * @return GMP - */ - public function pow(GMP $n) - { - $temp = new self(); - $temp->value = $this->value ** $n->value; - - return $this->normalize($temp); - } - - /** - * Return the minimum BigInteger between an arbitrary number of BigIntegers. - * - * @param GMP ...$nums - * @return GMP - */ - public static function min(GMP ...$nums) - { - return self::minHelper($nums); - } - - /** - * Return the maximum BigInteger between an arbitrary number of BigIntegers. - * - * @param GMP ...$nums - * @return GMP - */ - public static function max(GMP ...$nums) - { - return self::maxHelper($nums); - } - - /** - * Tests BigInteger to see if it is between two integers, inclusive - * - * @param GMP $min - * @param GMP $max - * @return bool - */ - public function between(GMP $min, GMP $max) - { - return $this->compare($min) >= 0 && $this->compare($max) <= 0; - } - - /** - * Create Recurring Modulo Function - * - * Sometimes it may be desirable to do repeated modulos with the same number outside of - * modular exponentiation - * - * @return callable - */ - public function createRecurringModuloFunction() - { - $temp = $this->value; - return function (GMP $x) use ($temp) { - return new GMP($x->value % $temp); - }; - } - - /** - * Scan for 1 and right shift by that amount - * - * ie. $s = gmp_scan1($n, 0) and $r = gmp_div_q($n, gmp_pow(gmp_init('2'), $s)); - * - * @param GMP $r - * @return int - */ - public static function scan1divide(GMP $r) - { - $s = gmp_scan1($r->value, 0); - $r->value >>= $s; - return $s; - } - - /** - * Is Odd? - * - * @return bool - */ - public function isOdd() - { - return gmp_testbit($this->value, 0); - } - - /** - * Tests if a bit is set - * - * @return bool - */ - public function testBit($x) - { - return gmp_testbit($this->value, $x); - } - - /** - * Is Negative? - * - * @return bool - */ - public function isNegative() - { - return gmp_sign($this->value) == -1; - } - - /** - * Negate - * - * Given $k, returns -$k - * - * @return GMP - */ - public function negate() - { - $temp = clone $this; - $temp->value = -$this->value; - - return $temp; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/GMP/DefaultEngine.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/GMP/DefaultEngine.php deleted file mode 100644 index 597cb79..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/GMP/DefaultEngine.php +++ /dev/null @@ -1,40 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\GMP; - -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\GMP; - -/** - * GMP Modular Exponentiation Engine - * - * @author Jim Wigginton - */ -abstract class DefaultEngine extends GMP -{ - /** - * Performs modular exponentiation. - * - * @param GMP $x - * @param GMP $e - * @param GMP $n - * @return GMP - */ - protected static function powModHelper(GMP $x, GMP $e, GMP $n) - { - $temp = new GMP(); - $temp->value = gmp_powm($x->value, $e->value, $n->value); - - return $x->normalize($temp); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/OpenSSL.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/OpenSSL.php deleted file mode 100644 index ccee361..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/OpenSSL.php +++ /dev/null @@ -1,68 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\RSA\Formats\Keys\PKCS8; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; - -/** - * OpenSSL Modular Exponentiation Engine - * - * @author Jim Wigginton - */ -abstract class OpenSSL -{ - /** - * Test for engine validity - * - * @return bool - */ - public static function isValidEngine() - { - return extension_loaded('openssl') && static::class != __CLASS__; - } - - /** - * Performs modular exponentiation. - * - * @param Engine $x - * @param Engine $e - * @param Engine $n - * @return Engine - */ - public static function powModHelper(Engine $x, Engine $e, Engine $n) - { - if ($n->getLengthInBytes() < 31 || $n->getLengthInBytes() > 16384) { - throw new \OutOfRangeException('Only modulo between 31 and 16384 bits are accepted'); - } - - $key = PKCS8::savePublicKey( - new BigInteger($n), - new BigInteger($e) - ); - - $plaintext = str_pad($x->toBytes(), $n->getLengthInBytes(), "\0", STR_PAD_LEFT); - - // this is easily prone to failure. if the modulo is a multiple of 2 or 3 or whatever it - // won't work and you'll get a "failure: error:0906D06C:PEM routines:PEM_read_bio:no start line" - // error. i suppose, for even numbers, we could do what PHP\Montgomery.php does, but then what - // about odd numbers divisible by 3, by 5, etc? - if (!openssl_public_encrypt($plaintext, $result, $key, OPENSSL_NO_PADDING)) { - throw new \UnexpectedValueException(openssl_error_string()); - } - - $class = get_class($x); - return new $class($result, 256); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP.php deleted file mode 100644 index 4007e18..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP.php +++ /dev/null @@ -1,1360 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines; - -use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; -use OCA\Libresign\Vendor\phpseclib3\Exception\BadConfigurationException; - -/** - * Pure-PHP Engine. - * - * @author Jim Wigginton - */ -abstract class PHP extends Engine -{ - /**#@+ - * Array constants - * - * Rather than create a thousands and thousands of new BigInteger objects in repeated function calls to add() and - * multiply() or whatever, we'll just work directly on arrays, taking them in as parameters and returning them. - * - */ - /** - * $result[self::VALUE] contains the value. - */ - const VALUE = 0; - /** - * $result[self::SIGN] contains the sign. - */ - const SIGN = 1; - /**#@-*/ - - /** - * Karatsuba Cutoff - * - * At what point do we switch between Karatsuba multiplication and schoolbook long multiplication? - * - */ - const KARATSUBA_CUTOFF = 25; - - /** - * Can Bitwise operations be done fast? - * - * @see parent::bitwise_leftRotate() - * @see parent::bitwise_rightRotate() - */ - const FAST_BITWISE = true; - - /** - * Engine Directory - * - * @see parent::setModExpEngine - */ - const ENGINE_DIR = 'PHP'; - - /** - * Default constructor - * - * @param mixed $x integer Base-10 number or base-$base number if $base set. - * @param int $base - * @return PHP - * @see parent::__construct() - */ - public function __construct($x = 0, $base = 10) - { - if (!isset(static::$isValidEngine[static::class])) { - static::$isValidEngine[static::class] = static::isValidEngine(); - } - if (!static::$isValidEngine[static::class]) { - throw new BadConfigurationException(static::class . ' is not setup correctly on this system'); - } - - $this->value = []; - parent::__construct($x, $base); - } - - /** - * Initialize a PHP BigInteger Engine instance - * - * @param int $base - * @see parent::__construct() - */ - protected function initialize($base) - { - switch (abs($base)) { - case 16: - $x = (strlen($this->value) & 1) ? '0' . $this->value : $this->value; - $temp = new static(Strings::hex2bin($x), 256); - $this->value = $temp->value; - break; - case 10: - $temp = new static(); - - $multiplier = new static(); - $multiplier->value = [static::MAX10]; - - $x = $this->value; - - if ($x[0] == '-') { - $this->is_negative = true; - $x = substr($x, 1); - } - - $x = str_pad( - $x, - strlen($x) + ((static::MAX10LEN - 1) * strlen($x)) % static::MAX10LEN, - 0, - STR_PAD_LEFT - ); - while (strlen($x)) { - $temp = $temp->multiply($multiplier); - $temp = $temp->add(new static($this->int2bytes(substr($x, 0, static::MAX10LEN)), 256)); - $x = substr($x, static::MAX10LEN); - } - - $this->value = $temp->value; - } - } - - /** - * Pads strings so that unpack may be used on them - * - * @param string $str - * @return string - */ - protected function pad($str) - { - $length = strlen($str); - - $pad = 4 - (strlen($str) % 4); - - return str_pad($str, $length + $pad, "\0", STR_PAD_LEFT); - } - - /** - * Converts a BigInteger to a base-10 number. - * - * @return string - */ - public function toString() - { - if (!count($this->value)) { - return '0'; - } - - $temp = clone $this; - $temp->bitmask = false; - $temp->is_negative = false; - - $divisor = new static(); - $divisor->value = [static::MAX10]; - $result = ''; - while (count($temp->value)) { - list($temp, $mod) = $temp->divide($divisor); - $result = str_pad( - isset($mod->value[0]) ? $mod->value[0] : '', - static::MAX10LEN, - '0', - STR_PAD_LEFT - ) . $result; - } - $result = ltrim($result, '0'); - if (empty($result)) { - $result = '0'; - } - - if ($this->is_negative) { - $result = '-' . $result; - } - - return $result; - } - - /** - * Converts a BigInteger to a byte string (eg. base-256). - * - * @param bool $twos_compliment - * @return string - */ - public function toBytes($twos_compliment = false) - { - if ($twos_compliment) { - return $this->toBytesHelper(); - } - - if (!count($this->value)) { - return $this->precision > 0 ? str_repeat(chr(0), ($this->precision + 1) >> 3) : ''; - } - - $result = $this->bitwise_small_split(8); - $result = implode('', array_map('chr', $result)); - - return $this->precision > 0 ? - str_pad( - substr($result, -(($this->precision + 7) >> 3)), - ($this->precision + 7) >> 3, - chr(0), - STR_PAD_LEFT - ) : - $result; - } - - /** - * Performs addition. - * - * @param array $x_value - * @param bool $x_negative - * @param array $y_value - * @param bool $y_negative - * @return array - */ - protected static function addHelper(array $x_value, $x_negative, array $y_value, $y_negative) - { - $x_size = count($x_value); - $y_size = count($y_value); - - if ($x_size == 0) { - return [ - self::VALUE => $y_value, - self::SIGN => $y_negative - ]; - } elseif ($y_size == 0) { - return [ - self::VALUE => $x_value, - self::SIGN => $x_negative - ]; - } - - // subtract, if appropriate - if ($x_negative != $y_negative) { - if ($x_value == $y_value) { - return [ - self::VALUE => [], - self::SIGN => false - ]; - } - - $temp = self::subtractHelper($x_value, false, $y_value, false); - $temp[self::SIGN] = self::compareHelper($x_value, false, $y_value, false) > 0 ? - $x_negative : $y_negative; - - return $temp; - } - - if ($x_size < $y_size) { - $size = $x_size; - $value = $y_value; - } else { - $size = $y_size; - $value = $x_value; - } - - $value[count($value)] = 0; // just in case the carry adds an extra digit - - $carry = 0; - for ($i = 0, $j = 1; $j < $size; $i += 2, $j += 2) { - //$sum = $x_value[$j] * static::BASE_FULL + $x_value[$i] + $y_value[$j] * static::BASE_FULL + $y_value[$i] + $carry; - $sum = ($x_value[$j] + $y_value[$j]) * static::BASE_FULL + $x_value[$i] + $y_value[$i] + $carry; - $carry = $sum >= static::MAX_DIGIT2; // eg. floor($sum / 2**52); only possible values (in any base) are 0 and 1 - $sum = $carry ? $sum - static::MAX_DIGIT2 : $sum; - - $temp = static::BASE === 26 ? intval($sum / 0x4000000) : ($sum >> 31); - - $value[$i] = (int)($sum - static::BASE_FULL * $temp); // eg. a faster alternative to fmod($sum, 0x4000000) - $value[$j] = $temp; - } - - if ($j == $size) { // ie. if $y_size is odd - $sum = $x_value[$i] + $y_value[$i] + $carry; - $carry = $sum >= static::BASE_FULL; - $value[$i] = $carry ? $sum - static::BASE_FULL : $sum; - ++$i; // ie. let $i = $j since we've just done $value[$i] - } - - if ($carry) { - for (; $value[$i] == static::MAX_DIGIT; ++$i) { - $value[$i] = 0; - } - ++$value[$i]; - } - - return [ - self::VALUE => self::trim($value), - self::SIGN => $x_negative - ]; - } - - /** - * Performs subtraction. - * - * @param array $x_value - * @param bool $x_negative - * @param array $y_value - * @param bool $y_negative - * @return array - */ - public static function subtractHelper(array $x_value, $x_negative, array $y_value, $y_negative) - { - $x_size = count($x_value); - $y_size = count($y_value); - - if ($x_size == 0) { - return [ - self::VALUE => $y_value, - self::SIGN => !$y_negative - ]; - } elseif ($y_size == 0) { - return [ - self::VALUE => $x_value, - self::SIGN => $x_negative - ]; - } - - // add, if appropriate (ie. -$x - +$y or +$x - -$y) - if ($x_negative != $y_negative) { - $temp = self::addHelper($x_value, false, $y_value, false); - $temp[self::SIGN] = $x_negative; - - return $temp; - } - - $diff = self::compareHelper($x_value, $x_negative, $y_value, $y_negative); - - if (!$diff) { - return [ - self::VALUE => [], - self::SIGN => false - ]; - } - - // switch $x and $y around, if appropriate. - if ((!$x_negative && $diff < 0) || ($x_negative && $diff > 0)) { - $temp = $x_value; - $x_value = $y_value; - $y_value = $temp; - - $x_negative = !$x_negative; - - $x_size = count($x_value); - $y_size = count($y_value); - } - - // at this point, $x_value should be at least as big as - if not bigger than - $y_value - - $carry = 0; - for ($i = 0, $j = 1; $j < $y_size; $i += 2, $j += 2) { - $sum = ($x_value[$j] - $y_value[$j]) * static::BASE_FULL + $x_value[$i] - $y_value[$i] - $carry; - - $carry = $sum < 0; // eg. floor($sum / 2**52); only possible values (in any base) are 0 and 1 - $sum = $carry ? $sum + static::MAX_DIGIT2 : $sum; - - $temp = static::BASE === 26 ? intval($sum / 0x4000000) : ($sum >> 31); - - $x_value[$i] = (int)($sum - static::BASE_FULL * $temp); - $x_value[$j] = $temp; - } - - if ($j == $y_size) { // ie. if $y_size is odd - $sum = $x_value[$i] - $y_value[$i] - $carry; - $carry = $sum < 0; - $x_value[$i] = $carry ? $sum + static::BASE_FULL : $sum; - ++$i; - } - - if ($carry) { - for (; !$x_value[$i]; ++$i) { - $x_value[$i] = static::MAX_DIGIT; - } - --$x_value[$i]; - } - - return [ - self::VALUE => self::trim($x_value), - self::SIGN => $x_negative - ]; - } - - /** - * Performs multiplication. - * - * @param array $x_value - * @param bool $x_negative - * @param array $y_value - * @param bool $y_negative - * @return array - */ - protected static function multiplyHelper(array $x_value, $x_negative, array $y_value, $y_negative) - { - //if ( $x_value == $y_value ) { - // return [ - // self::VALUE => self::square($x_value), - // self::SIGN => $x_sign != $y_value - // ]; - //} - - $x_length = count($x_value); - $y_length = count($y_value); - - if (!$x_length || !$y_length) { // a 0 is being multiplied - return [ - self::VALUE => [], - self::SIGN => false - ]; - } - - return [ - self::VALUE => min($x_length, $y_length) < 2 * self::KARATSUBA_CUTOFF ? - self::trim(self::regularMultiply($x_value, $y_value)) : - self::trim(self::karatsuba($x_value, $y_value)), - self::SIGN => $x_negative != $y_negative - ]; - } - - /** - * Performs Karatsuba multiplication on two BigIntegers - * - * See {@link http://en.wikipedia.org/wiki/Karatsuba_algorithm Karatsuba algorithm} and - * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=120 MPM 5.2.3}. - * - * @param array $x_value - * @param array $y_value - * @return array - */ - private static function karatsuba(array $x_value, array $y_value) - { - $m = min(count($x_value) >> 1, count($y_value) >> 1); - - if ($m < self::KARATSUBA_CUTOFF) { - return self::regularMultiply($x_value, $y_value); - } - - $x1 = array_slice($x_value, $m); - $x0 = array_slice($x_value, 0, $m); - $y1 = array_slice($y_value, $m); - $y0 = array_slice($y_value, 0, $m); - - $z2 = self::karatsuba($x1, $y1); - $z0 = self::karatsuba($x0, $y0); - - $z1 = self::addHelper($x1, false, $x0, false); - $temp = self::addHelper($y1, false, $y0, false); - $z1 = self::karatsuba($z1[self::VALUE], $temp[self::VALUE]); - $temp = self::addHelper($z2, false, $z0, false); - $z1 = self::subtractHelper($z1, false, $temp[self::VALUE], false); - - $z2 = array_merge(array_fill(0, 2 * $m, 0), $z2); - $z1[self::VALUE] = array_merge(array_fill(0, $m, 0), $z1[self::VALUE]); - - $xy = self::addHelper($z2, false, $z1[self::VALUE], $z1[self::SIGN]); - $xy = self::addHelper($xy[self::VALUE], $xy[self::SIGN], $z0, false); - - return $xy[self::VALUE]; - } - - /** - * Performs long multiplication on two BigIntegers - * - * Modeled after 'multiply' in MutableBigInteger.java. - * - * @param array $x_value - * @param array $y_value - * @return array - */ - protected static function regularMultiply(array $x_value, array $y_value) - { - $x_length = count($x_value); - $y_length = count($y_value); - - if (!$x_length || !$y_length) { // a 0 is being multiplied - return []; - } - - $product_value = self::array_repeat(0, $x_length + $y_length); - - // the following for loop could be removed if the for loop following it - // (the one with nested for loops) initially set $i to 0, but - // doing so would also make the result in one set of unnecessary adds, - // since on the outermost loops first pass, $product->value[$k] is going - // to always be 0 - - $carry = 0; - for ($j = 0; $j < $x_length; ++$j) { // ie. $i = 0 - $temp = $x_value[$j] * $y_value[0] + $carry; // $product_value[$k] == 0 - $carry = static::BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); - $product_value[$j] = (int)($temp - static::BASE_FULL * $carry); - } - - $product_value[$j] = $carry; - - // the above for loop is what the previous comment was talking about. the - // following for loop is the "one with nested for loops" - for ($i = 1; $i < $y_length; ++$i) { - $carry = 0; - - for ($j = 0, $k = $i; $j < $x_length; ++$j, ++$k) { - $temp = $product_value[$k] + $x_value[$j] * $y_value[$i] + $carry; - $carry = static::BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); - $product_value[$k] = (int)($temp - static::BASE_FULL * $carry); - } - - $product_value[$k] = $carry; - } - - return $product_value; - } - - /** - * Divides two BigIntegers. - * - * Returns an array whose first element contains the quotient and whose second element contains the - * "common residue". If the remainder would be positive, the "common residue" and the remainder are the - * same. If the remainder would be negative, the "common residue" is equal to the sum of the remainder - * and the divisor (basically, the "common residue" is the first positive modulo). - * - * @return array{static, static} - * @internal This function is based off of - * {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=9 HAC 14.20}. - */ - protected function divideHelper(PHP $y) - { - if (count($y->value) == 1) { - list($q, $r) = $this->divide_digit($this->value, $y->value[0]); - $quotient = new static(); - $remainder = new static(); - $quotient->value = $q; - if ($this->is_negative) { - $r = $y->value[0] - $r; - } - $remainder->value = [$r]; - $quotient->is_negative = $this->is_negative != $y->is_negative; - return [$this->normalize($quotient), $this->normalize($remainder)]; - } - - $x = clone $this; - $y = clone $y; - - $x_sign = $x->is_negative; - $y_sign = $y->is_negative; - - $x->is_negative = $y->is_negative = false; - - $diff = $x->compare($y); - - if (!$diff) { - $temp = new static(); - $temp->value = [1]; - $temp->is_negative = $x_sign != $y_sign; - return [$this->normalize($temp), $this->normalize(static::$zero[static::class])]; - } - - if ($diff < 0) { - // if $x is negative, "add" $y. - if ($x_sign) { - $x = $y->subtract($x); - } - return [$this->normalize(static::$zero[static::class]), $this->normalize($x)]; - } - - // normalize $x and $y as described in HAC 14.23 / 14.24 - $msb = $y->value[count($y->value) - 1]; - for ($shift = 0; !($msb & static::MSB); ++$shift) { - $msb <<= 1; - } - $x->lshift($shift); - $y->lshift($shift); - $y_value = &$y->value; - - $x_max = count($x->value) - 1; - $y_max = count($y->value) - 1; - - $quotient = new static(); - $quotient_value = &$quotient->value; - $quotient_value = self::array_repeat(0, $x_max - $y_max + 1); - - static $temp, $lhs, $rhs; - if (!isset($temp)) { - $temp = new static(); - $lhs = new static(); - $rhs = new static(); - } - if (static::class != get_class($temp)) { - $temp = new static(); - $lhs = new static(); - $rhs = new static(); - } - $temp_value = &$temp->value; - $rhs_value = &$rhs->value; - - // $temp = $y << ($x_max - $y_max-1) in base 2**26 - $temp_value = array_merge(self::array_repeat(0, $x_max - $y_max), $y_value); - - while ($x->compare($temp) >= 0) { - // calculate the "common residue" - ++$quotient_value[$x_max - $y_max]; - $x = $x->subtract($temp); - $x_max = count($x->value) - 1; - } - - for ($i = $x_max; $i >= $y_max + 1; --$i) { - $x_value = &$x->value; - $x_window = [ - isset($x_value[$i]) ? $x_value[$i] : 0, - isset($x_value[$i - 1]) ? $x_value[$i - 1] : 0, - isset($x_value[$i - 2]) ? $x_value[$i - 2] : 0 - ]; - $y_window = [ - $y_value[$y_max], - ($y_max > 0) ? $y_value[$y_max - 1] : 0 - ]; - - $q_index = $i - $y_max - 1; - if ($x_window[0] == $y_window[0]) { - $quotient_value[$q_index] = static::MAX_DIGIT; - } else { - $quotient_value[$q_index] = self::safe_divide( - $x_window[0] * static::BASE_FULL + $x_window[1], - $y_window[0] - ); - } - - $temp_value = [$y_window[1], $y_window[0]]; - - $lhs->value = [$quotient_value[$q_index]]; - $lhs = $lhs->multiply($temp); - - $rhs_value = [$x_window[2], $x_window[1], $x_window[0]]; - - while ($lhs->compare($rhs) > 0) { - --$quotient_value[$q_index]; - - $lhs->value = [$quotient_value[$q_index]]; - $lhs = $lhs->multiply($temp); - } - - $adjust = self::array_repeat(0, $q_index); - $temp_value = [$quotient_value[$q_index]]; - $temp = $temp->multiply($y); - $temp_value = &$temp->value; - if (count($temp_value)) { - $temp_value = array_merge($adjust, $temp_value); - } - - $x = $x->subtract($temp); - - if ($x->compare(static::$zero[static::class]) < 0) { - $temp_value = array_merge($adjust, $y_value); - $x = $x->add($temp); - - --$quotient_value[$q_index]; - } - - $x_max = count($x_value) - 1; - } - - // unnormalize the remainder - $x->rshift($shift); - - $quotient->is_negative = $x_sign != $y_sign; - - // calculate the "common residue", if appropriate - if ($x_sign) { - $y->rshift($shift); - $x = $y->subtract($x); - } - - return [$this->normalize($quotient), $this->normalize($x)]; - } - - /** - * Divides a BigInteger by a regular integer - * - * abc / x = a00 / x + b0 / x + c / x - * - * @param array $dividend - * @param int $divisor - * @return array - */ - private static function divide_digit(array $dividend, $divisor) - { - $carry = 0; - $result = []; - - for ($i = count($dividend) - 1; $i >= 0; --$i) { - $temp = static::BASE_FULL * $carry + $dividend[$i]; - $result[$i] = self::safe_divide($temp, $divisor); - $carry = (int)($temp - $divisor * $result[$i]); - } - - return [$result, $carry]; - } - - /** - * Single digit division - * - * Even if int64 is being used the division operator will return a float64 value - * if the dividend is not evenly divisible by the divisor. Since a float64 doesn't - * have the precision of int64 this is a problem so, when int64 is being used, - * we'll guarantee that the dividend is divisible by first subtracting the remainder. - * - * @param int $x - * @param int $y - * @return int - */ - private static function safe_divide($x, $y) - { - if (static::BASE === 26) { - return (int)($x / $y); - } - - // static::BASE === 31 - /** @var int */ - return ($x - ($x % $y)) / $y; - } - - /** - * Convert an array / boolean to a PHP BigInteger object - * - * @param array $arr - * @return static - */ - protected function convertToObj(array $arr) - { - $result = new static(); - $result->value = $arr[self::VALUE]; - $result->is_negative = $arr[self::SIGN]; - - return $this->normalize($result); - } - - /** - * Normalize - * - * Removes leading zeros and truncates (if necessary) to maintain the appropriate precision - * - * @param PHP $result - * @return static - */ - protected function normalize(PHP $result) - { - $result->precision = $this->precision; - $result->bitmask = $this->bitmask; - - $value = &$result->value; - - if (!count($value)) { - $result->is_negative = false; - return $result; - } - - $value = static::trim($value); - - if (!empty($result->bitmask->value)) { - $length = min(count($value), count($result->bitmask->value)); - $value = array_slice($value, 0, $length); - - for ($i = 0; $i < $length; ++$i) { - $value[$i] = $value[$i] & $result->bitmask->value[$i]; - } - - $value = static::trim($value); - } - - return $result; - } - - /** - * Compares two numbers. - * - * @param array $x_value - * @param bool $x_negative - * @param array $y_value - * @param bool $y_negative - * @return int - * @see static::compare() - */ - protected static function compareHelper(array $x_value, $x_negative, array $y_value, $y_negative) - { - if ($x_negative != $y_negative) { - return (!$x_negative && $y_negative) ? 1 : -1; - } - - $result = $x_negative ? -1 : 1; - - if (count($x_value) != count($y_value)) { - return (count($x_value) > count($y_value)) ? $result : -$result; - } - $size = max(count($x_value), count($y_value)); - - $x_value = array_pad($x_value, $size, 0); - $y_value = array_pad($y_value, $size, 0); - - for ($i = count($x_value) - 1; $i >= 0; --$i) { - if ($x_value[$i] != $y_value[$i]) { - return ($x_value[$i] > $y_value[$i]) ? $result : -$result; - } - } - - return 0; - } - - /** - * Absolute value. - * - * @return PHP - */ - public function abs() - { - $temp = new static(); - $temp->value = $this->value; - - return $temp; - } - - /** - * Trim - * - * Removes leading zeros - * - * @param list $value - * @return list - */ - protected static function trim(array $value) - { - for ($i = count($value) - 1; $i >= 0; --$i) { - if ($value[$i]) { - break; - } - unset($value[$i]); - } - - return $value; - } - - /** - * Logical Right Shift - * - * Shifts BigInteger's by $shift bits, effectively dividing by 2**$shift. - * - * @param int $shift - * @return PHP - */ - public function bitwise_rightShift($shift) - { - $temp = new static(); - - // could just replace lshift with this, but then all lshift() calls would need to be rewritten - // and I don't want to do that... - $temp->value = $this->value; - $temp->rshift($shift); - - return $this->normalize($temp); - } - - /** - * Logical Left Shift - * - * Shifts BigInteger's by $shift bits, effectively multiplying by 2**$shift. - * - * @param int $shift - * @return PHP - */ - public function bitwise_leftShift($shift) - { - $temp = new static(); - // could just replace _rshift with this, but then all _lshift() calls would need to be rewritten - // and I don't want to do that... - $temp->value = $this->value; - $temp->lshift($shift); - - return $this->normalize($temp); - } - - /** - * Converts 32-bit integers to bytes. - * - * @param int $x - * @return string - */ - private static function int2bytes($x) - { - return ltrim(pack('N', $x), chr(0)); - } - - /** - * Array Repeat - * - * @param int $input - * @param int $multiplier - * @return array - */ - protected static function array_repeat($input, $multiplier) - { - return $multiplier ? array_fill(0, $multiplier, $input) : []; - } - - /** - * Logical Left Shift - * - * Shifts BigInteger's by $shift bits. - * - * @param int $shift - */ - protected function lshift($shift) - { - if ($shift == 0) { - return; - } - - $num_digits = (int)($shift / static::BASE); - $shift %= static::BASE; - $shift = 1 << $shift; - - $carry = 0; - - for ($i = 0; $i < count($this->value); ++$i) { - $temp = $this->value[$i] * $shift + $carry; - $carry = static::BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); - $this->value[$i] = (int)($temp - $carry * static::BASE_FULL); - } - - if ($carry) { - $this->value[count($this->value)] = $carry; - } - - while ($num_digits--) { - array_unshift($this->value, 0); - } - } - - /** - * Logical Right Shift - * - * Shifts BigInteger's by $shift bits. - * - * @param int $shift - */ - protected function rshift($shift) - { - if ($shift == 0) { - return; - } - - $num_digits = (int)($shift / static::BASE); - $shift %= static::BASE; - $carry_shift = static::BASE - $shift; - $carry_mask = (1 << $shift) - 1; - - if ($num_digits) { - $this->value = array_slice($this->value, $num_digits); - } - - $carry = 0; - - for ($i = count($this->value) - 1; $i >= 0; --$i) { - $temp = $this->value[$i] >> $shift | $carry; - $carry = ($this->value[$i] & $carry_mask) << $carry_shift; - $this->value[$i] = $temp; - } - - $this->value = static::trim($this->value); - } - - /** - * Performs modular exponentiation. - * - * @param PHP $e - * @param PHP $n - * @return PHP - */ - protected function powModInner(PHP $e, PHP $n) - { - try { - $class = static::$modexpEngine[static::class]; - return $class::powModHelper($this, $e, $n, static::class); - } catch (\Exception $err) { - return PHP\DefaultEngine::powModHelper($this, $e, $n, static::class); - } - } - - /** - * Performs squaring - * - * @param list $x - * @return list - */ - protected static function square(array $x) - { - return count($x) < 2 * self::KARATSUBA_CUTOFF ? - self::trim(self::baseSquare($x)) : - self::trim(self::karatsubaSquare($x)); - } - - /** - * Performs traditional squaring on two BigIntegers - * - * Squaring can be done faster than multiplying a number by itself can be. See - * {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=7 HAC 14.2.4} / - * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=141 MPM 5.3} for more information. - * - * @param array $value - * @return array - */ - protected static function baseSquare(array $value) - { - if (empty($value)) { - return []; - } - $square_value = self::array_repeat(0, 2 * count($value)); - - for ($i = 0, $max_index = count($value) - 1; $i <= $max_index; ++$i) { - $i2 = $i << 1; - - $temp = $square_value[$i2] + $value[$i] * $value[$i]; - $carry = static::BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); - $square_value[$i2] = (int)($temp - static::BASE_FULL * $carry); - - // note how we start from $i+1 instead of 0 as we do in multiplication. - for ($j = $i + 1, $k = $i2 + 1; $j <= $max_index; ++$j, ++$k) { - $temp = $square_value[$k] + 2 * $value[$j] * $value[$i] + $carry; - $carry = static::BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); - $square_value[$k] = (int)($temp - static::BASE_FULL * $carry); - } - - // the following line can yield values larger 2**15. at this point, PHP should switch - // over to floats. - $square_value[$i + $max_index + 1] = $carry; - } - - return $square_value; - } - - /** - * Performs Karatsuba "squaring" on two BigIntegers - * - * See {@link http://en.wikipedia.org/wiki/Karatsuba_algorithm Karatsuba algorithm} and - * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=151 MPM 5.3.4}. - * - * @param array $value - * @return array - */ - protected static function karatsubaSquare(array $value) - { - $m = count($value) >> 1; - - if ($m < self::KARATSUBA_CUTOFF) { - return self::baseSquare($value); - } - - $x1 = array_slice($value, $m); - $x0 = array_slice($value, 0, $m); - - $z2 = self::karatsubaSquare($x1); - $z0 = self::karatsubaSquare($x0); - - $z1 = self::addHelper($x1, false, $x0, false); - $z1 = self::karatsubaSquare($z1[self::VALUE]); - $temp = self::addHelper($z2, false, $z0, false); - $z1 = self::subtractHelper($z1, false, $temp[self::VALUE], false); - - $z2 = array_merge(array_fill(0, 2 * $m, 0), $z2); - $z1[self::VALUE] = array_merge(array_fill(0, $m, 0), $z1[self::VALUE]); - - $xx = self::addHelper($z2, false, $z1[self::VALUE], $z1[self::SIGN]); - $xx = self::addHelper($xx[self::VALUE], $xx[self::SIGN], $z0, false); - - return $xx[self::VALUE]; - } - - /** - * Make the current number odd - * - * If the current number is odd it'll be unchanged. If it's even, one will be added to it. - * - * @see self::randomPrime() - */ - protected function make_odd() - { - $this->value[0] |= 1; - } - - /** - * Test the number against small primes. - * - * @see self::isPrime() - */ - protected function testSmallPrimes() - { - if ($this->value == [1]) { - return false; - } - if ($this->value == [2]) { - return true; - } - if (~$this->value[0] & 1) { - return false; - } - - $value = $this->value; - foreach (static::PRIMES as $prime) { - list(, $r) = self::divide_digit($value, $prime); - if (!$r) { - return count($value) == 1 && $value[0] == $prime; - } - } - - return true; - } - - /** - * Scan for 1 and right shift by that amount - * - * ie. $s = gmp_scan1($n, 0) and $r = gmp_div_q($n, gmp_pow(gmp_init('2'), $s)); - * - * @param PHP $r - * @return int - * @see self::isPrime() - */ - public static function scan1divide(PHP $r) - { - $r_value = &$r->value; - for ($i = 0, $r_length = count($r_value); $i < $r_length; ++$i) { - $temp = ~$r_value[$i] & static::MAX_DIGIT; - for ($j = 1; ($temp >> $j) & 1; ++$j) { - } - if ($j <= static::BASE) { - break; - } - } - $s = static::BASE * $i + $j; - $r->rshift($s); - return $s; - } - - /** - * Performs exponentiation. - * - * @param PHP $n - * @return PHP - */ - protected function powHelper(PHP $n) - { - if ($n->compare(static::$zero[static::class]) == 0) { - return new static(1); - } // n^0 = 1 - - $temp = clone $this; - while (!$n->equals(static::$one[static::class])) { - $temp = $temp->multiply($this); - $n = $n->subtract(static::$one[static::class]); - } - - return $temp; - } - - /** - * Is Odd? - * - * @return bool - */ - public function isOdd() - { - return (bool)($this->value[0] & 1); - } - - /** - * Tests if a bit is set - * - * @return bool - */ - public function testBit($x) - { - $digit = (int) floor($x / static::BASE); - $bit = $x % static::BASE; - - if (!isset($this->value[$digit])) { - return false; - } - - return (bool)($this->value[$digit] & (1 << $bit)); - } - - /** - * Is Negative? - * - * @return bool - */ - public function isNegative() - { - return $this->is_negative; - } - - /** - * Negate - * - * Given $k, returns -$k - * - * @return static - */ - public function negate() - { - $temp = clone $this; - $temp->is_negative = !$temp->is_negative; - - return $temp; - } - - /** - * Bitwise Split - * - * Splits BigInteger's into chunks of $split bits - * - * @param int $split - * @return list - */ - public function bitwise_split($split) - { - if ($split < 1) { - throw new \RuntimeException('Offset must be greater than 1'); - } - - $width = (int)($split / static::BASE); - if (!$width) { - $arr = $this->bitwise_small_split($split); - return array_map(function ($digit) { - $temp = new static(); - $temp->value = $digit != 0 ? [$digit] : []; - return $temp; - }, $arr); - } - - $vals = []; - $val = $this->value; - - $i = $overflow = 0; - $len = count($val); - while ($i < $len) { - $digit = []; - if (!$overflow) { - $digit = array_slice($val, $i, $width); - $i += $width; - $overflow = $split % static::BASE; - if ($overflow) { - $mask = (1 << $overflow) - 1; - $temp = isset($val[$i]) ? $val[$i] : 0; - $digit[] = $temp & $mask; - } - } else { - $remaining = static::BASE - $overflow; - $tempsplit = $split - $remaining; - $tempwidth = (int)($tempsplit / static::BASE + 1); - $digit = array_slice($val, $i, $tempwidth); - $i += $tempwidth; - $tempoverflow = $tempsplit % static::BASE; - if ($tempoverflow) { - $tempmask = (1 << $tempoverflow) - 1; - $temp = isset($val[$i]) ? $val[$i] : 0; - $digit[] = $temp & $tempmask; - } - $newbits = 0; - for ($j = count($digit) - 1; $j >= 0; $j--) { - $temp = $digit[$j] & $mask; - $digit[$j] = ($digit[$j] >> $overflow) | ($newbits << $remaining); - $newbits = $temp; - } - $overflow = $tempoverflow; - $mask = $tempmask; - } - $temp = new static(); - $temp->value = static::trim($digit); - $vals[] = $temp; - } - - return array_reverse($vals); - } - - /** - * Bitwise Split where $split < static::BASE - * - * @param int $split - * @return list - */ - private function bitwise_small_split($split) - { - $vals = []; - $val = $this->value; - - $mask = (1 << $split) - 1; - - $i = $overflow = 0; - $len = count($val); - $val[] = 0; - $remaining = static::BASE; - while ($i != $len) { - $digit = $val[$i] & $mask; - $val[$i] >>= $split; - if (!$overflow) { - $remaining -= $split; - $overflow = $split <= $remaining ? 0 : $split - $remaining; - - if (!$remaining) { - $i++; - $remaining = static::BASE; - $overflow = 0; - } - } elseif (++$i != $len) { - $tempmask = (1 << $overflow) - 1; - $digit |= ($val[$i] & $tempmask) << $remaining; - $val[$i] >>= $overflow; - $remaining = static::BASE - $overflow; - $overflow = $split <= $remaining ? 0 : $split - $remaining; - } - - $vals[] = $digit; - } - - while ($vals[count($vals) - 1] == 0) { - unset($vals[count($vals) - 1]); - } - - return array_reverse($vals); - } - - /** - * @return bool - */ - protected static function testJITOnWindows() - { - // see https://github.com/php/php-src/issues/11917 - if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN' && function_exists('opcache_get_status') && PHP_VERSION_ID < 80213 && !defined('PHPSECLIB_ALLOW_JIT')) { - $status = opcache_get_status(); - if ($status && isset($status['jit']) && $status['jit']['enabled'] && $status['jit']['on']) { - return true; - } - } - return false; - } - - /** - * Return the size of a BigInteger in bits - * - * @return int - */ - public function getLength() - { - $max = count($this->value) - 1; - return $max != -1 ? - $max * static::BASE + intval(ceil(log($this->value[$max] + 1, 2))) : - 0; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Base.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Base.php deleted file mode 100644 index ffc7e45..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Base.php +++ /dev/null @@ -1,143 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\PHP; - -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\PHP; - -/** - * PHP Modular Exponentiation Engine - * - * @author Jim Wigginton - */ -abstract class Base extends PHP -{ - /** - * Cache constants - * - * $cache[self::VARIABLE] tells us whether or not the cached data is still valid. - * - */ - const VARIABLE = 0; - /** - * $cache[self::DATA] contains the cached data. - * - */ - const DATA = 1; - - /** - * Test for engine validity - * - * @return bool - */ - public static function isValidEngine() - { - return static::class != __CLASS__; - } - - /** - * Performs modular exponentiation. - * - * The most naive approach to modular exponentiation has very unreasonable requirements, and - * and although the approach involving repeated squaring does vastly better, it, too, is impractical - * for our purposes. The reason being that division - by far the most complicated and time-consuming - * of the basic operations (eg. +,-,*,/) - occurs multiple times within it. - * - * Modular reductions resolve this issue. Although an individual modular reduction takes more time - * then an individual division, when performed in succession (with the same modulo), they're a lot faster. - * - * The two most commonly used modular reductions are Barrett and Montgomery reduction. Montgomery reduction, - * although faster, only works when the gcd of the modulo and of the base being used is 1. In RSA, when the - * base is a power of two, the modulo - a product of two primes - is always going to have a gcd of 1 (because - * the product of two odd numbers is odd), but what about when RSA isn't used? - * - * In contrast, Barrett reduction has no such constraint. As such, some bigint implementations perform a - * Barrett reduction after every operation in the modpow function. Others perform Barrett reductions when the - * modulo is even and Montgomery reductions when the modulo is odd. BigInteger.java's modPow method, however, - * uses a trick involving the Chinese Remainder Theorem to factor the even modulo into two numbers - one odd and - * the other, a power of two - and recombine them, later. This is the method that this modPow function uses. - * {@link http://islab.oregonstate.edu/papers/j34monex.pdf Montgomery Reduction with Even Modulus} elaborates. - * - * @param PHP $x - * @param PHP $e - * @param PHP $n - * @param string $class - * @return PHP - */ - protected static function powModHelper(PHP $x, PHP $e, PHP $n, $class) - { - if (empty($e->value)) { - $temp = new $class(); - $temp->value = [1]; - return $x->normalize($temp); - } - - if ($e->value == [1]) { - list(, $temp) = $x->divide($n); - return $x->normalize($temp); - } - - if ($e->value == [2]) { - $temp = new $class(); - $temp->value = $class::square($x->value); - list(, $temp) = $temp->divide($n); - return $x->normalize($temp); - } - - return $x->normalize(static::slidingWindow($x, $e, $n, $class)); - } - - /** - * Modular reduction preparation - * - * @param array $x - * @param array $n - * @param string $class - * @see self::slidingWindow() - * @return array - */ - protected static function prepareReduce(array $x, array $n, $class) - { - return static::reduce($x, $n, $class); - } - - /** - * Modular multiply - * - * @param array $x - * @param array $y - * @param array $n - * @param string $class - * @see self::slidingWindow() - * @return array - */ - protected static function multiplyReduce(array $x, array $y, array $n, $class) - { - $temp = $class::multiplyHelper($x, false, $y, false); - return static::reduce($temp[self::VALUE], $n, $class); - } - - /** - * Modular square - * - * @param array $x - * @param array $n - * @param string $class - * @see self::slidingWindow() - * @return array - */ - protected static function squareReduce(array $x, array $n, $class) - { - return static::reduce($class::square($x), $n, $class); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/DefaultEngine.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/DefaultEngine.php deleted file mode 100644 index c0c7f29..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/DefaultEngine.php +++ /dev/null @@ -1,25 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\PHP; - -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\PHP\Reductions\EvalBarrett; - -/** - * PHP Default Modular Exponentiation Engine - * - * @author Jim Wigginton - */ -abstract class DefaultEngine extends EvalBarrett -{ -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Montgomery.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Montgomery.php deleted file mode 100644 index b352f58..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Montgomery.php +++ /dev/null @@ -1,89 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\PHP; - -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\Engine; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\PHP; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\PHP\Reductions\PowerOfTwo; - -/** - * PHP Montgomery Modular Exponentiation Engine - * - * @author Jim Wigginton - */ -abstract class Montgomery extends Base -{ - /** - * Test for engine validity - * - * @return bool - */ - public static function isValidEngine() - { - return static::class != __CLASS__; - } - - /** - * Performs modular exponentiation. - * - * @template T of Engine - * @param Engine $x - * @param Engine $e - * @param Engine $n - * @param class-string $class - * @return T - */ - protected static function slidingWindow(Engine $x, Engine $e, Engine $n, $class) - { - // is the modulo odd? - if ($n->value[0] & 1) { - return parent::slidingWindow($x, $e, $n, $class); - } - // if it's not, it's even - - // find the lowest set bit (eg. the max pow of 2 that divides $n) - for ($i = 0; $i < count($n->value); ++$i) { - if ($n->value[$i]) { - $temp = decbin($n->value[$i]); - $j = strlen($temp) - strrpos($temp, '1') - 1; - $j += $class::BASE * $i; - break; - } - } - // at this point, 2^$j * $n/(2^$j) == $n - - $mod1 = clone $n; - $mod1->rshift($j); - $mod2 = new $class(); - $mod2->value = [1]; - $mod2->lshift($j); - - $part1 = $mod1->value != [1] ? parent::slidingWindow($x, $e, $mod1, $class) : new $class(); - $part2 = PowerOfTwo::slidingWindow($x, $e, $mod2, $class); - - $y1 = $mod2->modInverse($mod1); - $y2 = $mod1->modInverse($mod2); - - $result = $part1->multiply($mod2); - $result = $result->multiply($y1); - - $temp = $part2->multiply($mod1); - $temp = $temp->multiply($y2); - - $result = $result->add($temp); - list(, $result) = $result->divide($n); - - return $result; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/OpenSSL.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/OpenSSL.php deleted file mode 100644 index 1a0d6db..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/OpenSSL.php +++ /dev/null @@ -1,25 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\PHP; - -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\OpenSSL as Progenitor; - -/** - * OpenSSL Modular Exponentiation Engine - * - * @author Jim Wigginton - */ -abstract class OpenSSL extends Progenitor -{ -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Barrett.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Barrett.php deleted file mode 100644 index 6efff37..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Barrett.php +++ /dev/null @@ -1,296 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\PHP\Reductions; - -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\PHP; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\PHP\Base; - -/** - * PHP Barrett Modular Exponentiation Engine - * - * @author Jim Wigginton - */ -abstract class Barrett extends Base -{ - /** - * Barrett Modular Reduction - * - * See {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=14 HAC 14.3.3} / - * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=165 MPM 6.2.5} for more information. Modified slightly, - * so as not to require negative numbers (initially, this script didn't support negative numbers). - * - * Employs "folding", as described at - * {@link http://www.cosic.esat.kuleuven.be/publications/thesis-149.pdf#page=66 thesis-149.pdf#page=66}. To quote from - * it, "the idea [behind folding] is to find a value x' such that x (mod m) = x' (mod m), with x' being smaller than x." - * - * Unfortunately, the "Barrett Reduction with Folding" algorithm described in thesis-149.pdf is not, as written, all that - * usable on account of (1) its not using reasonable radix points as discussed in - * {@link http://math.libtomcrypt.com/files/tommath.pdf#page=162 MPM 6.2.2} and (2) the fact that, even with reasonable - * radix points, it only works when there are an even number of digits in the denominator. The reason for (2) is that - * (x >> 1) + (x >> 1) != x / 2 + x / 2. If x is even, they're the same, but if x is odd, they're not. See the in-line - * comments for details. - * - * @param array $n - * @param array $m - * @param class-string $class - * @return array - */ - protected static function reduce(array $n, array $m, $class) - { - static $cache = [ - self::VARIABLE => [], - self::DATA => [] - ]; - - $m_length = count($m); - - // if (self::compareHelper($n, $static::square($m)) >= 0) { - if (count($n) > 2 * $m_length) { - $lhs = new $class(); - $rhs = new $class(); - $lhs->value = $n; - $rhs->value = $m; - list(, $temp) = $lhs->divide($rhs); - return $temp->value; - } - - // if (m.length >> 1) + 2 <= m.length then m is too small and n can't be reduced - if ($m_length < 5) { - return self::regularBarrett($n, $m, $class); - } - // n = 2 * m.length - $correctionNeeded = false; - if ($m_length & 1) { - $correctionNeeded = true; - array_unshift($n, 0); - array_unshift($m, 0); - $m_length++; - } - - if (($key = array_search($m, $cache[self::VARIABLE])) === false) { - $key = count($cache[self::VARIABLE]); - $cache[self::VARIABLE][] = $m; - - $lhs = new $class(); - $lhs_value = &$lhs->value; - $lhs_value = self::array_repeat(0, $m_length + ($m_length >> 1)); - $lhs_value[] = 1; - $rhs = new $class(); - $rhs->value = $m; - - list($u, $m1) = $lhs->divide($rhs); - $u = $u->value; - $m1 = $m1->value; - - $cache[self::DATA][] = [ - 'u' => $u, // m.length >> 1 (technically (m.length >> 1) + 1) - 'm1' => $m1 // m.length - ]; - } else { - $cacheValues = $cache[self::DATA][$key]; - $u = $cacheValues['u']; - $m1 = $cacheValues['m1']; - } - - $cutoff = $m_length + ($m_length >> 1); - $lsd = array_slice($n, 0, $cutoff); // m.length + (m.length >> 1) - $msd = array_slice($n, $cutoff); // m.length >> 1 - - $lsd = self::trim($lsd); - $temp = $class::multiplyHelper($msd, false, $m1, false); // m.length + (m.length >> 1) - $n = $class::addHelper($lsd, false, $temp[self::VALUE], false); // m.length + (m.length >> 1) + 1 (so basically we're adding two same length numbers) - //if ($m_length & 1) { - // return self::regularBarrett($n[self::VALUE], $m, $class); - //} - - // (m.length + (m.length >> 1) + 1) - (m.length - 1) == (m.length >> 1) + 2 - $temp = array_slice($n[self::VALUE], $m_length - 1); - // if even: ((m.length >> 1) + 2) + (m.length >> 1) == m.length + 2 - // if odd: ((m.length >> 1) + 2) + (m.length >> 1) == (m.length - 1) + 2 == m.length + 1 - // note that these are upper bounds. let's say m.length is 2. then you'd be multiplying a - // 3 digit number by a 1 digit number. if you're doing 999 * 9 (in base 10) the result will - // be a 4 digit number. but if you're multiplying 111 * 1 then the result will be a 3 digit - // number. - $temp = $class::multiplyHelper($temp, false, $u, false); - // if even: (m.length + 2) - ((m.length >> 1) + 1) = m.length - (m.length >> 1) + 1 - // if odd: (m.length + 1) - ((m.length >> 1) + 1) = m.length - (m.length >> 1) - $temp = array_slice($temp[self::VALUE], ($m_length >> 1) + 1); - // if even: (m.length - (m.length >> 1) + 1) + m.length = 2 * m.length - (m.length >> 1) + 1 - // if odd: (m.length - (m.length >> 1)) + m.length = 2 * m.length - (m.length >> 1) - $temp = $class::multiplyHelper($temp, false, $m, false); - // at this point, if m had an odd number of digits, we'd (probably) be subtracting a 2 * m.length - (m.length >> 1) - // digit number from a m.length + (m.length >> 1) + 1 digit number. ie. there'd be an extra digit and the while loop - // following this comment would loop a lot (hence our calling _regularBarrett() in that situation). - $result = $class::subtractHelper($n[self::VALUE], false, $temp[self::VALUE], false); - - while (self::compareHelper($result[self::VALUE], $result[self::SIGN], $m, false) >= 0) { - $result = $class::subtractHelper($result[self::VALUE], $result[self::SIGN], $m, false); - } - - if ($correctionNeeded) { - array_shift($result[self::VALUE]); - } - - return $result[self::VALUE]; - } - - /** - * (Regular) Barrett Modular Reduction - * - * For numbers with more than four digits BigInteger::_barrett() is faster. The difference between that and this - * is that this function does not fold the denominator into a smaller form. - * - * @param array $x - * @param array $n - * @param string $class - * @return array - */ - private static function regularBarrett(array $x, array $n, $class) - { - static $cache = [ - self::VARIABLE => [], - self::DATA => [] - ]; - - $n_length = count($n); - - if (count($x) > 2 * $n_length) { - $lhs = new $class(); - $rhs = new $class(); - $lhs->value = $x; - $rhs->value = $n; - list(, $temp) = $lhs->divide($rhs); - return $temp->value; - } - - if (($key = array_search($n, $cache[self::VARIABLE])) === false) { - $key = count($cache[self::VARIABLE]); - $cache[self::VARIABLE][] = $n; - $lhs = new $class(); - $lhs_value = &$lhs->value; - $lhs_value = self::array_repeat(0, 2 * $n_length); - $lhs_value[] = 1; - $rhs = new $class(); - $rhs->value = $n; - list($temp, ) = $lhs->divide($rhs); // m.length - $cache[self::DATA][] = $temp->value; - } - - // 2 * m.length - (m.length - 1) = m.length + 1 - $temp = array_slice($x, $n_length - 1); - // (m.length + 1) + m.length = 2 * m.length + 1 - $temp = $class::multiplyHelper($temp, false, $cache[self::DATA][$key], false); - // (2 * m.length + 1) - (m.length - 1) = m.length + 2 - $temp = array_slice($temp[self::VALUE], $n_length + 1); - - // m.length + 1 - $result = array_slice($x, 0, $n_length + 1); - // m.length + 1 - $temp = self::multiplyLower($temp, false, $n, false, $n_length + 1, $class); - // $temp == array_slice($class::regularMultiply($temp, false, $n, false)->value, 0, $n_length + 1) - - if (self::compareHelper($result, false, $temp[self::VALUE], $temp[self::SIGN]) < 0) { - $corrector_value = self::array_repeat(0, $n_length + 1); - $corrector_value[count($corrector_value)] = 1; - $result = $class::addHelper($result, false, $corrector_value, false); - $result = $result[self::VALUE]; - } - - // at this point, we're subtracting a number with m.length + 1 digits from another number with m.length + 1 digits - $result = $class::subtractHelper($result, false, $temp[self::VALUE], $temp[self::SIGN]); - while (self::compareHelper($result[self::VALUE], $result[self::SIGN], $n, false) > 0) { - $result = $class::subtractHelper($result[self::VALUE], $result[self::SIGN], $n, false); - } - - return $result[self::VALUE]; - } - - /** - * Performs long multiplication up to $stop digits - * - * If you're going to be doing array_slice($product->value, 0, $stop), some cycles can be saved. - * - * @see self::regularBarrett() - * @param array $x_value - * @param bool $x_negative - * @param array $y_value - * @param bool $y_negative - * @param int $stop - * @param string $class - * @return array - */ - private static function multiplyLower(array $x_value, $x_negative, array $y_value, $y_negative, $stop, $class) - { - $x_length = count($x_value); - $y_length = count($y_value); - - if (!$x_length || !$y_length) { // a 0 is being multiplied - return [ - self::VALUE => [], - self::SIGN => false - ]; - } - - if ($x_length < $y_length) { - $temp = $x_value; - $x_value = $y_value; - $y_value = $temp; - - $x_length = count($x_value); - $y_length = count($y_value); - } - - $product_value = self::array_repeat(0, $x_length + $y_length); - - // the following for loop could be removed if the for loop following it - // (the one with nested for loops) initially set $i to 0, but - // doing so would also make the result in one set of unnecessary adds, - // since on the outermost loops first pass, $product->value[$k] is going - // to always be 0 - - $carry = 0; - - for ($j = 0; $j < $x_length; ++$j) { // ie. $i = 0, $k = $i - $temp = $x_value[$j] * $y_value[0] + $carry; // $product_value[$k] == 0 - $carry = $class::BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); - $product_value[$j] = (int) ($temp - $class::BASE_FULL * $carry); - } - - if ($j < $stop) { - $product_value[$j] = $carry; - } - - // the above for loop is what the previous comment was talking about. the - // following for loop is the "one with nested for loops" - - for ($i = 1; $i < $y_length; ++$i) { - $carry = 0; - - for ($j = 0, $k = $i; $j < $x_length && $k < $stop; ++$j, ++$k) { - $temp = $product_value[$k] + $x_value[$j] * $y_value[$i] + $carry; - $carry = $class::BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31); - $product_value[$k] = (int) ($temp - $class::BASE_FULL * $carry); - } - - if ($k < $stop) { - $product_value[$k] = $carry; - } - } - - return [ - self::VALUE => self::trim($product_value), - self::SIGN => $x_negative != $y_negative - ]; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Classic.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Classic.php deleted file mode 100644 index cc1d4a2..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Classic.php +++ /dev/null @@ -1,42 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\PHP\Reductions; - -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\PHP\Base; - -/** - * PHP Classic Modular Exponentiation Engine - * - * @author Jim Wigginton - */ -abstract class Classic extends Base -{ - /** - * Regular Division - * - * @param array $x - * @param array $n - * @param string $class - * @return array - */ - protected static function reduce(array $x, array $n, $class) - { - $lhs = new $class(); - $lhs->value = $x; - $rhs = new $class(); - $rhs->value = $n; - list(, $temp) = $lhs->divide($rhs); - return $temp->value; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/EvalBarrett.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/EvalBarrett.php deleted file mode 100644 index a7dd7c4..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/EvalBarrett.php +++ /dev/null @@ -1,500 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\PHP\Reductions; - -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\PHP; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\PHP\Base; - -/** - * PHP Dynamic Barrett Modular Exponentiation Engine - * - * @author Jim Wigginton - */ -abstract class EvalBarrett extends Base -{ - /** - * Custom Reduction Function - * - * @see self::generateCustomReduction - */ - private static $custom_reduction; - - /** - * Barrett Modular Reduction - * - * This calls a dynamically generated loop unrolled function that's specific to a given modulo. - * Array lookups are avoided as are if statements testing for how many bits the host OS supports, etc. - * - * @param array $n - * @param array $m - * @param string $class - * @return array - */ - protected static function reduce(array $n, array $m, $class) - { - $inline = self::$custom_reduction; - return $inline($n); - } - - /** - * Generate Custom Reduction - * - * @param PHP $m - * @param string $class - * @return callable - */ - protected static function generateCustomReduction(PHP $m, $class) - { - $m_length = count($m->value); - - if ($m_length < 5) { - $code = ' - $lhs = new ' . $class . '(); - $lhs->value = $x; - $rhs = new ' . $class . '(); - $rhs->value = [' . - implode(',', array_map(self::class . '::float2string', $m->value)) . ']; - list(, $temp) = $lhs->divide($rhs); - return $temp->value; - '; - eval('$func = function ($x) { ' . $code . '};'); - self::$custom_reduction = $func; - //self::$custom_reduction = \Closure::bind($func, $m, $class); - return $func; - } - - $correctionNeeded = false; - if ($m_length & 1) { - $correctionNeeded = true; - $m = clone $m; - array_unshift($m->value, 0); - $m_length++; - } - - $lhs = new $class(); - $lhs_value = &$lhs->value; - - $lhs_value = self::array_repeat(0, $m_length + ($m_length >> 1)); - $lhs_value[] = 1; - $rhs = new $class(); - - list($u, $m1) = $lhs->divide($m); - - if ($class::BASE != 26) { - $u = $u->value; - } else { - $lhs_value = self::array_repeat(0, 2 * $m_length); - $lhs_value[] = 1; - $rhs = new $class(); - - list($u) = $lhs->divide($m); - $u = $u->value; - } - - $m = $m->value; - $m1 = $m1->value; - - $cutoff = count($m) + (count($m) >> 1); - - $code = $correctionNeeded ? - 'array_unshift($n, 0);' : - ''; - - $code .= ' - if (count($n) > ' . (2 * count($m)) . ') { - $lhs = new ' . $class . '(); - $rhs = new ' . $class . '(); - $lhs->value = $n; - $rhs->value = [' . - implode(',', array_map(self::class . '::float2string', $m)) . ']; - list(, $temp) = $lhs->divide($rhs); - return $temp->value; - } - - $lsd = array_slice($n, 0, ' . $cutoff . '); - $msd = array_slice($n, ' . $cutoff . ');'; - - $code .= self::generateInlineTrim('msd'); - $code .= self::generateInlineMultiply('msd', $m1, 'temp', $class); - $code .= self::generateInlineAdd('lsd', 'temp', 'n', $class); - - $code .= '$temp = array_slice($n, ' . (count($m) - 1) . ');'; - $code .= self::generateInlineMultiply('temp', $u, 'temp2', $class); - $code .= self::generateInlineTrim('temp2'); - - $code .= $class::BASE == 26 ? - '$temp = array_slice($temp2, ' . (count($m) + 1) . ');' : - '$temp = array_slice($temp2, ' . ((count($m) >> 1) + 1) . ');'; - $code .= self::generateInlineMultiply('temp', $m, 'temp2', $class); - $code .= self::generateInlineTrim('temp2'); - - /* - if ($class::BASE == 26) { - $code.= '$n = array_slice($n, 0, ' . (count($m) + 1) . '); - $temp2 = array_slice($temp2, 0, ' . (count($m) + 1) . ');'; - } - */ - - $code .= self::generateInlineSubtract2('n', 'temp2', 'temp', $class); - - $subcode = self::generateInlineSubtract1('temp', $m, 'temp2', $class); - $subcode .= '$temp = $temp2;'; - - $code .= self::generateInlineCompare($m, 'temp', $subcode); - - if ($correctionNeeded) { - $code .= 'array_shift($temp);'; - } - - $code .= 'return $temp;'; - - eval('$func = function ($n) { ' . $code . '};'); - - self::$custom_reduction = $func; - - return $func; - - //self::$custom_reduction = \Closure::bind($func, $m, $class); - } - - /** - * Inline Trim - * - * Removes leading zeros - * - * @param string $name - * @return string - */ - private static function generateInlineTrim($name) - { - return ' - for ($i = count($' . $name . ') - 1; $i >= 0; --$i) { - if ($' . $name . '[$i]) { - break; - } - unset($' . $name . '[$i]); - }'; - } - - /** - * Inline Multiply (unknown, known) - * - * @param string $input - * @param array $arr - * @param string $output - * @param string $class - * @return string - */ - private static function generateInlineMultiply($input, array $arr, $output, $class) - { - if (!count($arr)) { - return 'return [];'; - } - - $regular = ' - $length = count($' . $input . '); - if (!$length) { - $' . $output . ' = []; - }else{ - $' . $output . ' = array_fill(0, $length + ' . count($arr) . ', 0); - $carry = 0;'; - - for ($i = 0; $i < count($arr); $i++) { - $regular .= ' - $subtemp = $' . $input . '[0] * ' . $arr[$i]; - $regular .= $i ? ' + $carry;' : ';'; - - $regular .= '$carry = '; - $regular .= $class::BASE === 26 ? - 'intval($subtemp / 0x4000000);' : - '$subtemp >> 31;'; - $regular .= - '$' . $output . '[' . $i . '] = '; - if ($class::BASE === 26) { - $regular .= '(int) ('; - } - $regular .= '$subtemp - ' . $class::BASE_FULL . ' * $carry'; - $regular .= $class::BASE === 26 ? ');' : ';'; - } - - $regular .= '$' . $output . '[' . count($arr) . '] = $carry;'; - - $regular .= ' - for ($i = 1; $i < $length; ++$i) {'; - - for ($j = 0; $j < count($arr); $j++) { - $regular .= $j ? '$k++;' : '$k = $i;'; - $regular .= ' - $subtemp = $' . $output . '[$k] + $' . $input . '[$i] * ' . $arr[$j]; - $regular .= $j ? ' + $carry;' : ';'; - - $regular .= '$carry = '; - $regular .= $class::BASE === 26 ? - 'intval($subtemp / 0x4000000);' : - '$subtemp >> 31;'; - $regular .= - '$' . $output . '[$k] = '; - if ($class::BASE === 26) { - $regular .= '(int) ('; - } - $regular .= '$subtemp - ' . $class::BASE_FULL . ' * $carry'; - $regular .= $class::BASE === 26 ? ');' : ';'; - } - - $regular .= '$' . $output . '[++$k] = $carry; $carry = 0;'; - - $regular .= '}}'; - - //if (count($arr) < 2 * self::KARATSUBA_CUTOFF) { - //} - - return $regular; - } - - /** - * Inline Addition - * - * @param string $x - * @param string $y - * @param string $result - * @param string $class - * @return string - */ - private static function generateInlineAdd($x, $y, $result, $class) - { - $code = ' - $length = max(count($' . $x . '), count($' . $y . ')); - $' . $result . ' = array_pad($' . $x . ', $length + 1, 0); - $_' . $y . ' = array_pad($' . $y . ', $length, 0); - $carry = 0; - for ($i = 0, $j = 1; $j < $length; $i+=2, $j+=2) { - $sum = ($' . $result . '[$j] + $_' . $y . '[$j]) * ' . $class::BASE_FULL . ' - + $' . $result . '[$i] + $_' . $y . '[$i] + - $carry; - $carry = $sum >= ' . self::float2string($class::MAX_DIGIT2) . '; - $sum = $carry ? $sum - ' . self::float2string($class::MAX_DIGIT2) . ' : $sum;'; - - $code .= $class::BASE === 26 ? - '$upper = intval($sum / 0x4000000); $' . $result . '[$i] = (int) ($sum - ' . $class::BASE_FULL . ' * $upper);' : - '$upper = $sum >> 31; $' . $result . '[$i] = $sum - ' . $class::BASE_FULL . ' * $upper;'; - $code .= ' - $' . $result . '[$j] = $upper; - } - if ($j == $length) { - $sum = $' . $result . '[$i] + $_' . $y . '[$i] + $carry; - $carry = $sum >= ' . self::float2string($class::BASE_FULL) . '; - $' . $result . '[$i] = $carry ? $sum - ' . self::float2string($class::BASE_FULL) . ' : $sum; - ++$i; - } - if ($carry) { - for (; $' . $result . '[$i] == ' . $class::MAX_DIGIT . '; ++$i) { - $' . $result . '[$i] = 0; - } - ++$' . $result . '[$i]; - }'; - $code .= self::generateInlineTrim($result); - - return $code; - } - - /** - * Inline Subtraction 2 - * - * For when $known is more digits than $unknown. This is the harder use case to optimize for. - * - * @param string $known - * @param string $unknown - * @param string $result - * @param string $class - * @return string - */ - private static function generateInlineSubtract2($known, $unknown, $result, $class) - { - $code = ' - $' . $result . ' = $' . $known . '; - $carry = 0; - $size = count($' . $unknown . '); - for ($i = 0, $j = 1; $j < $size; $i+= 2, $j+= 2) { - $sum = ($' . $known . '[$j] - $' . $unknown . '[$j]) * ' . $class::BASE_FULL . ' + $' . $known . '[$i] - - $' . $unknown . '[$i] - - $carry; - $carry = $sum < 0; - if ($carry) { - $sum+= ' . self::float2string($class::MAX_DIGIT2) . '; - } - $subtemp = '; - $code .= $class::BASE === 26 ? - 'intval($sum / 0x4000000);' : - '$sum >> 31;'; - $code .= '$' . $result . '[$i] = '; - if ($class::BASE === 26) { - $code .= '(int) ('; - } - $code .= '$sum - ' . $class::BASE_FULL . ' * $subtemp'; - if ($class::BASE === 26) { - $code .= ')'; - } - $code .= '; - $' . $result . '[$j] = $subtemp; - } - if ($j == $size) { - $sum = $' . $known . '[$i] - $' . $unknown . '[$i] - $carry; - $carry = $sum < 0; - $' . $result . '[$i] = $carry ? $sum + ' . $class::BASE_FULL . ' : $sum; - ++$i; - } - - if ($carry) { - for (; !$' . $result . '[$i]; ++$i) { - $' . $result . '[$i] = ' . $class::MAX_DIGIT . '; - } - --$' . $result . '[$i]; - }'; - - $code .= self::generateInlineTrim($result); - - return $code; - } - - /** - * Inline Subtraction 1 - * - * For when $unknown is more digits than $known. This is the easier use case to optimize for. - * - * @param string $unknown - * @param array $known - * @param string $result - * @param string $class - * @return string - */ - private static function generateInlineSubtract1($unknown, array $known, $result, $class) - { - $code = '$' . $result . ' = $' . $unknown . ';'; - for ($i = 0, $j = 1; $j < count($known); $i += 2, $j += 2) { - $code .= '$sum = $' . $unknown . '[' . $j . '] * ' . $class::BASE_FULL . ' + $' . $unknown . '[' . $i . '] - '; - $code .= self::float2string($known[$j] * $class::BASE_FULL + $known[$i]); - if ($i != 0) { - $code .= ' - $carry'; - } - - $code .= '; - if ($carry = $sum < 0) { - $sum+= ' . self::float2string($class::MAX_DIGIT2) . '; - } - $subtemp = '; - $code .= $class::BASE === 26 ? - 'intval($sum / 0x4000000);' : - '$sum >> 31;'; - $code .= ' - $' . $result . '[' . $i . '] = '; - if ($class::BASE === 26) { - $code .= ' (int) ('; - } - $code .= '$sum - ' . $class::BASE_FULL . ' * $subtemp'; - if ($class::BASE === 26) { - $code .= ')'; - } - $code .= '; - $' . $result . '[' . $j . '] = $subtemp;'; - } - - $code .= '$i = ' . $i . ';'; - - if ($j == count($known)) { - $code .= ' - $sum = $' . $unknown . '[' . $i . '] - ' . $known[$i] . ' - $carry; - $carry = $sum < 0; - $' . $result . '[' . $i . '] = $carry ? $sum + ' . $class::BASE_FULL . ' : $sum; - ++$i;'; - } - - $code .= ' - if ($carry) { - for (; !$' . $result . '[$i]; ++$i) { - $' . $result . '[$i] = ' . $class::MAX_DIGIT . '; - } - --$' . $result . '[$i]; - }'; - $code .= self::generateInlineTrim($result); - - return $code; - } - - /** - * Inline Comparison - * - * If $unknown >= $known then loop - * - * @param array $known - * @param string $unknown - * @param string $subcode - * @return string - */ - private static function generateInlineCompare(array $known, $unknown, $subcode) - { - $uniqid = uniqid(); - $code = 'loop_' . $uniqid . ': - $clength = count($' . $unknown . '); - switch (true) { - case $clength < ' . count($known) . ': - goto end_' . $uniqid . '; - case $clength > ' . count($known) . ':'; - for ($i = count($known) - 1; $i >= 0; $i--) { - $code .= ' - case $' . $unknown . '[' . $i . '] > ' . $known[$i] . ': - goto subcode_' . $uniqid . '; - case $' . $unknown . '[' . $i . '] < ' . $known[$i] . ': - goto end_' . $uniqid . ';'; - } - $code .= ' - default: - // do subcode - } - - subcode_' . $uniqid . ':' . $subcode . ' - goto loop_' . $uniqid . '; - - end_' . $uniqid . ':'; - - return $code; - } - - /** - * Convert a float to a string - * - * If you do echo floatval(pow(2, 52)) you'll get 4.6116860184274E+18. It /can/ be displayed without a loss of - * precision but displayed in this way there will be precision loss, hence the need for this method. - * - * @param int|float $num - * @return string - */ - private static function float2string($num) - { - if (!is_float($num)) { - return (string) $num; - } - - if ($num < 0) { - return '-' . self::float2string(abs($num)); - } - - $temp = ''; - while ($num) { - $temp = fmod($num, 10) . $temp; - $num = floor($num / 10); - } - - return $temp; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Montgomery.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Montgomery.php deleted file mode 100644 index 8e201a1..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/Montgomery.php +++ /dev/null @@ -1,126 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\PHP\Reductions; - -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\PHP\Montgomery as Progenitor; - -/** - * PHP Montgomery Modular Exponentiation Engine - * - * @author Jim Wigginton - */ -abstract class Montgomery extends Progenitor -{ - /** - * Prepare a number for use in Montgomery Modular Reductions - * - * @param array $x - * @param array $n - * @param string $class - * @return array - */ - protected static function prepareReduce(array $x, array $n, $class) - { - $lhs = new $class(); - $lhs->value = array_merge(self::array_repeat(0, count($n)), $x); - $rhs = new $class(); - $rhs->value = $n; - - list(, $temp) = $lhs->divide($rhs); - return $temp->value; - } - - /** - * Montgomery Multiply - * - * Interleaves the montgomery reduction and long multiplication algorithms together as described in - * {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=13 HAC 14.36} - * - * @param array $x - * @param array $n - * @param string $class - * @return array - */ - protected static function reduce(array $x, array $n, $class) - { - static $cache = [ - self::VARIABLE => [], - self::DATA => [] - ]; - - if (($key = array_search($n, $cache[self::VARIABLE])) === false) { - $key = count($cache[self::VARIABLE]); - $cache[self::VARIABLE][] = $x; - $cache[self::DATA][] = self::modInverse67108864($n, $class); - } - - $k = count($n); - - $result = [self::VALUE => $x]; - - for ($i = 0; $i < $k; ++$i) { - $temp = $result[self::VALUE][$i] * $cache[self::DATA][$key]; - $temp = $temp - $class::BASE_FULL * ($class::BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31)); - $temp = $class::regularMultiply([$temp], $n); - $temp = array_merge(self::array_repeat(0, $i), $temp); - $result = $class::addHelper($result[self::VALUE], false, $temp, false); - } - - $result[self::VALUE] = array_slice($result[self::VALUE], $k); - - if (self::compareHelper($result, false, $n, false) >= 0) { - $result = $class::subtractHelper($result[self::VALUE], false, $n, false); - } - - return $result[self::VALUE]; - } - - /** - * Modular Inverse of a number mod 2**26 (eg. 67108864) - * - * Based off of the bnpInvDigit function implemented and justified in the following URL: - * - * {@link http://www-cs-students.stanford.edu/~tjw/jsbn/jsbn.js} - * - * The following URL provides more info: - * - * {@link http://groups.google.com/group/sci.crypt/msg/7a137205c1be7d85} - * - * As for why we do all the bitmasking... strange things can happen when converting from floats to ints. For - * instance, on some computers, var_dump((int) -4294967297) yields int(-1) and on others, it yields - * int(-2147483648). To avoid problems stemming from this, we use bitmasks to guarantee that ints aren't - * auto-converted to floats. The outermost bitmask is present because without it, there's no guarantee that - * the "residue" returned would be the so-called "common residue". We use fmod, in the last step, because the - * maximum possible $x is 26 bits and the maximum $result is 16 bits. Thus, we have to be able to handle up to - * 40 bits, which only 64-bit floating points will support. - * - * Thanks to Pedro Gimeno Fortea for input! - * - * @param array $x - * @param string $class - * @return int - */ - protected static function modInverse67108864(array $x, $class) // 2**26 == 67,108,864 - { - $x = -$x[0]; - $result = $x & 0x3; // x**-1 mod 2**2 - $result = ($result * (2 - $x * $result)) & 0xF; // x**-1 mod 2**4 - $result = ($result * (2 - ($x & 0xFF) * $result)) & 0xFF; // x**-1 mod 2**8 - $result = ($result * ((2 - ($x & 0xFFFF) * $result) & 0xFFFF)) & 0xFFFF; // x**-1 mod 2**16 - $result = $class::BASE == 26 ? - fmod($result * (2 - fmod($x * $result, $class::BASE_FULL)), $class::BASE_FULL) : // x**-1 mod 2**26 - ($result * (2 - ($x * $result) % $class::BASE_FULL)) % $class::BASE_FULL; - return $result & $class::MAX_DIGIT; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/MontgomeryMult.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/MontgomeryMult.php deleted file mode 100644 index 35659e6..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/MontgomeryMult.php +++ /dev/null @@ -1,76 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\PHP\Reductions; - -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\PHP; - -/** - * PHP Montgomery Modular Exponentiation Engine with interleaved multiplication - * - * @author Jim Wigginton - */ -abstract class MontgomeryMult extends Montgomery -{ - /** - * Montgomery Multiply - * - * Interleaves the montgomery reduction and long multiplication algorithms together as described in - * {@link http://www.cacr.math.uwaterloo.ca/hac/about/chap14.pdf#page=13 HAC 14.36} - * - * @see self::_prepMontgomery() - * @see self::_montgomery() - * @param array $x - * @param array $y - * @param array $m - * @param class-string $class - * @return array - */ - public static function multiplyReduce(array $x, array $y, array $m, $class) - { - // the following code, although not callable, can be run independently of the above code - // although the above code performed better in my benchmarks the following could might - // perform better under different circumstances. in lieu of deleting it it's just been - // made uncallable - - static $cache = [ - self::VARIABLE => [], - self::DATA => [] - ]; - - if (($key = array_search($m, $cache[self::VARIABLE])) === false) { - $key = count($cache[self::VARIABLE]); - $cache[self::VARIABLE][] = $m; - $cache[self::DATA][] = self::modInverse67108864($m, $class); - } - - $n = max(count($x), count($y), count($m)); - $x = array_pad($x, $n, 0); - $y = array_pad($y, $n, 0); - $m = array_pad($m, $n, 0); - $a = [self::VALUE => self::array_repeat(0, $n + 1)]; - for ($i = 0; $i < $n; ++$i) { - $temp = $a[self::VALUE][0] + $x[$i] * $y[0]; - $temp = $temp - $class::BASE_FULL * ($class::BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31)); - $temp = $temp * $cache[self::DATA][$key]; - $temp = $temp - $class::BASE_FULL * ($class::BASE === 26 ? intval($temp / 0x4000000) : ($temp >> 31)); - $temp = $class::addHelper($class::regularMultiply([$x[$i]], $y), false, $class::regularMultiply([$temp], $m), false); - $a = $class::addHelper($a[self::VALUE], false, $temp[self::VALUE], false); - $a[self::VALUE] = array_slice($a[self::VALUE], 1); - } - if (self::compareHelper($a[self::VALUE], false, $m, false) >= 0) { - $a = $class::subtractHelper($a[self::VALUE], false, $m, false); - } - return $a[self::VALUE]; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/PowerOfTwo.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/PowerOfTwo.php deleted file mode 100644 index cc33201..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP/Reductions/PowerOfTwo.php +++ /dev/null @@ -1,59 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\PHP\Reductions; - -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines\PHP\Base; - -/** - * PHP Power Of Two Modular Exponentiation Engine - * - * @author Jim Wigginton - */ -abstract class PowerOfTwo extends Base -{ - /** - * Prepare a number for use in Montgomery Modular Reductions - * - * @param array $x - * @param array $n - * @param string $class - * @return array - */ - protected static function prepareReduce(array $x, array $n, $class) - { - return self::reduce($x, $n, $class); - } - - /** - * Power Of Two Reduction - * - * @param array $x - * @param array $n - * @param string $class - * @return array - */ - protected static function reduce(array $x, array $n, $class) - { - $lhs = new $class(); - $lhs->value = $x; - $rhs = new $class(); - $rhs->value = $n; - - $temp = new $class(); - $temp->value = [1]; - - $result = $lhs->bitwise_and($rhs->subtract($temp)); - return $result->value; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP32.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP32.php deleted file mode 100644 index 104be58..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP32.php +++ /dev/null @@ -1,371 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines; - -/** - * Pure-PHP 32-bit Engine. - * - * Uses 64-bit floats if int size is 4 bits - * - * @author Jim Wigginton - */ -class PHP32 extends PHP -{ - // Constants used by PHP.php - const BASE = 26; - const BASE_FULL = 0x4000000; - const MAX_DIGIT = 0x3FFFFFF; - const MSB = 0x2000000; - - /** - * MAX10 in greatest MAX10LEN satisfying - * MAX10 = 10**MAX10LEN <= 2**BASE. - */ - const MAX10 = 10000000; - - /** - * MAX10LEN in greatest MAX10LEN satisfying - * MAX10 = 10**MAX10LEN <= 2**BASE. - */ - const MAX10LEN = 7; - const MAX_DIGIT2 = 4503599627370496; - - /** - * Initialize a PHP32 BigInteger Engine instance - * - * @param int $base - * @see parent::initialize() - */ - protected function initialize($base) - { - if ($base != 256 && $base != -256) { - return parent::initialize($base); - } - - $val = $this->value; - $this->value = []; - $vals = &$this->value; - $i = strlen($val); - if (!$i) { - return; - } - - while (true) { - $i -= 4; - if ($i < 0) { - if ($i == -4) { - break; - } - $val = substr($val, 0, 4 + $i); - $val = str_pad($val, 4, "\0", STR_PAD_LEFT); - if ($val == "\0\0\0\0") { - break; - } - $i = 0; - } - list(, $digit) = unpack('N', substr($val, $i, 4)); - if ($digit < 0) { - $digit += 0xFFFFFFFF + 1; - } - $step = count($vals) & 3; - if ($step) { - $digit = (int) floor($digit / pow(2, 2 * $step)); - } - if ($step != 3) { - $digit = (int) fmod($digit, static::BASE_FULL); - $i++; - } - $vals[] = $digit; - } - while (end($vals) === 0) { - array_pop($vals); - } - reset($vals); - } - - /** - * Test for engine validity - * - * @see parent::__construct() - * @return bool - */ - public static function isValidEngine() - { - return PHP_INT_SIZE >= 4 && !self::testJITOnWindows(); - } - - /** - * Adds two BigIntegers. - * - * @param PHP32 $y - * @return PHP32 - */ - public function add(PHP32 $y) - { - $temp = self::addHelper($this->value, $this->is_negative, $y->value, $y->is_negative); - - return $this->convertToObj($temp); - } - - /** - * Subtracts two BigIntegers. - * - * @param PHP32 $y - * @return PHP32 - */ - public function subtract(PHP32 $y) - { - $temp = self::subtractHelper($this->value, $this->is_negative, $y->value, $y->is_negative); - - return $this->convertToObj($temp); - } - - /** - * Multiplies two BigIntegers. - * - * @param PHP32 $y - * @return PHP32 - */ - public function multiply(PHP32 $y) - { - $temp = self::multiplyHelper($this->value, $this->is_negative, $y->value, $y->is_negative); - - return $this->convertToObj($temp); - } - - /** - * Divides two BigIntegers. - * - * Returns an array whose first element contains the quotient and whose second element contains the - * "common residue". If the remainder would be positive, the "common residue" and the remainder are the - * same. If the remainder would be negative, the "common residue" is equal to the sum of the remainder - * and the divisor (basically, the "common residue" is the first positive modulo). - * - * @param PHP32 $y - * @return array{PHP32, PHP32} - */ - public function divide(PHP32 $y) - { - return $this->divideHelper($y); - } - - /** - * Calculates modular inverses. - * - * Say you have (30 mod 17 * x mod 17) mod 17 == 1. x can be found using modular inverses. - * @param PHP32 $n - * @return false|PHP32 - */ - public function modInverse(PHP32 $n) - { - return $this->modInverseHelper($n); - } - - /** - * Calculates modular inverses. - * - * Say you have (30 mod 17 * x mod 17) mod 17 == 1. x can be found using modular inverses. - * @param PHP32 $n - * @return PHP32[] - */ - public function extendedGCD(PHP32 $n) - { - return $this->extendedGCDHelper($n); - } - - /** - * Calculates the greatest common divisor - * - * Say you have 693 and 609. The GCD is 21. - * - * @param PHP32 $n - * @return PHP32 - */ - public function gcd(PHP32 $n) - { - return $this->extendedGCD($n)['gcd']; - } - - /** - * Logical And - * - * @param PHP32 $x - * @return PHP32 - */ - public function bitwise_and(PHP32 $x) - { - return $this->bitwiseAndHelper($x); - } - - /** - * Logical Or - * - * @param PHP32 $x - * @return PHP32 - */ - public function bitwise_or(PHP32 $x) - { - return $this->bitwiseOrHelper($x); - } - - /** - * Logical Exclusive Or - * - * @param PHP32 $x - * @return PHP32 - */ - public function bitwise_xor(PHP32 $x) - { - return $this->bitwiseXorHelper($x); - } - - /** - * Compares two numbers. - * - * Although one might think !$x->compare($y) means $x != $y, it, in fact, means the opposite. The reason for this is - * demonstrated thusly: - * - * $x > $y: $x->compare($y) > 0 - * $x < $y: $x->compare($y) < 0 - * $x == $y: $x->compare($y) == 0 - * - * Note how the same comparison operator is used. If you want to test for equality, use $x->equals($y). - * - * {@internal Could return $this->subtract($x), but that's not as fast as what we do do.} - * - * @param PHP32 $y - * @return int in case < 0 if $this is less than $y; > 0 if $this is greater than $y, and 0 if they are equal. - * @see self::equals() - */ - public function compare(PHP32 $y) - { - return $this->compareHelper($this->value, $this->is_negative, $y->value, $y->is_negative); - } - - /** - * Tests the equality of two numbers. - * - * If you need to see if one number is greater than or less than another number, use BigInteger::compare() - * - * @param PHP32 $x - * @return bool - */ - public function equals(PHP32 $x) - { - return $this->value === $x->value && $this->is_negative == $x->is_negative; - } - - /** - * Performs modular exponentiation. - * - * @param PHP32 $e - * @param PHP32 $n - * @return PHP32 - */ - public function modPow(PHP32 $e, PHP32 $n) - { - return $this->powModOuter($e, $n); - } - - /** - * Performs modular exponentiation. - * - * Alias for modPow(). - * - * @param PHP32 $e - * @param PHP32 $n - * @return PHP32 - */ - public function powMod(PHP32 $e, PHP32 $n) - { - return $this->powModOuter($e, $n); - } - - /** - * Generate a random prime number between a range - * - * If there's not a prime within the given range, false will be returned. - * - * @param PHP32 $min - * @param PHP32 $max - * @return false|PHP32 - */ - public static function randomRangePrime(PHP32 $min, PHP32 $max) - { - return self::randomRangePrimeOuter($min, $max); - } - - /** - * Generate a random number between a range - * - * Returns a random number between $min and $max where $min and $max - * can be defined using one of the two methods: - * - * BigInteger::randomRange($min, $max) - * BigInteger::randomRange($max, $min) - * - * @param PHP32 $min - * @param PHP32 $max - * @return PHP32 - */ - public static function randomRange(PHP32 $min, PHP32 $max) - { - return self::randomRangeHelper($min, $max); - } - - /** - * Performs exponentiation. - * - * @param PHP32 $n - * @return PHP32 - */ - public function pow(PHP32 $n) - { - return $this->powHelper($n); - } - - /** - * Return the minimum BigInteger between an arbitrary number of BigIntegers. - * - * @param PHP32 ...$nums - * @return PHP32 - */ - public static function min(PHP32 ...$nums) - { - return self::minHelper($nums); - } - - /** - * Return the maximum BigInteger between an arbitrary number of BigIntegers. - * - * @param PHP32 ...$nums - * @return PHP32 - */ - public static function max(PHP32 ...$nums) - { - return self::maxHelper($nums); - } - - /** - * Tests BigInteger to see if it is between two integers, inclusive - * - * @param PHP32 $min - * @param PHP32 $max - * @return bool - */ - public function between(PHP32 $min, PHP32 $max) - { - return $this->compare($min) >= 0 && $this->compare($max) <= 0; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP64.php b/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP64.php deleted file mode 100644 index c0ed12f..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BigInteger/Engines/PHP64.php +++ /dev/null @@ -1,372 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Math\BigInteger\Engines; - -/** - * Pure-PHP 64-bit Engine. - * - * Uses 64-bit integers if int size is 8 bits - * - * @author Jim Wigginton - */ -class PHP64 extends PHP -{ - // Constants used by PHP.php - const BASE = 31; - const BASE_FULL = 0x80000000; - const MAX_DIGIT = 0x7FFFFFFF; - const MSB = 0x40000000; - - /** - * MAX10 in greatest MAX10LEN satisfying - * MAX10 = 10**MAX10LEN <= 2**BASE. - */ - const MAX10 = 1000000000; - - /** - * MAX10LEN in greatest MAX10LEN satisfying - * MAX10 = 10**MAX10LEN <= 2**BASE. - */ - const MAX10LEN = 9; - const MAX_DIGIT2 = 4611686018427387904; - - /** - * Initialize a PHP64 BigInteger Engine instance - * - * @param int $base - * @see parent::initialize() - */ - protected function initialize($base) - { - if ($base != 256 && $base != -256) { - return parent::initialize($base); - } - - $val = $this->value; - $this->value = []; - $vals = &$this->value; - $i = strlen($val); - if (!$i) { - return; - } - - while (true) { - $i -= 4; - if ($i < 0) { - if ($i == -4) { - break; - } - $val = substr($val, 0, 4 + $i); - $val = str_pad($val, 4, "\0", STR_PAD_LEFT); - if ($val == "\0\0\0\0") { - break; - } - $i = 0; - } - list(, $digit) = unpack('N', substr($val, $i, 4)); - $step = count($vals) & 7; - if (!$step) { - $digit &= static::MAX_DIGIT; - $i++; - } else { - $shift = 8 - $step; - $digit >>= $shift; - $shift = 32 - $shift; - $digit &= (1 << $shift) - 1; - $temp = $i > 0 ? ord($val[$i - 1]) : 0; - $digit |= ($temp << $shift) & 0x7F000000; - } - $vals[] = $digit; - } - while (end($vals) === 0) { - array_pop($vals); - } - reset($vals); - } - - /** - * Test for engine validity - * - * @see parent::__construct() - * @return bool - */ - public static function isValidEngine() - { - return PHP_INT_SIZE >= 8 && !self::testJITOnWindows(); - } - - /** - * Adds two BigIntegers. - * - * @param PHP64 $y - * @return PHP64 - */ - public function add(PHP64 $y) - { - $temp = self::addHelper($this->value, $this->is_negative, $y->value, $y->is_negative); - - return $this->convertToObj($temp); - } - - /** - * Subtracts two BigIntegers. - * - * @param PHP64 $y - * @return PHP64 - */ - public function subtract(PHP64 $y) - { - $temp = self::subtractHelper($this->value, $this->is_negative, $y->value, $y->is_negative); - - return $this->convertToObj($temp); - } - - /** - * Multiplies two BigIntegers. - * - * @param PHP64 $y - * @return PHP64 - */ - public function multiply(PHP64 $y) - { - $temp = self::multiplyHelper($this->value, $this->is_negative, $y->value, $y->is_negative); - - return $this->convertToObj($temp); - } - - /** - * Divides two BigIntegers. - * - * Returns an array whose first element contains the quotient and whose second element contains the - * "common residue". If the remainder would be positive, the "common residue" and the remainder are the - * same. If the remainder would be negative, the "common residue" is equal to the sum of the remainder - * and the divisor (basically, the "common residue" is the first positive modulo). - * - * @param PHP64 $y - * @return array{PHP64, PHP64} - */ - public function divide(PHP64 $y) - { - return $this->divideHelper($y); - } - - /** - * Calculates modular inverses. - * - * Say you have (30 mod 17 * x mod 17) mod 17 == 1. x can be found using modular inverses. - * @param PHP64 $n - * @return false|PHP64 - */ - public function modInverse(PHP64 $n) - { - return $this->modInverseHelper($n); - } - - /** - * Calculates modular inverses. - * - * Say you have (30 mod 17 * x mod 17) mod 17 == 1. x can be found using modular inverses. - * @param PHP64 $n - * @return PHP64[] - */ - public function extendedGCD(PHP64 $n) - { - return $this->extendedGCDHelper($n); - } - - /** - * Calculates the greatest common divisor - * - * Say you have 693 and 609. The GCD is 21. - * - * @param PHP64 $n - * @return PHP64 - */ - public function gcd(PHP64 $n) - { - return $this->extendedGCD($n)['gcd']; - } - - /** - * Logical And - * - * @param PHP64 $x - * @return PHP64 - */ - public function bitwise_and(PHP64 $x) - { - return $this->bitwiseAndHelper($x); - } - - /** - * Logical Or - * - * @param PHP64 $x - * @return PHP64 - */ - public function bitwise_or(PHP64 $x) - { - return $this->bitwiseOrHelper($x); - } - - /** - * Logical Exclusive Or - * - * @param PHP64 $x - * @return PHP64 - */ - public function bitwise_xor(PHP64 $x) - { - return $this->bitwiseXorHelper($x); - } - - /** - * Compares two numbers. - * - * Although one might think !$x->compare($y) means $x != $y, it, in fact, means the opposite. The reason for this is - * demonstrated thusly: - * - * $x > $y: $x->compare($y) > 0 - * $x < $y: $x->compare($y) < 0 - * $x == $y: $x->compare($y) == 0 - * - * Note how the same comparison operator is used. If you want to test for equality, use $x->equals($y). - * - * {@internal Could return $this->subtract($x), but that's not as fast as what we do do.} - * - * @param PHP64 $y - * @return int in case < 0 if $this is less than $y; > 0 if $this is greater than $y, and 0 if they are equal. - * @see self::equals() - */ - public function compare(PHP64 $y) - { - return parent::compareHelper($this->value, $this->is_negative, $y->value, $y->is_negative); - } - - /** - * Tests the equality of two numbers. - * - * If you need to see if one number is greater than or less than another number, use BigInteger::compare() - * - * @param PHP64 $x - * @return bool - */ - public function equals(PHP64 $x) - { - return $this->value === $x->value && $this->is_negative == $x->is_negative; - } - - /** - * Performs modular exponentiation. - * - * @param PHP64 $e - * @param PHP64 $n - * @return PHP64 - */ - public function modPow(PHP64 $e, PHP64 $n) - { - return $this->powModOuter($e, $n); - } - - /** - * Performs modular exponentiation. - * - * Alias for modPow(). - * - * @param PHP64 $e - * @param PHP64 $n - * @return PHP64|false - */ - public function powMod(PHP64 $e, PHP64 $n) - { - return $this->powModOuter($e, $n); - } - - /** - * Generate a random prime number between a range - * - * If there's not a prime within the given range, false will be returned. - * - * @param PHP64 $min - * @param PHP64 $max - * @return false|PHP64 - */ - public static function randomRangePrime(PHP64 $min, PHP64 $max) - { - return self::randomRangePrimeOuter($min, $max); - } - - /** - * Generate a random number between a range - * - * Returns a random number between $min and $max where $min and $max - * can be defined using one of the two methods: - * - * BigInteger::randomRange($min, $max) - * BigInteger::randomRange($max, $min) - * - * @param PHP64 $min - * @param PHP64 $max - * @return PHP64 - */ - public static function randomRange(PHP64 $min, PHP64 $max) - { - return self::randomRangeHelper($min, $max); - } - - /** - * Performs exponentiation. - * - * @param PHP64 $n - * @return PHP64 - */ - public function pow(PHP64 $n) - { - return $this->powHelper($n); - } - - /** - * Return the minimum BigInteger between an arbitrary number of BigIntegers. - * - * @param PHP64 ...$nums - * @return PHP64 - */ - public static function min(PHP64 ...$nums) - { - return self::minHelper($nums); - } - - /** - * Return the maximum BigInteger between an arbitrary number of BigIntegers. - * - * @param PHP64 ...$nums - * @return PHP64 - */ - public static function max(PHP64 ...$nums) - { - return self::maxHelper($nums); - } - - /** - * Tests BigInteger to see if it is between two integers, inclusive - * - * @param PHP64 $min - * @param PHP64 $max - * @return bool - */ - public function between(PHP64 $min, PHP64 $max) - { - return $this->compare($min) >= 0 && $this->compare($max) <= 0; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BinaryField.php b/composer/phpseclib/phpseclib/phpseclib/Math/BinaryField.php deleted file mode 100644 index dfdb792..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BinaryField.php +++ /dev/null @@ -1,203 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Math; - -use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; -use OCA\Libresign\Vendor\phpseclib3\Math\BinaryField\Integer; -use OCA\Libresign\Vendor\phpseclib3\Math\Common\FiniteField; - -/** - * Binary Finite Fields - * - * @author Jim Wigginton - */ -class BinaryField extends FiniteField -{ - /** - * Instance Counter - * - * @var int - */ - private static $instanceCounter = 0; - - /** - * Keeps track of current instance - * - * @var int - */ - protected $instanceID; - - /** @var BigInteger */ - private $randomMax; - - /** - * Default constructor - */ - public function __construct(...$indices) - { - $m = array_shift($indices); - if ($m > 571) { - /* sect571r1 and sect571k1 are the largest binary curves that https://www.secg.org/sec2-v2.pdf defines - altho theoretically there may be legit reasons to use binary finite fields with larger degrees - imposing a limit on the maximum size is both reasonable and precedented. in particular, - http://tools.ietf.org/html/rfc4253#section-6.1 (The Secure Shell (SSH) Transport Layer Protocol) says - "implementations SHOULD check that the packet length is reasonable in order for the implementation to - avoid denial of service and/or buffer overflow attacks" */ - throw new \OutOfBoundsException('Degrees larger than 571 are not supported'); - } - $val = str_repeat('0', $m) . '1'; - foreach ($indices as $index) { - $val[$index] = '1'; - } - $modulo = static::base2ToBase256(strrev($val)); - - $mStart = 2 * $m - 2; - $t = ceil($m / 8); - $finalMask = chr((1 << ($m % 8)) - 1); - if ($finalMask == "\0") { - $finalMask = "\xFF"; - } - $bitLen = $mStart + 1; - $pad = ceil($bitLen / 8); - $h = $bitLen & 7; - $h = $h ? 8 - $h : 0; - - $r = rtrim(substr($val, 0, -1), '0'); - $u = [static::base2ToBase256(strrev($r))]; - for ($i = 1; $i < 8; $i++) { - $u[] = static::base2ToBase256(strrev(str_repeat('0', $i) . $r)); - } - - // implements algorithm 2.40 (in section 2.3.5) in "Guide to Elliptic Curve Cryptography" - // with W = 8 - $reduce = function ($c) use ($u, $mStart, $m, $t, $finalMask, $pad, $h) { - $c = str_pad($c, $pad, "\0", STR_PAD_LEFT); - for ($i = $mStart; $i >= $m;) { - $g = $h >> 3; - $mask = $h & 7; - $mask = $mask ? 1 << (7 - $mask) : 0x80; - for (; $mask > 0; $mask >>= 1, $i--, $h++) { - if (ord($c[$g]) & $mask) { - $temp = $i - $m; - $j = $temp >> 3; - $k = $temp & 7; - $t1 = $j ? substr($c, 0, -$j) : $c; - $length = strlen($t1); - if ($length) { - $t2 = str_pad($u[$k], $length, "\0", STR_PAD_LEFT); - $temp = $t1 ^ $t2; - $c = $j ? substr_replace($c, $temp, 0, $length) : $temp; - } - } - } - } - $c = substr($c, -$t); - if (strlen($c) == $t) { - $c[0] = $c[0] & $finalMask; - } - return ltrim($c, "\0"); - }; - - $this->instanceID = self::$instanceCounter++; - Integer::setModulo($this->instanceID, $modulo); - Integer::setRecurringModuloFunction($this->instanceID, $reduce); - - $this->randomMax = new BigInteger($modulo, 2); - } - - /** - * Returns an instance of a dynamically generated PrimeFieldInteger class - * - * @param string $num - * @return Integer - */ - public function newInteger($num) - { - return new Integer($this->instanceID, $num instanceof BigInteger ? $num->toBytes() : $num); - } - - /** - * Returns an integer on the finite field between one and the prime modulo - * - * @return Integer - */ - public function randomInteger() - { - static $one; - if (!isset($one)) { - $one = new BigInteger(1); - } - - return new Integer($this->instanceID, BigInteger::randomRange($one, $this->randomMax)->toBytes()); - } - - /** - * Returns the length of the modulo in bytes - * - * @return int - */ - public function getLengthInBytes() - { - return strlen(Integer::getModulo($this->instanceID)); - } - - /** - * Returns the length of the modulo in bits - * - * @return int - */ - public function getLength() - { - return strlen(Integer::getModulo($this->instanceID)) << 3; - } - - /** - * Converts a base-2 string to a base-256 string - * - * @param string $x - * @param int|null $size - * @return string - */ - public static function base2ToBase256($x, $size = null) - { - $str = Strings::bits2bin($x); - - $pad = strlen($x) >> 3; - if (strlen($x) & 3) { - $pad++; - } - $str = str_pad($str, $pad, "\0", STR_PAD_LEFT); - if (isset($size)) { - $str = str_pad($str, $size, "\0", STR_PAD_LEFT); - } - - return $str; - } - - /** - * Converts a base-256 string to a base-2 string - * - * @param string $x - * @return string - */ - public static function base256ToBase2($x) - { - if (function_exists('gmp_import')) { - return gmp_strval(gmp_import($x), 2); - } - - return Strings::bin2bits($x); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/BinaryField/Integer.php b/composer/phpseclib/phpseclib/phpseclib/Math/BinaryField/Integer.php deleted file mode 100644 index 641463f..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Math/BinaryField/Integer.php +++ /dev/null @@ -1,516 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Math\BinaryField; - -use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -use OCA\Libresign\Vendor\phpseclib3\Math\BinaryField; -use OCA\Libresign\Vendor\phpseclib3\Math\Common\FiniteField\Integer as Base; - -/** - * Binary Finite Fields - * - * @author Jim Wigginton - */ -class Integer extends Base -{ - /** - * Holds the BinaryField's value - * - * @var string - */ - protected $value; - - /** - * Keeps track of current instance - * - * @var int - */ - protected $instanceID; - - /** - * Holds the PrimeField's modulo - * - * @var array - */ - protected static $modulo; - - /** - * Holds a pre-generated function to perform modulo reductions - * - * @var callable[] - */ - protected static $reduce; - - /** - * Default constructor - */ - public function __construct($instanceID, $num = '') - { - $this->instanceID = $instanceID; - if (!strlen($num)) { - $this->value = ''; - } else { - $reduce = static::$reduce[$instanceID]; - $this->value = $reduce($num); - } - } - - /** - * Set the modulo for a given instance - * @param int $instanceID - * @param string $modulo - */ - public static function setModulo($instanceID, $modulo) - { - static::$modulo[$instanceID] = $modulo; - } - - /** - * Set the modulo for a given instance - */ - public static function setRecurringModuloFunction($instanceID, callable $function) - { - static::$reduce[$instanceID] = $function; - } - - /** - * Tests a parameter to see if it's of the right instance - * - * Throws an exception if the incorrect class is being utilized - */ - private static function checkInstance(self $x, self $y) - { - if ($x->instanceID != $y->instanceID) { - throw new \UnexpectedValueException('The instances of the two BinaryField\Integer objects do not match'); - } - } - - /** - * Tests the equality of two numbers. - * - * @return bool - */ - public function equals(self $x) - { - static::checkInstance($this, $x); - - return $this->value == $x->value; - } - - /** - * Compares two numbers. - * - * @return int - */ - public function compare(self $x) - { - static::checkInstance($this, $x); - - $a = $this->value; - $b = $x->value; - - $length = max(strlen($a), strlen($b)); - - $a = str_pad($a, $length, "\0", STR_PAD_LEFT); - $b = str_pad($b, $length, "\0", STR_PAD_LEFT); - - return strcmp($a, $b); - } - - /** - * Returns the degree of the polynomial - * - * @param string $x - * @return int - */ - private static function deg($x) - { - $x = ltrim($x, "\0"); - $xbit = decbin(ord($x[0])); - $xlen = $xbit == '0' ? 0 : strlen($xbit); - $len = strlen($x); - if (!$len) { - return -1; - } - return 8 * strlen($x) - 9 + $xlen; - } - - /** - * Perform polynomial division - * - * @return string[] - * @link https://en.wikipedia.org/wiki/Polynomial_greatest_common_divisor#Euclidean_division - */ - private static function polynomialDivide($x, $y) - { - // in wikipedia's description of the algorithm, lc() is the leading coefficient. over a binary field that's - // always going to be 1. - - $q = chr(0); - $d = static::deg($y); - $r = $x; - while (($degr = static::deg($r)) >= $d) { - $s = '1' . str_repeat('0', $degr - $d); - $s = BinaryField::base2ToBase256($s); - $length = max(strlen($s), strlen($q)); - $q = !isset($q) ? $s : - str_pad($q, $length, "\0", STR_PAD_LEFT) ^ - str_pad($s, $length, "\0", STR_PAD_LEFT); - $s = static::polynomialMultiply($s, $y); - $length = max(strlen($r), strlen($s)); - $r = str_pad($r, $length, "\0", STR_PAD_LEFT) ^ - str_pad($s, $length, "\0", STR_PAD_LEFT); - } - - return [ltrim($q, "\0"), ltrim($r, "\0")]; - } - - /** - * Perform polynomial multiplation in the traditional way - * - * @return string - * @link https://en.wikipedia.org/wiki/Finite_field_arithmetic#Multiplication - */ - private static function regularPolynomialMultiply($x, $y) - { - $precomputed = [ltrim($x, "\0")]; - $x = strrev(BinaryField::base256ToBase2($x)); - $y = strrev(BinaryField::base256ToBase2($y)); - if (strlen($x) == strlen($y)) { - $length = strlen($x); - } else { - $length = max(strlen($x), strlen($y)); - $x = str_pad($x, $length, '0'); - $y = str_pad($y, $length, '0'); - } - $result = str_repeat('0', 2 * $length - 1); - $result = BinaryField::base2ToBase256($result); - $size = strlen($result); - $x = strrev($x); - - // precompute left shift 1 through 7 - for ($i = 1; $i < 8; $i++) { - $precomputed[$i] = BinaryField::base2ToBase256($x . str_repeat('0', $i)); - } - for ($i = 0; $i < strlen($y); $i++) { - if ($y[$i] == '1') { - $temp = $precomputed[$i & 7] . str_repeat("\0", $i >> 3); - $result ^= str_pad($temp, $size, "\0", STR_PAD_LEFT); - } - } - - return $result; - } - - /** - * Perform polynomial multiplation - * - * Uses karatsuba multiplication to reduce x-bit multiplications to a series of 32-bit multiplications - * - * @return string - * @link https://en.wikipedia.org/wiki/Karatsuba_algorithm - */ - private static function polynomialMultiply($x, $y) - { - if (strlen($x) == strlen($y)) { - $length = strlen($x); - } else { - $length = max(strlen($x), strlen($y)); - $x = str_pad($x, $length, "\0", STR_PAD_LEFT); - $y = str_pad($y, $length, "\0", STR_PAD_LEFT); - } - - switch (true) { - case PHP_INT_SIZE == 8 && $length <= 4: - return $length != 4 ? - self::subMultiply(str_pad($x, 4, "\0", STR_PAD_LEFT), str_pad($y, 4, "\0", STR_PAD_LEFT)) : - self::subMultiply($x, $y); - case PHP_INT_SIZE == 4 || $length > 32: - return self::regularPolynomialMultiply($x, $y); - } - - $m = $length >> 1; - - $x1 = substr($x, 0, -$m); - $x0 = substr($x, -$m); - $y1 = substr($y, 0, -$m); - $y0 = substr($y, -$m); - - $z2 = self::polynomialMultiply($x1, $y1); - $z0 = self::polynomialMultiply($x0, $y0); - $z1 = self::polynomialMultiply( - self::subAdd2($x1, $x0), - self::subAdd2($y1, $y0) - ); - - $z1 = self::subAdd3($z1, $z2, $z0); - - $xy = self::subAdd3( - $z2 . str_repeat("\0", 2 * $m), - $z1 . str_repeat("\0", $m), - $z0 - ); - - return ltrim($xy, "\0"); - } - - /** - * Perform polynomial multiplication on 2x 32-bit numbers, returning - * a 64-bit number - * - * @param string $x - * @param string $y - * @return string - * @link https://www.bearssl.org/constanttime.html#ghash-for-gcm - */ - private static function subMultiply($x, $y) - { - $x = unpack('N', $x)[1]; - $y = unpack('N', $y)[1]; - - $x0 = $x & 0x11111111; - $x1 = $x & 0x22222222; - $x2 = $x & 0x44444444; - $x3 = $x & 0x88888888; - - $y0 = $y & 0x11111111; - $y1 = $y & 0x22222222; - $y2 = $y & 0x44444444; - $y3 = $y & 0x88888888; - - $z0 = ($x0 * $y0) ^ ($x1 * $y3) ^ ($x2 * $y2) ^ ($x3 * $y1); - $z1 = ($x0 * $y1) ^ ($x1 * $y0) ^ ($x2 * $y3) ^ ($x3 * $y2); - $z2 = ($x0 * $y2) ^ ($x1 * $y1) ^ ($x2 * $y0) ^ ($x3 * $y3); - $z3 = ($x0 * $y3) ^ ($x1 * $y2) ^ ($x2 * $y1) ^ ($x3 * $y0); - - $z0 &= 0x1111111111111111; - $z1 &= 0x2222222222222222; - $z2 &= 0x4444444444444444; - $z3 &= -8608480567731124088; // 0x8888888888888888 gets interpreted as a float - - $z = $z0 | $z1 | $z2 | $z3; - - return pack('J', $z); - } - - /** - * Adds two numbers - * - * @param string $x - * @param string $y - * @return string - */ - private static function subAdd2($x, $y) - { - $length = max(strlen($x), strlen($y)); - $x = str_pad($x, $length, "\0", STR_PAD_LEFT); - $y = str_pad($y, $length, "\0", STR_PAD_LEFT); - return $x ^ $y; - } - - /** - * Adds three numbers - * - * @param string $x - * @param string $y - * @return string - */ - private static function subAdd3($x, $y, $z) - { - $length = max(strlen($x), strlen($y), strlen($z)); - $x = str_pad($x, $length, "\0", STR_PAD_LEFT); - $y = str_pad($y, $length, "\0", STR_PAD_LEFT); - $z = str_pad($z, $length, "\0", STR_PAD_LEFT); - return $x ^ $y ^ $z; - } - - /** - * Adds two BinaryFieldIntegers. - * - * @return static - */ - public function add(self $y) - { - static::checkInstance($this, $y); - - $length = strlen(static::$modulo[$this->instanceID]); - - $x = str_pad($this->value, $length, "\0", STR_PAD_LEFT); - $y = str_pad($y->value, $length, "\0", STR_PAD_LEFT); - - return new static($this->instanceID, $x ^ $y); - } - - /** - * Subtracts two BinaryFieldIntegers. - * - * @return static - */ - public function subtract(self $x) - { - return $this->add($x); - } - - /** - * Multiplies two BinaryFieldIntegers. - * - * @return static - */ - public function multiply(self $y) - { - static::checkInstance($this, $y); - - return new static($this->instanceID, static::polynomialMultiply($this->value, $y->value)); - } - - /** - * Returns the modular inverse of a BinaryFieldInteger - * - * @return static - */ - public function modInverse() - { - $remainder0 = static::$modulo[$this->instanceID]; - $remainder1 = $this->value; - - if ($remainder1 == '') { - return new static($this->instanceID); - } - - $aux0 = "\0"; - $aux1 = "\1"; - while ($remainder1 != "\1") { - list($q, $r) = static::polynomialDivide($remainder0, $remainder1); - $remainder0 = $remainder1; - $remainder1 = $r; - // the auxiliary in row n is given by the sum of the auxiliary in - // row n-2 and the product of the quotient and the auxiliary in row - // n-1 - $temp = static::polynomialMultiply($aux1, $q); - $aux = str_pad($aux0, strlen($temp), "\0", STR_PAD_LEFT) ^ - str_pad($temp, strlen($aux0), "\0", STR_PAD_LEFT); - $aux0 = $aux1; - $aux1 = $aux; - } - - $temp = new static($this->instanceID); - $temp->value = ltrim($aux1, "\0"); - return $temp; - } - - /** - * Divides two PrimeFieldIntegers. - * - * @return static - */ - public function divide(self $x) - { - static::checkInstance($this, $x); - - $x = $x->modInverse(); - return $this->multiply($x); - } - - /** - * Negate - * - * A negative number can be written as 0-12. With modulos, 0 is the same thing as the modulo - * so 0-12 is the same thing as modulo-12 - * - * @return object - */ - public function negate() - { - $x = str_pad($this->value, strlen(static::$modulo[$this->instanceID]), "\0", STR_PAD_LEFT); - - return new static($this->instanceID, $x ^ static::$modulo[$this->instanceID]); - } - - /** - * Returns the modulo - * - * @return string - */ - public static function getModulo($instanceID) - { - return static::$modulo[$instanceID]; - } - - /** - * Converts an Integer to a byte string (eg. base-256). - * - * @return string - */ - public function toBytes() - { - return str_pad($this->value, strlen(static::$modulo[$this->instanceID]), "\0", STR_PAD_LEFT); - } - - /** - * Converts an Integer to a hex string (eg. base-16). - * - * @return string - */ - public function toHex() - { - return Strings::bin2hex($this->toBytes()); - } - - /** - * Converts an Integer to a bit string (eg. base-2). - * - * @return string - */ - public function toBits() - { - //return str_pad(BinaryField::base256ToBase2($this->value), strlen(static::$modulo[$this->instanceID]), '0', STR_PAD_LEFT); - return BinaryField::base256ToBase2($this->value); - } - - /** - * Converts an Integer to a BigInteger - * - * @return string - */ - public function toBigInteger() - { - return new BigInteger($this->value, 256); - } - - /** - * __toString() magic method - * - */ - public function __toString() - { - return (string) $this->toBigInteger(); - } - - /** - * __debugInfo() magic method - * - */ - public function __debugInfo() - { - return ['value' => $this->toHex()]; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/Common/FiniteField.php b/composer/phpseclib/phpseclib/phpseclib/Math/Common/FiniteField.php deleted file mode 100644 index 15945d1..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Math/Common/FiniteField.php +++ /dev/null @@ -1,22 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Math\Common; - -/** - * Finite Fields - * - * @author Jim Wigginton - */ -abstract class FiniteField -{ -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/Common/FiniteField/Integer.php b/composer/phpseclib/phpseclib/phpseclib/Math/Common/FiniteField/Integer.php deleted file mode 100644 index 247d00f..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Math/Common/FiniteField/Integer.php +++ /dev/null @@ -1,44 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Math\Common\FiniteField; - -/** - * Finite Field Integer - * - * @author Jim Wigginton - */ -abstract class Integer implements \JsonSerializable -{ - /** - * JSON Serialize - * - * Will be called, automatically, when json_encode() is called on a BigInteger object. - * - * PHP Serialize isn't supported because unserializing would require the factory be - * serialized as well and that just sounds like too much - * - * @return array{hex: string} - */ - #[\ReturnTypeWillChange] - public function jsonSerialize() - { - return ['hex' => $this->toHex(true)]; - } - - /** - * Converts an Integer to a hex string (eg. base-16). - * - * @return string - */ - abstract public function toHex(); -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/PrimeField.php b/composer/phpseclib/phpseclib/phpseclib/Math/PrimeField.php deleted file mode 100644 index fc4f16f..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Math/PrimeField.php +++ /dev/null @@ -1,118 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://pear.php.net/package/Math_BigInteger - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Math; - -use OCA\Libresign\Vendor\phpseclib3\Math\Common\FiniteField; -use OCA\Libresign\Vendor\phpseclib3\Math\PrimeField\Integer; - -/** - * Prime Finite Fields - * - * @author Jim Wigginton - */ -class PrimeField extends FiniteField -{ - /** - * Instance Counter - * - * @var int - */ - private static $instanceCounter = 0; - - /** - * Keeps track of current instance - * - * @var int - */ - protected $instanceID; - - /** - * Default constructor - */ - public function __construct(BigInteger $modulo) - { - if (!$modulo->isPrime()) { - throw new \UnexpectedValueException('PrimeField requires a prime number be passed to the constructor'); - } - - $this->instanceID = self::$instanceCounter++; - Integer::setModulo($this->instanceID, $modulo); - Integer::setRecurringModuloFunction($this->instanceID, $modulo->createRecurringModuloFunction()); - } - - /** - * Use a custom defined modular reduction function - * - * @return void - */ - public function setReduction(\Closure $func) - { - $this->reduce = $func->bindTo($this, $this); - } - - /** - * Returns an instance of a dynamically generated PrimeFieldInteger class - * - * @return Integer - */ - public function newInteger(BigInteger $num) - { - return new Integer($this->instanceID, $num); - } - - /** - * Returns an integer on the finite field between one and the prime modulo - * - * @return Integer - */ - public function randomInteger() - { - static $one; - if (!isset($one)) { - $one = new BigInteger(1); - } - - return new Integer($this->instanceID, BigInteger::randomRange($one, Integer::getModulo($this->instanceID))); - } - - /** - * Returns the length of the modulo in bytes - * - * @return int - */ - public function getLengthInBytes() - { - return Integer::getModulo($this->instanceID)->getLengthInBytes(); - } - - /** - * Returns the length of the modulo in bits - * - * @return int - */ - public function getLength() - { - return Integer::getModulo($this->instanceID)->getLength(); - } - - /** - * Destructor - */ - public function __destruct() - { - Integer::cleanupCache($this->instanceID); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Math/PrimeField/Integer.php b/composer/phpseclib/phpseclib/phpseclib/Math/PrimeField/Integer.php deleted file mode 100644 index 99f4e15..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Math/PrimeField/Integer.php +++ /dev/null @@ -1,442 +0,0 @@ - - * @copyright 2017 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Math\PrimeField; - -use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -use OCA\Libresign\Vendor\phpseclib3\Math\Common\FiniteField\Integer as Base; - -/** - * Prime Finite Fields - * - * @author Jim Wigginton - */ -class Integer extends Base -{ - /** - * Holds the PrimeField's value - * - * @var BigInteger - */ - protected $value; - - /** - * Keeps track of current instance - * - * @var int - */ - protected $instanceID; - - /** - * Holds the PrimeField's modulo - * - * @var array - */ - protected static $modulo; - - /** - * Holds a pre-generated function to perform modulo reductions - * - * @var array - */ - protected static $reduce; - - /** - * Zero - * - * @var BigInteger[] - */ - protected static $zero; - - /** - * One - * - * @var BigInteger[] - */ - protected static $one; - - /** - * Two - * - * @var BigInteger[] - */ - protected static $two; - - /** - * Default constructor - * - * @param int $instanceID - * @param BigInteger $num - */ - public function __construct($instanceID, $num = null) - { - $this->instanceID = $instanceID; - if (!isset($num)) { - $this->value = clone static::$zero[$instanceID]; - } else { - $reduce = static::$reduce[$instanceID]; - $this->value = $reduce($num); - } - } - - /** - * Set the modulo for a given instance - * - * @param int $instanceID - * @return void - */ - public static function setModulo($instanceID, BigInteger $modulo) - { - static::$modulo[$instanceID] = $modulo; - } - - /** - * Set the modulo for a given instance - * - * @param int $instanceID - * @return void - */ - public static function setRecurringModuloFunction($instanceID, callable $function) - { - static::$reduce[$instanceID] = $function; - if (!isset(static::$zero[$instanceID])) { - static::$zero[$instanceID] = new BigInteger(); - } - } - - /** - * Delete the modulo for a given instance - */ - public static function cleanupCache($instanceID) - { - unset(static::$modulo[$instanceID]); - unset(static::$reduce[$instanceID]); - unset(static::$zero[$instanceID]); - unset(static::$one[$instanceID]); - unset(static::$two[$instanceID]); - } - - /** - * Returns the modulo - * - * @param int $instanceID - * @return BigInteger - */ - public static function getModulo($instanceID) - { - return static::$modulo[$instanceID]; - } - - /** - * Tests a parameter to see if it's of the right instance - * - * Throws an exception if the incorrect class is being utilized - * - * @return void - */ - public static function checkInstance(self $x, self $y) - { - if ($x->instanceID != $y->instanceID) { - throw new \UnexpectedValueException('The instances of the two PrimeField\Integer objects do not match'); - } - } - - /** - * Tests the equality of two numbers. - * - * @return bool - */ - public function equals(self $x) - { - static::checkInstance($this, $x); - - return $this->value->equals($x->value); - } - - /** - * Compares two numbers. - * - * @return int - */ - public function compare(self $x) - { - static::checkInstance($this, $x); - - return $this->value->compare($x->value); - } - - /** - * Adds two PrimeFieldIntegers. - * - * @return static - */ - public function add(self $x) - { - static::checkInstance($this, $x); - - $temp = new static($this->instanceID); - $temp->value = $this->value->add($x->value); - if ($temp->value->compare(static::$modulo[$this->instanceID]) >= 0) { - $temp->value = $temp->value->subtract(static::$modulo[$this->instanceID]); - } - - return $temp; - } - - /** - * Subtracts two PrimeFieldIntegers. - * - * @return static - */ - public function subtract(self $x) - { - static::checkInstance($this, $x); - - $temp = new static($this->instanceID); - $temp->value = $this->value->subtract($x->value); - if ($temp->value->isNegative()) { - $temp->value = $temp->value->add(static::$modulo[$this->instanceID]); - } - - return $temp; - } - - /** - * Multiplies two PrimeFieldIntegers. - * - * @return static - */ - public function multiply(self $x) - { - static::checkInstance($this, $x); - - return new static($this->instanceID, $this->value->multiply($x->value)); - } - - /** - * Divides two PrimeFieldIntegers. - * - * @return static - */ - public function divide(self $x) - { - static::checkInstance($this, $x); - - $denominator = $x->value->modInverse(static::$modulo[$this->instanceID]); - return new static($this->instanceID, $this->value->multiply($denominator)); - } - - /** - * Performs power operation on a PrimeFieldInteger. - * - * @return static - */ - public function pow(BigInteger $x) - { - $temp = new static($this->instanceID); - $temp->value = $this->value->powMod($x, static::$modulo[$this->instanceID]); - - return $temp; - } - - /** - * Calculates the square root - * - * @link https://en.wikipedia.org/wiki/Tonelli%E2%80%93Shanks_algorithm - * @return static|false - */ - public function squareRoot() - { - if (!isset(static::$one[$this->instanceID])) { - static::$one[$this->instanceID] = new BigInteger(1); - static::$two[$this->instanceID] = new BigInteger(2); - } - $one = &static::$one[$this->instanceID]; - $two = &static::$two[$this->instanceID]; - $modulo = &static::$modulo[$this->instanceID]; - $reduce = &static::$reduce[$this->instanceID]; - - $p_1 = $modulo->subtract($one); - $q = clone $p_1; - $s = BigInteger::scan1divide($q); - list($pow) = $p_1->divide($two); - for ($z = $one; !$z->equals($modulo); $z = $z->add($one)) { - $temp = $z->powMod($pow, $modulo); - if ($temp->equals($p_1)) { - break; - } - } - - $m = new BigInteger($s); - $c = $z->powMod($q, $modulo); - $t = $this->value->powMod($q, $modulo); - list($temp) = $q->add($one)->divide($two); - $r = $this->value->powMod($temp, $modulo); - - while (!$t->equals($one)) { - for ($i = clone $one; $i->compare($m) < 0; $i = $i->add($one)) { - if ($t->powMod($two->pow($i), $modulo)->equals($one)) { - break; - } - } - - if ($i->compare($m) == 0) { - return false; - } - $b = $c->powMod($two->pow($m->subtract($i)->subtract($one)), $modulo); - $m = $i; - $c = $reduce($b->multiply($b)); - $t = $reduce($t->multiply($c)); - $r = $reduce($r->multiply($b)); - } - - return new static($this->instanceID, $r); - } - - /** - * Is Odd? - * - * @return bool - */ - public function isOdd() - { - return $this->value->isOdd(); - } - - /** - * Negate - * - * A negative number can be written as 0-12. With modulos, 0 is the same thing as the modulo - * so 0-12 is the same thing as modulo-12 - * - * @return static - */ - public function negate() - { - return new static($this->instanceID, static::$modulo[$this->instanceID]->subtract($this->value)); - } - - /** - * Converts an Integer to a byte string (eg. base-256). - * - * @return string - */ - public function toBytes() - { - if (isset(static::$modulo[$this->instanceID])) { - $length = static::$modulo[$this->instanceID]->getLengthInBytes(); - return str_pad($this->value->toBytes(), $length, "\0", STR_PAD_LEFT); - } - return $this->value->toBytes(); - } - - /** - * Converts an Integer to a hex string (eg. base-16). - * - * @return string - */ - public function toHex() - { - return Strings::bin2hex($this->toBytes()); - } - - /** - * Converts an Integer to a bit string (eg. base-2). - * - * @return string - */ - public function toBits() - { - // return $this->value->toBits(); - static $length; - if (!isset($length)) { - $length = static::$modulo[$this->instanceID]->getLength(); - } - - return str_pad($this->value->toBits(), $length, '0', STR_PAD_LEFT); - } - - /** - * Returns the w-ary non-adjacent form (wNAF) - * - * @param int $w optional - * @return array - */ - public function getNAF($w = 1) - { - $w++; - - $zero = &static::$zero[$this->instanceID]; - - $mask = new BigInteger((1 << $w) - 1); - $sub = new BigInteger(1 << $w); - //$sub = new BigInteger(1 << ($w - 1)); - $d = $this->toBigInteger(); - $d_i = []; - - $i = 0; - while ($d->compare($zero) > 0) { - if ($d->isOdd()) { - // start mods - - $bigInteger = $d->testBit($w - 1) ? - $d->bitwise_and($mask)->subtract($sub) : - //$sub->subtract($d->bitwise_and($mask)) : - $d->bitwise_and($mask); - // end mods - $d = $d->subtract($bigInteger); - $d_i[$i] = (int) $bigInteger->toString(); - } else { - $d_i[$i] = 0; - } - $shift = !$d->equals($zero) && $d->bitwise_and($mask)->equals($zero) ? $w : 1; // $w or $w + 1? - $d = $d->bitwise_rightShift($shift); - while (--$shift > 0) { - $d_i[++$i] = 0; - } - $i++; - } - - return $d_i; - } - - /** - * Converts an Integer to a BigInteger - * - * @return BigInteger - */ - public function toBigInteger() - { - return clone $this->value; - } - - /** - * __toString() magic method - * - * @return string - */ - public function __toString() - { - return (string) $this->value; - } - - /** - * __debugInfo() magic method - * - * @return array - */ - public function __debugInfo() - { - return ['value' => $this->toHex()]; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Net/SFTP.php b/composer/phpseclib/phpseclib/phpseclib/Net/SFTP.php deleted file mode 100644 index 6c503e7..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Net/SFTP.php +++ /dev/null @@ -1,3790 +0,0 @@ - - * login('username', 'password')) { - * exit('Login Failed'); - * } - * - * echo $sftp->pwd() . "\r\n"; - * $sftp->put('filename.ext', 'hello, world!'); - * print_r($sftp->nlist()); - * ?> - * - * - * @author Jim Wigginton - * @copyright 2009 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Net; - -use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; -use OCA\Libresign\Vendor\phpseclib3\Exception\FileNotFoundException; - -/** - * Pure-PHP implementations of SFTP. - * - * @author Jim Wigginton - */ -class SFTP extends SSH2 -{ - /** - * SFTP channel constant - * - * \phpseclib3\Net\SSH2::exec() uses 0 and \phpseclib3\Net\SSH2::read() / \phpseclib3\Net\SSH2::write() use 1. - * - * @see \phpseclib3\Net\SSH2::send_channel_packet() - * @see \phpseclib3\Net\SSH2::get_channel_packet() - */ - const CHANNEL = 0x100; - - /** - * Reads data from a local file. - * - * @see \phpseclib3\Net\SFTP::put() - */ - const SOURCE_LOCAL_FILE = 1; - /** - * Reads data from a string. - * - * @see \phpseclib3\Net\SFTP::put() - */ - // this value isn't really used anymore but i'm keeping it reserved for historical reasons - const SOURCE_STRING = 2; - /** - * Reads data from callback: - * function callback($length) returns string to proceed, null for EOF - * - * @see \phpseclib3\Net\SFTP::put() - */ - const SOURCE_CALLBACK = 16; - /** - * Resumes an upload - * - * @see \phpseclib3\Net\SFTP::put() - */ - const RESUME = 4; - /** - * Append a local file to an already existing remote file - * - * @see \phpseclib3\Net\SFTP::put() - */ - const RESUME_START = 8; - - /** - * Packet Types - * - * @see self::__construct() - * @var array - * @access private - */ - private static $packet_types = []; - - /** - * Status Codes - * - * @see self::__construct() - * @var array - * @access private - */ - private static $status_codes = []; - - /** @var array */ - private static $attributes; - - /** @var array */ - private static $open_flags; - - /** @var array */ - private static $open_flags5; - - /** @var array */ - private static $file_types; - - /** - * The Request ID - * - * The request ID exists in the off chance that a packet is sent out-of-order. Of course, this library doesn't support - * concurrent actions, so it's somewhat academic, here. - * - * @var boolean - * @see self::_send_sftp_packet() - */ - private $use_request_id = false; - - /** - * The Packet Type - * - * The request ID exists in the off chance that a packet is sent out-of-order. Of course, this library doesn't support - * concurrent actions, so it's somewhat academic, here. - * - * @var int - * @see self::_get_sftp_packet() - */ - private $packet_type = -1; - - /** - * Packet Buffer - * - * @var string - * @see self::_get_sftp_packet() - */ - private $packet_buffer = ''; - - /** - * Extensions supported by the server - * - * @var array - * @see self::_initChannel() - */ - private $extensions = []; - - /** - * Server SFTP version - * - * @var int - * @see self::_initChannel() - */ - private $version; - - /** - * Default Server SFTP version - * - * @var int - * @see self::_initChannel() - */ - private $defaultVersion; - - /** - * Preferred SFTP version - * - * @var int - * @see self::_initChannel() - */ - private $preferredVersion = 3; - - /** - * Current working directory - * - * @var string|bool - * @see self::realpath() - * @see self::chdir() - */ - private $pwd = false; - - /** - * Packet Type Log - * - * @see self::getLog() - * @var array - */ - private $packet_type_log = []; - - /** - * Packet Log - * - * @see self::getLog() - * @var array - */ - private $packet_log = []; - - /** - * Real-time log file pointer - * - * @see self::_append_log() - * @var resource|closed-resource - */ - private $realtime_log_file; - - /** - * Real-time log file size - * - * @see self::_append_log() - * @var int - */ - private $realtime_log_size; - - /** - * Real-time log file wrap boolean - * - * @see self::_append_log() - * @var bool - */ - private $realtime_log_wrap; - - /** - * Current log size - * - * Should never exceed self::LOG_MAX_SIZE - * - * @var int - */ - private $log_size; - - /** - * Error information - * - * @see self::getSFTPErrors() - * @see self::getLastSFTPError() - * @var array - */ - private $sftp_errors = []; - - /** - * Stat Cache - * - * Rather than always having to open a directory and close it immediately there after to see if a file is a directory - * we'll cache the results. - * - * @see self::_update_stat_cache() - * @see self::_remove_from_stat_cache() - * @see self::_query_stat_cache() - * @var array - */ - private $stat_cache = []; - - /** - * Max SFTP Packet Size - * - * @see self::__construct() - * @see self::get() - * @var int - */ - private $max_sftp_packet; - - /** - * Stat Cache Flag - * - * @see self::disableStatCache() - * @see self::enableStatCache() - * @var bool - */ - private $use_stat_cache = true; - - /** - * Sort Options - * - * @see self::_comparator() - * @see self::setListOrder() - * @var array - */ - protected $sortOptions = []; - - /** - * Canonicalization Flag - * - * Determines whether or not paths should be canonicalized before being - * passed on to the remote server. - * - * @see self::enablePathCanonicalization() - * @see self::disablePathCanonicalization() - * @see self::realpath() - * @var bool - */ - private $canonicalize_paths = true; - - /** - * Request Buffers - * - * @see self::_get_sftp_packet() - * @var array - */ - private $requestBuffer = []; - - /** - * Preserve timestamps on file downloads / uploads - * - * @see self::get() - * @see self::put() - * @var bool - */ - private $preserveTime = false; - - /** - * Arbitrary Length Packets Flag - * - * Determines whether or not packets of any length should be allowed, - * in cases where the server chooses the packet length (such as - * directory listings). By default, packets are only allowed to be - * 256 * 1024 bytes (SFTP_MAX_MSG_LENGTH from OpenSSH's sftp-common.h) - * - * @see self::enableArbitraryLengthPackets() - * @see self::_get_sftp_packet() - * @var bool - */ - private $allow_arbitrary_length_packets = false; - - /** - * Was the last packet due to the channels being closed or not? - * - * @see self::get() - * @see self::get_sftp_packet() - * @var bool - */ - private $channel_close = false; - - /** - * Has the SFTP channel been partially negotiated? - * - * @var bool - */ - private $partial_init = false; - - /** - * Default Constructor. - * - * Connects to an SFTP server - * - * $host can either be a string, representing the host, or a stream resource. - * - * @param mixed $host - * @param int $port - * @param int $timeout - */ - public function __construct($host, $port = 22, $timeout = 10) - { - parent::__construct($host, $port, $timeout); - - $this->max_sftp_packet = 1 << 15; - - if (empty(self::$packet_types)) { - self::$packet_types = [ - 1 => 'NET_SFTP_INIT', - 2 => 'NET_SFTP_VERSION', - 3 => 'NET_SFTP_OPEN', - 4 => 'NET_SFTP_CLOSE', - 5 => 'NET_SFTP_READ', - 6 => 'NET_SFTP_WRITE', - 7 => 'NET_SFTP_LSTAT', - 9 => 'NET_SFTP_SETSTAT', - 10 => 'NET_SFTP_FSETSTAT', - 11 => 'NET_SFTP_OPENDIR', - 12 => 'NET_SFTP_READDIR', - 13 => 'NET_SFTP_REMOVE', - 14 => 'NET_SFTP_MKDIR', - 15 => 'NET_SFTP_RMDIR', - 16 => 'NET_SFTP_REALPATH', - 17 => 'NET_SFTP_STAT', - 18 => 'NET_SFTP_RENAME', - 19 => 'NET_SFTP_READLINK', - 20 => 'NET_SFTP_SYMLINK', - 21 => 'NET_SFTP_LINK', - - 101 => 'NET_SFTP_STATUS', - 102 => 'NET_SFTP_HANDLE', - 103 => 'NET_SFTP_DATA', - 104 => 'NET_SFTP_NAME', - 105 => 'NET_SFTP_ATTRS', - - 200 => 'NET_SFTP_EXTENDED', - 201 => 'NET_SFTP_EXTENDED_REPLY' - ]; - self::$status_codes = [ - 0 => 'NET_SFTP_STATUS_OK', - 1 => 'NET_SFTP_STATUS_EOF', - 2 => 'NET_SFTP_STATUS_NO_SUCH_FILE', - 3 => 'NET_SFTP_STATUS_PERMISSION_DENIED', - 4 => 'NET_SFTP_STATUS_FAILURE', - 5 => 'NET_SFTP_STATUS_BAD_MESSAGE', - 6 => 'NET_SFTP_STATUS_NO_CONNECTION', - 7 => 'NET_SFTP_STATUS_CONNECTION_LOST', - 8 => 'NET_SFTP_STATUS_OP_UNSUPPORTED', - 9 => 'NET_SFTP_STATUS_INVALID_HANDLE', - 10 => 'NET_SFTP_STATUS_NO_SUCH_PATH', - 11 => 'NET_SFTP_STATUS_FILE_ALREADY_EXISTS', - 12 => 'NET_SFTP_STATUS_WRITE_PROTECT', - 13 => 'NET_SFTP_STATUS_NO_MEDIA', - 14 => 'NET_SFTP_STATUS_NO_SPACE_ON_FILESYSTEM', - 15 => 'NET_SFTP_STATUS_QUOTA_EXCEEDED', - 16 => 'NET_SFTP_STATUS_UNKNOWN_PRINCIPAL', - 17 => 'NET_SFTP_STATUS_LOCK_CONFLICT', - 18 => 'NET_SFTP_STATUS_DIR_NOT_EMPTY', - 19 => 'NET_SFTP_STATUS_NOT_A_DIRECTORY', - 20 => 'NET_SFTP_STATUS_INVALID_FILENAME', - 21 => 'NET_SFTP_STATUS_LINK_LOOP', - 22 => 'NET_SFTP_STATUS_CANNOT_DELETE', - 23 => 'NET_SFTP_STATUS_INVALID_PARAMETER', - 24 => 'NET_SFTP_STATUS_FILE_IS_A_DIRECTORY', - 25 => 'NET_SFTP_STATUS_BYTE_RANGE_LOCK_CONFLICT', - 26 => 'NET_SFTP_STATUS_BYTE_RANGE_LOCK_REFUSED', - 27 => 'NET_SFTP_STATUS_DELETE_PENDING', - 28 => 'NET_SFTP_STATUS_FILE_CORRUPT', - 29 => 'NET_SFTP_STATUS_OWNER_INVALID', - 30 => 'NET_SFTP_STATUS_GROUP_INVALID', - 31 => 'NET_SFTP_STATUS_NO_MATCHING_BYTE_RANGE_LOCK' - ]; - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-7.1 - // the order, in this case, matters quite a lot - see \phpseclib3\Net\SFTP::_parseAttributes() to understand why - self::$attributes = [ - 0x00000001 => 'NET_SFTP_ATTR_SIZE', - 0x00000002 => 'NET_SFTP_ATTR_UIDGID', // defined in SFTPv3, removed in SFTPv4+ - 0x00000080 => 'NET_SFTP_ATTR_OWNERGROUP', // defined in SFTPv4+ - 0x00000004 => 'NET_SFTP_ATTR_PERMISSIONS', - 0x00000008 => 'NET_SFTP_ATTR_ACCESSTIME', - 0x00000010 => 'NET_SFTP_ATTR_CREATETIME', // SFTPv4+ - 0x00000020 => 'NET_SFTP_ATTR_MODIFYTIME', - 0x00000040 => 'NET_SFTP_ATTR_ACL', - 0x00000100 => 'NET_SFTP_ATTR_SUBSECOND_TIMES', - 0x00000200 => 'NET_SFTP_ATTR_BITS', // SFTPv5+ - 0x00000400 => 'NET_SFTP_ATTR_ALLOCATION_SIZE', // SFTPv6+ - 0x00000800 => 'NET_SFTP_ATTR_TEXT_HINT', - 0x00001000 => 'NET_SFTP_ATTR_MIME_TYPE', - 0x00002000 => 'NET_SFTP_ATTR_LINK_COUNT', - 0x00004000 => 'NET_SFTP_ATTR_UNTRANSLATED_NAME', - 0x00008000 => 'NET_SFTP_ATTR_CTIME', - // 0x80000000 will yield a floating point on 32-bit systems and converting floating points to integers - // yields inconsistent behavior depending on how php is compiled. so we left shift -1 (which, in - // two's compliment, consists of all 1 bits) by 31. on 64-bit systems this'll yield 0xFFFFFFFF80000000. - // that's not a problem, however, and 'anded' and a 32-bit number, as all the leading 1 bits are ignored. - (PHP_INT_SIZE == 4 ? (-1 << 31) : 0x80000000) => 'NET_SFTP_ATTR_EXTENDED' - ]; - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-04#section-6.3 - // the flag definitions change somewhat in SFTPv5+. if SFTPv5+ support is added to this library, maybe name - // the array for that $this->open5_flags and similarly alter the constant names. - self::$open_flags = [ - 0x00000001 => 'NET_SFTP_OPEN_READ', - 0x00000002 => 'NET_SFTP_OPEN_WRITE', - 0x00000004 => 'NET_SFTP_OPEN_APPEND', - 0x00000008 => 'NET_SFTP_OPEN_CREATE', - 0x00000010 => 'NET_SFTP_OPEN_TRUNCATE', - 0x00000020 => 'NET_SFTP_OPEN_EXCL', - 0x00000040 => 'NET_SFTP_OPEN_TEXT' // defined in SFTPv4 - ]; - // SFTPv5+ changed the flags up: - // https://datatracker.ietf.org/doc/html/draft-ietf-secsh-filexfer-13#section-8.1.1.3 - self::$open_flags5 = [ - // when SSH_FXF_ACCESS_DISPOSITION is a 3 bit field that controls how the file is opened - 0x00000000 => 'NET_SFTP_OPEN_CREATE_NEW', - 0x00000001 => 'NET_SFTP_OPEN_CREATE_TRUNCATE', - 0x00000002 => 'NET_SFTP_OPEN_OPEN_EXISTING', - 0x00000003 => 'NET_SFTP_OPEN_OPEN_OR_CREATE', - 0x00000004 => 'NET_SFTP_OPEN_TRUNCATE_EXISTING', - // the rest of the flags are not supported - 0x00000008 => 'NET_SFTP_OPEN_APPEND_DATA', // "the offset field of SS_FXP_WRITE requests is ignored" - 0x00000010 => 'NET_SFTP_OPEN_APPEND_DATA_ATOMIC', - 0x00000020 => 'NET_SFTP_OPEN_TEXT_MODE', - 0x00000040 => 'NET_SFTP_OPEN_BLOCK_READ', - 0x00000080 => 'NET_SFTP_OPEN_BLOCK_WRITE', - 0x00000100 => 'NET_SFTP_OPEN_BLOCK_DELETE', - 0x00000200 => 'NET_SFTP_OPEN_BLOCK_ADVISORY', - 0x00000400 => 'NET_SFTP_OPEN_NOFOLLOW', - 0x00000800 => 'NET_SFTP_OPEN_DELETE_ON_CLOSE', - 0x00001000 => 'NET_SFTP_OPEN_ACCESS_AUDIT_ALARM_INFO', - 0x00002000 => 'NET_SFTP_OPEN_ACCESS_BACKUP', - 0x00004000 => 'NET_SFTP_OPEN_BACKUP_STREAM', - 0x00008000 => 'NET_SFTP_OPEN_OVERRIDE_OWNER', - ]; - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-04#section-5.2 - // see \phpseclib3\Net\SFTP::_parseLongname() for an explanation - self::$file_types = [ - 1 => 'NET_SFTP_TYPE_REGULAR', - 2 => 'NET_SFTP_TYPE_DIRECTORY', - 3 => 'NET_SFTP_TYPE_SYMLINK', - 4 => 'NET_SFTP_TYPE_SPECIAL', - 5 => 'NET_SFTP_TYPE_UNKNOWN', - // the following types were first defined for use in SFTPv5+ - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-05#section-5.2 - 6 => 'NET_SFTP_TYPE_SOCKET', - 7 => 'NET_SFTP_TYPE_CHAR_DEVICE', - 8 => 'NET_SFTP_TYPE_BLOCK_DEVICE', - 9 => 'NET_SFTP_TYPE_FIFO' - ]; - self::define_array( - self::$packet_types, - self::$status_codes, - self::$attributes, - self::$open_flags, - self::$open_flags5, - self::$file_types - ); - } - - if (!defined('NET_SFTP_QUEUE_SIZE')) { - define('NET_SFTP_QUEUE_SIZE', 32); - } - if (!defined('NET_SFTP_UPLOAD_QUEUE_SIZE')) { - define('NET_SFTP_UPLOAD_QUEUE_SIZE', 1024); - } - } - - /** - * Check a few things before SFTP functions are called - * - * @return bool - */ - private function precheck() - { - if (!($this->bitmap & SSH2::MASK_LOGIN)) { - return false; - } - - if ($this->pwd === false) { - return $this->init_sftp_connection(); - } - - return true; - } - - /** - * Partially initialize an SFTP connection - * - * @throws \UnexpectedValueException on receipt of unexpected packets - * @return bool - */ - private function partial_init_sftp_connection() - { - $response = $this->open_channel(self::CHANNEL, true); - if ($response === true && $this->isTimeout()) { - return false; - } - - $packet = Strings::packSSH2( - 'CNsbs', - NET_SSH2_MSG_CHANNEL_REQUEST, - $this->server_channels[self::CHANNEL], - 'subsystem', - true, - 'sftp' - ); - $this->send_binary_packet($packet); - - $this->channel_status[self::CHANNEL] = NET_SSH2_MSG_CHANNEL_REQUEST; - - $response = $this->get_channel_packet(self::CHANNEL, true); - if ($response === false) { - // from PuTTY's psftp.exe - $command = "test -x /usr/lib/sftp-server && exec /usr/lib/sftp-server\n" . - "test -x /usr/local/lib/sftp-server && exec /usr/local/lib/sftp-server\n" . - "exec sftp-server"; - // we don't do $this->exec($command, false) because exec() operates on a different channel and plus the SSH_MSG_CHANNEL_OPEN that exec() does - // is redundant - $packet = Strings::packSSH2( - 'CNsCs', - NET_SSH2_MSG_CHANNEL_REQUEST, - $this->server_channels[self::CHANNEL], - 'exec', - 1, - $command - ); - $this->send_binary_packet($packet); - - $this->channel_status[self::CHANNEL] = NET_SSH2_MSG_CHANNEL_REQUEST; - - $response = $this->get_channel_packet(self::CHANNEL, true); - if ($response === false) { - return false; - } - } elseif ($response === true && $this->isTimeout()) { - return false; - } - - $this->channel_status[self::CHANNEL] = NET_SSH2_MSG_CHANNEL_DATA; - $this->send_sftp_packet(NET_SFTP_INIT, "\0\0\0\3"); - - $response = $this->get_sftp_packet(); - if ($this->packet_type != NET_SFTP_VERSION) { - throw new \UnexpectedValueException('Expected NET_SFTP_VERSION. ' - . 'Got packet type: ' . $this->packet_type); - } - - $this->use_request_id = true; - - list($this->defaultVersion) = Strings::unpackSSH2('N', $response); - while (!empty($response)) { - list($key, $value) = Strings::unpackSSH2('ss', $response); - $this->extensions[$key] = $value; - } - - $this->partial_init = true; - - return true; - } - - /** - * (Re)initializes the SFTP channel - * - * @return bool - */ - private function init_sftp_connection() - { - if (!$this->partial_init && !$this->partial_init_sftp_connection()) { - return false; - } - - /* - A Note on SFTPv4/5/6 support: - states the following: - - "If the client wishes to interoperate with servers that support noncontiguous version - numbers it SHOULD send '3'" - - Given that the server only sends its version number after the client has already done so, the above - seems to be suggesting that v3 should be the default version. This makes sense given that v3 is the - most popular. - - states the following; - - "If the server did not send the "versions" extension, or the version-from-list was not included, the - server MAY send a status response describing the failure, but MUST then close the channel without - processing any further requests." - - So what do you do if you have a client whose initial SSH_FXP_INIT packet says it implements v3 and - a server whose initial SSH_FXP_VERSION reply says it implements v4 and only v4? If it only implements - v4, the "versions" extension is likely not going to have been sent so version re-negotiation as discussed - in draft-ietf-secsh-filexfer-13 would be quite impossible. As such, what \phpseclib3\Net\SFTP would do is close the - channel and reopen it with a new and updated SSH_FXP_INIT packet. - */ - $this->version = $this->defaultVersion; - if (isset($this->extensions['versions']) && (!$this->preferredVersion || $this->preferredVersion != $this->version)) { - $versions = explode(',', $this->extensions['versions']); - $supported = [6, 5, 4]; - if ($this->preferredVersion) { - $supported = array_diff($supported, [$this->preferredVersion]); - array_unshift($supported, $this->preferredVersion); - } - foreach ($supported as $ver) { - if (in_array($ver, $versions)) { - if ($ver === $this->version) { - break; - } - $this->version = (int) $ver; - $packet = Strings::packSSH2('ss', 'version-select', "$ver"); - $this->send_sftp_packet(NET_SFTP_EXTENDED, $packet); - $response = $this->get_sftp_packet(); - if ($this->packet_type != NET_SFTP_STATUS) { - throw new \UnexpectedValueException('Expected NET_SFTP_STATUS. ' - . 'Got packet type: ' . $this->packet_type); - } - list($status) = Strings::unpackSSH2('N', $response); - if ($status != NET_SFTP_STATUS_OK) { - $this->logError($response, $status); - throw new \UnexpectedValueException('Expected NET_SFTP_STATUS_OK. ' - . ' Got ' . $status); - } - break; - } - } - } - - /* - SFTPv4+ defines a 'newline' extension. SFTPv3 seems to have unofficial support for it via 'newline@vandyke.com', - however, I'm not sure what 'newline@vandyke.com' is supposed to do (the fact that it's unofficial means that it's - not in the official SFTPv3 specs) and 'newline@vandyke.com' / 'newline' are likely not drop-in substitutes for - one another due to the fact that 'newline' comes with a SSH_FXF_TEXT bitmask whereas it seems unlikely that - 'newline@vandyke.com' would. - */ - /* - if (isset($this->extensions['newline@vandyke.com'])) { - $this->extensions['newline'] = $this->extensions['newline@vandyke.com']; - unset($this->extensions['newline@vandyke.com']); - } - */ - if ($this->version < 2 || $this->version > 6) { - return false; - } - - $this->pwd = true; - try { - $this->pwd = $this->realpath('.'); - } catch (\UnexpectedValueException $e) { - if (!$this->canonicalize_paths) { - throw $e; - } - $this->canonicalize_paths = false; - $this->reset_sftp(); - return $this->init_sftp_connection(); - } - - $this->update_stat_cache($this->pwd, []); - - return true; - } - - /** - * Disable the stat cache - * - */ - public function disableStatCache() - { - $this->use_stat_cache = false; - } - - /** - * Enable the stat cache - * - */ - public function enableStatCache() - { - $this->use_stat_cache = true; - } - - /** - * Clear the stat cache - * - */ - public function clearStatCache() - { - $this->stat_cache = []; - } - - /** - * Enable path canonicalization - * - */ - public function enablePathCanonicalization() - { - $this->canonicalize_paths = true; - } - - /** - * Disable path canonicalization - * - * If this is enabled then $sftp->pwd() will not return the canonicalized absolute path - * - */ - public function disablePathCanonicalization() - { - $this->canonicalize_paths = false; - } - - /** - * Enable arbitrary length packets - * - */ - public function enableArbitraryLengthPackets() - { - $this->allow_arbitrary_length_packets = true; - } - - /** - * Disable arbitrary length packets - * - */ - public function disableArbitraryLengthPackets() - { - $this->allow_arbitrary_length_packets = false; - } - - /** - * Returns the current directory name - * - * @return string|bool - */ - public function pwd() - { - if (!$this->precheck()) { - return false; - } - - return $this->pwd; - } - - /** - * Logs errors - * - * @param string $response - * @param int $status - */ - private function logError($response, $status = -1) - { - if ($status == -1) { - list($status) = Strings::unpackSSH2('N', $response); - } - - $error = self::$status_codes[$status]; - - if ($this->version > 2) { - list($message) = Strings::unpackSSH2('s', $response); - $this->sftp_errors[] = "$error: $message"; - } else { - $this->sftp_errors[] = $error; - } - } - - /** - * Canonicalize the Server-Side Path Name - * - * SFTP doesn't provide a mechanism by which the current working directory can be changed, so we'll emulate it. Returns - * the absolute (canonicalized) path. - * - * If canonicalize_paths has been disabled using disablePathCanonicalization(), $path is returned as-is. - * - * @see self::chdir() - * @see self::disablePathCanonicalization() - * @param string $path - * @throws \UnexpectedValueException on receipt of unexpected packets - * @return mixed - */ - public function realpath($path) - { - if ($this->precheck() === false) { - return false; - } - - $path = (string) $path; - - if (!$this->canonicalize_paths) { - if ($this->pwd === true) { - return '.'; - } - if (!strlen($path) || $path[0] != '/') { - $path = $this->pwd . '/' . $path; - } - $parts = explode('/', $path); - $afterPWD = $beforePWD = []; - foreach ($parts as $part) { - switch ($part) { - //case '': // some SFTP servers /require/ double /'s. see https://github.com/phpseclib/phpseclib/pull/1137 - case '.': - break; - case '..': - if (!empty($afterPWD)) { - array_pop($afterPWD); - } else { - $beforePWD[] = '..'; - } - break; - default: - $afterPWD[] = $part; - } - } - $beforePWD = count($beforePWD) ? implode('/', $beforePWD) : '.'; - return $beforePWD . '/' . implode('/', $afterPWD); - } - - if ($this->pwd === true) { - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.9 - $this->send_sftp_packet(NET_SFTP_REALPATH, Strings::packSSH2('s', $path)); - - $response = $this->get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_NAME: - // although SSH_FXP_NAME is implemented differently in SFTPv3 than it is in SFTPv4+, the following - // should work on all SFTP versions since the only part of the SSH_FXP_NAME packet the following looks - // at is the first part and that part is defined the same in SFTP versions 3 through 6. - list(, $filename) = Strings::unpackSSH2('Ns', $response); - return $filename; - case NET_SFTP_STATUS: - $this->logError($response); - return false; - default: - throw new \UnexpectedValueException('Expected NET_SFTP_NAME or NET_SFTP_STATUS. ' - . 'Got packet type: ' . $this->packet_type); - } - } - - if (!strlen($path) || $path[0] != '/') { - $path = $this->pwd . '/' . $path; - } - - $path = explode('/', $path); - $new = []; - foreach ($path as $dir) { - if (!strlen($dir)) { - continue; - } - switch ($dir) { - case '..': - array_pop($new); - // fall-through - case '.': - break; - default: - $new[] = $dir; - } - } - - return '/' . implode('/', $new); - } - - /** - * Changes the current directory - * - * @param string $dir - * @throws \UnexpectedValueException on receipt of unexpected packets - * @return bool - */ - public function chdir($dir) - { - if (!$this->precheck()) { - return false; - } - - $dir = (string) $dir; - - // assume current dir if $dir is empty - if ($dir === '') { - $dir = './'; - // suffix a slash if needed - } elseif ($dir[strlen($dir) - 1] != '/') { - $dir .= '/'; - } - - $dir = $this->realpath($dir); - if ($dir === false) { - return false; - } - - // confirm that $dir is, in fact, a valid directory - if ($this->use_stat_cache && is_array($this->query_stat_cache($dir))) { - $this->pwd = $dir; - return true; - } - - // we could do a stat on the alleged $dir to see if it's a directory but that doesn't tell us - // the currently logged in user has the appropriate permissions or not. maybe you could see if - // the file's uid / gid match the currently logged in user's uid / gid but how there's no easy - // way to get those with SFTP - - $this->send_sftp_packet(NET_SFTP_OPENDIR, Strings::packSSH2('s', $dir)); - - // see \phpseclib3\Net\SFTP::nlist() for a more thorough explanation of the following - $response = $this->get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_HANDLE: - $handle = substr($response, 4); - break; - case NET_SFTP_STATUS: - $this->logError($response); - return false; - default: - throw new \UnexpectedValueException('Expected NET_SFTP_HANDLE or NET_SFTP_STATUS' . - 'Got packet type: ' . $this->packet_type); - } - - if (!$this->close_handle($handle)) { - return false; - } - - $this->update_stat_cache($dir, []); - - $this->pwd = $dir; - return true; - } - - /** - * Returns a list of files in the given directory - * - * @param string $dir - * @param bool $recursive - * @return array|false - */ - public function nlist($dir = '.', $recursive = false) - { - return $this->nlist_helper($dir, $recursive, ''); - } - - /** - * Helper method for nlist - * - * @param string $dir - * @param bool $recursive - * @param string $relativeDir - * @return array|false - */ - private function nlist_helper($dir, $recursive, $relativeDir) - { - $files = $this->readlist($dir, false); - - // If we get an int back, then that is an "unexpected" status. - // We do not have a file list, so return false. - if (is_int($files)) { - return false; - } - - if (!$recursive || $files === false) { - return $files; - } - - $result = []; - foreach ($files as $value) { - if ($value == '.' || $value == '..') { - $result[] = $relativeDir . $value; - continue; - } - if (is_array($this->query_stat_cache($this->realpath($dir . '/' . $value)))) { - $temp = $this->nlist_helper($dir . '/' . $value, true, $relativeDir . $value . '/'); - $temp = is_array($temp) ? $temp : []; - $result = array_merge($result, $temp); - } else { - $result[] = $relativeDir . $value; - } - } - - return $result; - } - - /** - * Returns a detailed list of files in the given directory - * - * @param string $dir - * @param bool $recursive - * @return array|false - */ - public function rawlist($dir = '.', $recursive = false) - { - $files = $this->readlist($dir, true); - - // If we get an int back, then that is an "unexpected" status. - // We do not have a file list, so return false. - if (is_int($files)) { - return false; - } - - if (!$recursive || $files === false) { - return $files; - } - - static $depth = 0; - - foreach ($files as $key => $value) { - if ($depth != 0 && $key == '..') { - unset($files[$key]); - continue; - } - $is_directory = false; - if ($key != '.' && $key != '..') { - if ($this->use_stat_cache) { - $is_directory = is_array($this->query_stat_cache($this->realpath($dir . '/' . $key))); - } else { - $stat = $this->lstat($dir . '/' . $key); - $is_directory = $stat && $stat['type'] === NET_SFTP_TYPE_DIRECTORY; - } - } - - if ($is_directory) { - $depth++; - $files[$key] = $this->rawlist($dir . '/' . $key, true); - $depth--; - } else { - $files[$key] = (object) $value; - } - } - - return $files; - } - - /** - * Reads a list, be it detailed or not, of files in the given directory - * - * @param string $dir - * @param bool $raw - * @return array|false - * @throws \UnexpectedValueException on receipt of unexpected packets - */ - private function readlist($dir, $raw = true) - { - if (!$this->precheck()) { - return false; - } - - $dir = $this->realpath($dir . '/'); - if ($dir === false) { - return false; - } - - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.1.2 - $this->send_sftp_packet(NET_SFTP_OPENDIR, Strings::packSSH2('s', $dir)); - - $response = $this->get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_HANDLE: - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-9.2 - // since 'handle' is the last field in the SSH_FXP_HANDLE packet, we'll just remove the first four bytes that - // represent the length of the string and leave it at that - $handle = substr($response, 4); - break; - case NET_SFTP_STATUS: - // presumably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED - list($status) = Strings::unpackSSH2('N', $response); - $this->logError($response, $status); - return $status; - default: - throw new \UnexpectedValueException('Expected NET_SFTP_HANDLE or NET_SFTP_STATUS. ' - . 'Got packet type: ' . $this->packet_type); - } - - $this->update_stat_cache($dir, []); - - $contents = []; - while (true) { - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.2.2 - // why multiple SSH_FXP_READDIR packets would be sent when the response to a single one can span arbitrarily many - // SSH_MSG_CHANNEL_DATA messages is not known to me. - $this->send_sftp_packet(NET_SFTP_READDIR, Strings::packSSH2('s', $handle)); - - $response = $this->get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_NAME: - list($count) = Strings::unpackSSH2('N', $response); - for ($i = 0; $i < $count; $i++) { - list($shortname) = Strings::unpackSSH2('s', $response); - // SFTPv4 "removed the long filename from the names structure-- it can now be - // built from information available in the attrs structure." - if ($this->version < 4) { - list($longname) = Strings::unpackSSH2('s', $response); - } - $attributes = $this->parseAttributes($response); - if (!isset($attributes['type']) && $this->version < 4) { - $fileType = $this->parseLongname($longname); - if ($fileType) { - $attributes['type'] = $fileType; - } - } - $contents[$shortname] = $attributes + ['filename' => $shortname]; - - if (isset($attributes['type']) && $attributes['type'] == NET_SFTP_TYPE_DIRECTORY && ($shortname != '.' && $shortname != '..')) { - $this->update_stat_cache($dir . '/' . $shortname, []); - } else { - if ($shortname == '..') { - $temp = $this->realpath($dir . '/..') . '/.'; - } else { - $temp = $dir . '/' . $shortname; - } - $this->update_stat_cache($temp, (object) ['lstat' => $attributes]); - } - // SFTPv6 has an optional boolean end-of-list field, but we'll ignore that, since the - // final SSH_FXP_STATUS packet should tell us that, already. - } - break; - case NET_SFTP_STATUS: - list($status) = Strings::unpackSSH2('N', $response); - if ($status != NET_SFTP_STATUS_EOF) { - $this->logError($response, $status); - return $status; - } - break 2; - default: - throw new \UnexpectedValueException('Expected NET_SFTP_NAME or NET_SFTP_STATUS. ' - . 'Got packet type: ' . $this->packet_type); - } - } - - if (!$this->close_handle($handle)) { - return false; - } - - if (count($this->sortOptions)) { - uasort($contents, [&$this, 'comparator']); - } - - return $raw ? $contents : array_map('strval', array_keys($contents)); - } - - /** - * Compares two rawlist entries using parameters set by setListOrder() - * - * Intended for use with uasort() - * - * @param array $a - * @param array $b - * @return int - */ - private function comparator(array $a, array $b) - { - switch (true) { - case $a['filename'] === '.' || $b['filename'] === '.': - if ($a['filename'] === $b['filename']) { - return 0; - } - return $a['filename'] === '.' ? -1 : 1; - case $a['filename'] === '..' || $b['filename'] === '..': - if ($a['filename'] === $b['filename']) { - return 0; - } - return $a['filename'] === '..' ? -1 : 1; - case isset($a['type']) && $a['type'] === NET_SFTP_TYPE_DIRECTORY: - if (!isset($b['type'])) { - return 1; - } - if ($b['type'] !== $a['type']) { - return -1; - } - break; - case isset($b['type']) && $b['type'] === NET_SFTP_TYPE_DIRECTORY: - return 1; - } - foreach ($this->sortOptions as $sort => $order) { - if (!isset($a[$sort]) || !isset($b[$sort])) { - if (isset($a[$sort])) { - return -1; - } - if (isset($b[$sort])) { - return 1; - } - return 0; - } - switch ($sort) { - case 'filename': - $result = strcasecmp($a['filename'], $b['filename']); - if ($result) { - return $order === SORT_DESC ? -$result : $result; - } - break; - case 'mode': - $a[$sort] &= 07777; - $b[$sort] &= 07777; - // fall-through - default: - if ($a[$sort] === $b[$sort]) { - break; - } - return $order === SORT_ASC ? $a[$sort] - $b[$sort] : $b[$sort] - $a[$sort]; - } - } - } - - /** - * Defines how nlist() and rawlist() will be sorted - if at all. - * - * If sorting is enabled directories and files will be sorted independently with - * directories appearing before files in the resultant array that is returned. - * - * Any parameter returned by stat is a valid sort parameter for this function. - * Filename comparisons are case insensitive. - * - * Examples: - * - * $sftp->setListOrder('filename', SORT_ASC); - * $sftp->setListOrder('size', SORT_DESC, 'filename', SORT_ASC); - * $sftp->setListOrder(true); - * Separates directories from files but doesn't do any sorting beyond that - * $sftp->setListOrder(); - * Don't do any sort of sorting - * - * @param string ...$args - */ - public function setListOrder(...$args) - { - $this->sortOptions = []; - if (empty($args)) { - return; - } - $len = count($args) & 0x7FFFFFFE; - for ($i = 0; $i < $len; $i += 2) { - $this->sortOptions[$args[$i]] = $args[$i + 1]; - } - if (!count($this->sortOptions)) { - $this->sortOptions = ['bogus' => true]; - } - } - - /** - * Save files / directories to cache - * - * @param string $path - * @param mixed $value - */ - private function update_stat_cache($path, $value) - { - if ($this->use_stat_cache === false) { - return; - } - - // preg_replace('#^/|/(?=/)|/$#', '', $dir) == str_replace('//', '/', trim($path, '/')) - $dirs = explode('/', preg_replace('#^/|/(?=/)|/$#', '', $path)); - - $temp = &$this->stat_cache; - $max = count($dirs) - 1; - foreach ($dirs as $i => $dir) { - // if $temp is an object that means one of two things. - // 1. a file was deleted and changed to a directory behind phpseclib's back - // 2. it's a symlink. when lstat is done it's unclear what it's a symlink to - if (is_object($temp)) { - $temp = []; - } - if (!isset($temp[$dir])) { - $temp[$dir] = []; - } - if ($i === $max) { - if (is_object($temp[$dir]) && is_object($value)) { - if (!isset($value->stat) && isset($temp[$dir]->stat)) { - $value->stat = $temp[$dir]->stat; - } - if (!isset($value->lstat) && isset($temp[$dir]->lstat)) { - $value->lstat = $temp[$dir]->lstat; - } - } - $temp[$dir] = $value; - break; - } - $temp = &$temp[$dir]; - } - } - - /** - * Remove files / directories from cache - * - * @param string $path - * @return bool - */ - private function remove_from_stat_cache($path) - { - $dirs = explode('/', preg_replace('#^/|/(?=/)|/$#', '', $path)); - - $temp = &$this->stat_cache; - $max = count($dirs) - 1; - foreach ($dirs as $i => $dir) { - if (!is_array($temp)) { - return false; - } - if ($i === $max) { - unset($temp[$dir]); - return true; - } - if (!isset($temp[$dir])) { - return false; - } - $temp = &$temp[$dir]; - } - } - - /** - * Checks cache for path - * - * Mainly used by file_exists - * - * @param string $path - * @return mixed - */ - private function query_stat_cache($path) - { - $dirs = explode('/', preg_replace('#^/|/(?=/)|/$#', '', $path)); - - $temp = &$this->stat_cache; - foreach ($dirs as $dir) { - if (!is_array($temp)) { - return null; - } - if (!isset($temp[$dir])) { - return null; - } - $temp = &$temp[$dir]; - } - return $temp; - } - - /** - * Returns general information about a file. - * - * Returns an array on success and false otherwise. - * - * @param string $filename - * @return array|false - */ - public function stat($filename) - { - if (!$this->precheck()) { - return false; - } - - $filename = $this->realpath($filename); - if ($filename === false) { - return false; - } - - if ($this->use_stat_cache) { - $result = $this->query_stat_cache($filename); - if (is_array($result) && isset($result['.']) && isset($result['.']->stat)) { - return $result['.']->stat; - } - if (is_object($result) && isset($result->stat)) { - return $result->stat; - } - } - - $stat = $this->stat_helper($filename, NET_SFTP_STAT); - if ($stat === false) { - $this->remove_from_stat_cache($filename); - return false; - } - if (isset($stat['type'])) { - if ($stat['type'] == NET_SFTP_TYPE_DIRECTORY) { - $filename .= '/.'; - } - $this->update_stat_cache($filename, (object) ['stat' => $stat]); - return $stat; - } - - $pwd = $this->pwd; - $stat['type'] = $this->chdir($filename) ? - NET_SFTP_TYPE_DIRECTORY : - NET_SFTP_TYPE_REGULAR; - $this->pwd = $pwd; - - if ($stat['type'] == NET_SFTP_TYPE_DIRECTORY) { - $filename .= '/.'; - } - $this->update_stat_cache($filename, (object) ['stat' => $stat]); - - return $stat; - } - - /** - * Returns general information about a file or symbolic link. - * - * Returns an array on success and false otherwise. - * - * @param string $filename - * @return array|false - */ - public function lstat($filename) - { - if (!$this->precheck()) { - return false; - } - - $filename = $this->realpath($filename); - if ($filename === false) { - return false; - } - - if ($this->use_stat_cache) { - $result = $this->query_stat_cache($filename); - if (is_array($result) && isset($result['.']) && isset($result['.']->lstat)) { - return $result['.']->lstat; - } - if (is_object($result) && isset($result->lstat)) { - return $result->lstat; - } - } - - $lstat = $this->stat_helper($filename, NET_SFTP_LSTAT); - if ($lstat === false) { - $this->remove_from_stat_cache($filename); - return false; - } - if (isset($lstat['type'])) { - if ($lstat['type'] == NET_SFTP_TYPE_DIRECTORY) { - $filename .= '/.'; - } - $this->update_stat_cache($filename, (object) ['lstat' => $lstat]); - return $lstat; - } - - $stat = $this->stat_helper($filename, NET_SFTP_STAT); - - if ($lstat != $stat) { - $lstat = array_merge($lstat, ['type' => NET_SFTP_TYPE_SYMLINK]); - $this->update_stat_cache($filename, (object) ['lstat' => $lstat]); - return $stat; - } - - $pwd = $this->pwd; - $lstat['type'] = $this->chdir($filename) ? - NET_SFTP_TYPE_DIRECTORY : - NET_SFTP_TYPE_REGULAR; - $this->pwd = $pwd; - - if ($lstat['type'] == NET_SFTP_TYPE_DIRECTORY) { - $filename .= '/.'; - } - $this->update_stat_cache($filename, (object) ['lstat' => $lstat]); - - return $lstat; - } - - /** - * Returns general information about a file or symbolic link - * - * Determines information without calling \phpseclib3\Net\SFTP::realpath(). - * The second parameter can be either NET_SFTP_STAT or NET_SFTP_LSTAT. - * - * @param string $filename - * @param int $type - * @throws \UnexpectedValueException on receipt of unexpected packets - * @return array|false - */ - private function stat_helper($filename, $type) - { - // SFTPv4+ adds an additional 32-bit integer field - flags - to the following: - $packet = Strings::packSSH2('s', $filename); - $this->send_sftp_packet($type, $packet); - - $response = $this->get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_ATTRS: - return $this->parseAttributes($response); - case NET_SFTP_STATUS: - $this->logError($response); - return false; - } - - throw new \UnexpectedValueException('Expected NET_SFTP_ATTRS or NET_SFTP_STATUS. ' - . 'Got packet type: ' . $this->packet_type); - } - - /** - * Truncates a file to a given length - * - * @param string $filename - * @param int $new_size - * @return bool - */ - public function truncate($filename, $new_size) - { - $attr = Strings::packSSH2('NQ', NET_SFTP_ATTR_SIZE, $new_size); - - return $this->setstat($filename, $attr, false); - } - - /** - * Sets access and modification time of file. - * - * If the file does not exist, it will be created. - * - * @param string $filename - * @param int $time - * @param int $atime - * @throws \UnexpectedValueException on receipt of unexpected packets - * @return bool - */ - public function touch($filename, $time = null, $atime = null) - { - if (!$this->precheck()) { - return false; - } - - $filename = $this->realpath($filename); - if ($filename === false) { - return false; - } - - if (!isset($time)) { - $time = time(); - } - if (!isset($atime)) { - $atime = $time; - } - - $attr = $this->version < 4 ? - pack('N3', NET_SFTP_ATTR_ACCESSTIME, $atime, $time) : - Strings::packSSH2('NQ2', NET_SFTP_ATTR_ACCESSTIME | NET_SFTP_ATTR_MODIFYTIME, $atime, $time); - - $packet = Strings::packSSH2('s', $filename); - $packet .= $this->version >= 5 ? - pack('N2', 0, NET_SFTP_OPEN_OPEN_EXISTING) : - pack('N', NET_SFTP_OPEN_WRITE | NET_SFTP_OPEN_CREATE | NET_SFTP_OPEN_EXCL); - $packet .= $attr; - - $this->send_sftp_packet(NET_SFTP_OPEN, $packet); - - $response = $this->get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_HANDLE: - return $this->close_handle(substr($response, 4)); - case NET_SFTP_STATUS: - $this->logError($response); - break; - default: - throw new \UnexpectedValueException('Expected NET_SFTP_HANDLE or NET_SFTP_STATUS. ' - . 'Got packet type: ' . $this->packet_type); - } - - return $this->setstat($filename, $attr, false); - } - - /** - * Changes file or directory owner - * - * $uid should be an int for SFTPv3 and a string for SFTPv4+. Ideally the string - * would be of the form "user@dns_domain" but it does not need to be. - * `$sftp->getSupportedVersions()['version']` will return the specific version - * that's being used. - * - * Returns true on success or false on error. - * - * @param string $filename - * @param int|string $uid - * @param bool $recursive - * @return bool - */ - public function chown($filename, $uid, $recursive = false) - { - /* - quoting , - - "To avoid a representation that is tied to a particular underlying - implementation at the client or server, the use of UTF-8 strings has - been chosen. The string should be of the form "user@dns_domain". - This will allow for a client and server that do not use the same - local representation the ability to translate to a common syntax that - can be interpreted by both. In the case where there is no - translation available to the client or server, the attribute value - must be constructed without the "@"." - - phpseclib _could_ auto append the dns_domain to $uid BUT what if it shouldn't - have one? phpseclib would have no way of knowing so rather than guess phpseclib - will just use whatever value the user provided - */ - - $attr = $this->version < 4 ? - // quoting , - // "if the owner or group is specified as -1, then that ID is not changed" - pack('N3', NET_SFTP_ATTR_UIDGID, $uid, -1) : - // quoting , - // "If either the owner or group field is zero length, the field should be - // considered absent, and no change should be made to that specific field - // during a modification operation" - Strings::packSSH2('Nss', NET_SFTP_ATTR_OWNERGROUP, $uid, ''); - - return $this->setstat($filename, $attr, $recursive); - } - - /** - * Changes file or directory group - * - * $gid should be an int for SFTPv3 and a string for SFTPv4+. Ideally the string - * would be of the form "user@dns_domain" but it does not need to be. - * `$sftp->getSupportedVersions()['version']` will return the specific version - * that's being used. - * - * Returns true on success or false on error. - * - * @param string $filename - * @param int|string $gid - * @param bool $recursive - * @return bool - */ - public function chgrp($filename, $gid, $recursive = false) - { - $attr = $this->version < 4 ? - pack('N3', NET_SFTP_ATTR_UIDGID, -1, $gid) : - Strings::packSSH2('Nss', NET_SFTP_ATTR_OWNERGROUP, '', $gid); - - return $this->setstat($filename, $attr, $recursive); - } - - /** - * Set permissions on a file. - * - * Returns the new file permissions on success or false on error. - * If $recursive is true than this just returns true or false. - * - * @param int $mode - * @param string $filename - * @param bool $recursive - * @throws \UnexpectedValueException on receipt of unexpected packets - * @return mixed - */ - public function chmod($mode, $filename, $recursive = false) - { - if (is_string($mode) && is_int($filename)) { - $temp = $mode; - $mode = $filename; - $filename = $temp; - } - - $attr = pack('N2', NET_SFTP_ATTR_PERMISSIONS, $mode & 07777); - if (!$this->setstat($filename, $attr, $recursive)) { - return false; - } - if ($recursive) { - return true; - } - - $filename = $this->realpath($filename); - // rather than return what the permissions *should* be, we'll return what they actually are. this will also - // tell us if the file actually exists. - // incidentally, SFTPv4+ adds an additional 32-bit integer field - flags - to the following: - $packet = pack('Na*', strlen($filename), $filename); - $this->send_sftp_packet(NET_SFTP_STAT, $packet); - - $response = $this->get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_ATTRS: - $attrs = $this->parseAttributes($response); - return $attrs['mode']; - case NET_SFTP_STATUS: - $this->logError($response); - return false; - } - - throw new \UnexpectedValueException('Expected NET_SFTP_ATTRS or NET_SFTP_STATUS. ' - . 'Got packet type: ' . $this->packet_type); - } - - /** - * Sets information about a file - * - * @param string $filename - * @param string $attr - * @param bool $recursive - * @throws \UnexpectedValueException on receipt of unexpected packets - * @return bool - */ - private function setstat($filename, $attr, $recursive) - { - if (!$this->precheck()) { - return false; - } - - $filename = $this->realpath($filename); - if ($filename === false) { - return false; - } - - $this->remove_from_stat_cache($filename); - - if ($recursive) { - $i = 0; - $result = $this->setstat_recursive($filename, $attr, $i); - $this->read_put_responses($i); - return $result; - } - - $packet = Strings::packSSH2('s', $filename); - $packet .= $this->version >= 4 ? - pack('a*Ca*', substr($attr, 0, 4), NET_SFTP_TYPE_UNKNOWN, substr($attr, 4)) : - $attr; - $this->send_sftp_packet(NET_SFTP_SETSTAT, $packet); - - /* - "Because some systems must use separate system calls to set various attributes, it is possible that a failure - response will be returned, but yet some of the attributes may be have been successfully modified. If possible, - servers SHOULD avoid this situation; however, clients MUST be aware that this is possible." - - -- http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.6 - */ - $response = $this->get_sftp_packet(); - if ($this->packet_type != NET_SFTP_STATUS) { - throw new \UnexpectedValueException('Expected NET_SFTP_STATUS. ' - . 'Got packet type: ' . $this->packet_type); - } - - list($status) = Strings::unpackSSH2('N', $response); - if ($status != NET_SFTP_STATUS_OK) { - $this->logError($response, $status); - return false; - } - - return true; - } - - /** - * Recursively sets information on directories on the SFTP server - * - * Minimizes directory lookups and SSH_FXP_STATUS requests for speed. - * - * @param string $path - * @param string $attr - * @param int $i - * @return bool - */ - private function setstat_recursive($path, $attr, &$i) - { - if (!$this->read_put_responses($i)) { - return false; - } - $i = 0; - $entries = $this->readlist($path, true); - - if ($entries === false || is_int($entries)) { - return $this->setstat($path, $attr, false); - } - - // normally $entries would have at least . and .. but it might not if the directories - // permissions didn't allow reading - if (empty($entries)) { - return false; - } - - unset($entries['.'], $entries['..']); - foreach ($entries as $filename => $props) { - if (!isset($props['type'])) { - return false; - } - - $temp = $path . '/' . $filename; - if ($props['type'] == NET_SFTP_TYPE_DIRECTORY) { - if (!$this->setstat_recursive($temp, $attr, $i)) { - return false; - } - } else { - $packet = Strings::packSSH2('s', $temp); - $packet .= $this->version >= 4 ? - pack('Ca*', NET_SFTP_TYPE_UNKNOWN, $attr) : - $attr; - $this->send_sftp_packet(NET_SFTP_SETSTAT, $packet); - - $i++; - - if ($i >= NET_SFTP_QUEUE_SIZE) { - if (!$this->read_put_responses($i)) { - return false; - } - $i = 0; - } - } - } - - $packet = Strings::packSSH2('s', $path); - $packet .= $this->version >= 4 ? - pack('Ca*', NET_SFTP_TYPE_UNKNOWN, $attr) : - $attr; - $this->send_sftp_packet(NET_SFTP_SETSTAT, $packet); - - $i++; - - if ($i >= NET_SFTP_QUEUE_SIZE) { - if (!$this->read_put_responses($i)) { - return false; - } - $i = 0; - } - - return true; - } - - /** - * Return the target of a symbolic link - * - * @param string $link - * @throws \UnexpectedValueException on receipt of unexpected packets - * @return mixed - */ - public function readlink($link) - { - if (!$this->precheck()) { - return false; - } - - $link = $this->realpath($link); - - $this->send_sftp_packet(NET_SFTP_READLINK, Strings::packSSH2('s', $link)); - - $response = $this->get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_NAME: - break; - case NET_SFTP_STATUS: - $this->logError($response); - return false; - default: - throw new \UnexpectedValueException('Expected NET_SFTP_NAME or NET_SFTP_STATUS. ' - . 'Got packet type: ' . $this->packet_type); - } - - list($count) = Strings::unpackSSH2('N', $response); - // the file isn't a symlink - if (!$count) { - return false; - } - - list($filename) = Strings::unpackSSH2('s', $response); - - return $filename; - } - - /** - * Create a symlink - * - * symlink() creates a symbolic link to the existing target with the specified name link. - * - * @param string $target - * @param string $link - * @throws \UnexpectedValueException on receipt of unexpected packets - * @return bool - */ - public function symlink($target, $link) - { - if (!$this->precheck()) { - return false; - } - - //$target = $this->realpath($target); - $link = $this->realpath($link); - - /* quoting https://datatracker.ietf.org/doc/html/draft-ietf-secsh-filexfer-09#section-12.1 : - - Changed the SYMLINK packet to be LINK and give it the ability to - create hard links. Also change it's packet number because many - implementation implemented SYMLINK with the arguments reversed. - Hopefully the new argument names make it clear which way is which. - */ - if ($this->version == 6) { - $type = NET_SFTP_LINK; - $packet = Strings::packSSH2('ssC', $link, $target, 1); - } else { - $type = NET_SFTP_SYMLINK; - /* quoting http://bxr.su/OpenBSD/usr.bin/ssh/PROTOCOL#347 : - - 3.1. sftp: Reversal of arguments to SSH_FXP_SYMLINK - - When OpenSSH's sftp-server was implemented, the order of the arguments - to the SSH_FXP_SYMLINK method was inadvertently reversed. Unfortunately, - the reversal was not noticed until the server was widely deployed. Since - fixing this to follow the specification would cause incompatibility, the - current order was retained. For correct operation, clients should send - SSH_FXP_SYMLINK as follows: - - uint32 id - string targetpath - string linkpath */ - $packet = substr($this->server_identifier, 0, 15) == 'SSH-2.0-OpenSSH' ? - Strings::packSSH2('ss', $target, $link) : - Strings::packSSH2('ss', $link, $target); - } - $this->send_sftp_packet($type, $packet); - - $response = $this->get_sftp_packet(); - if ($this->packet_type != NET_SFTP_STATUS) { - throw new \UnexpectedValueException('Expected NET_SFTP_STATUS. ' - . 'Got packet type: ' . $this->packet_type); - } - - list($status) = Strings::unpackSSH2('N', $response); - if ($status != NET_SFTP_STATUS_OK) { - $this->logError($response, $status); - return false; - } - - return true; - } - - /** - * Creates a directory. - * - * @param string $dir - * @param int $mode - * @param bool $recursive - * @return bool - */ - public function mkdir($dir, $mode = -1, $recursive = false) - { - if (!$this->precheck()) { - return false; - } - - $dir = $this->realpath($dir); - - if ($recursive) { - $dirs = explode('/', preg_replace('#/(?=/)|/$#', '', $dir)); - if (empty($dirs[0])) { - array_shift($dirs); - $dirs[0] = '/' . $dirs[0]; - } - for ($i = 0; $i < count($dirs); $i++) { - $temp = array_slice($dirs, 0, $i + 1); - $temp = implode('/', $temp); - $result = $this->mkdir_helper($temp, $mode); - } - return $result; - } - - return $this->mkdir_helper($dir, $mode); - } - - /** - * Helper function for directory creation - * - * @param string $dir - * @param int $mode - * @return bool - */ - private function mkdir_helper($dir, $mode) - { - // send SSH_FXP_MKDIR without any attributes (that's what the \0\0\0\0 is doing) - $this->send_sftp_packet(NET_SFTP_MKDIR, Strings::packSSH2('s', $dir) . "\0\0\0\0"); - - $response = $this->get_sftp_packet(); - if ($this->packet_type != NET_SFTP_STATUS) { - throw new \UnexpectedValueException('Expected NET_SFTP_STATUS. ' - . 'Got packet type: ' . $this->packet_type); - } - - list($status) = Strings::unpackSSH2('N', $response); - if ($status != NET_SFTP_STATUS_OK) { - $this->logError($response, $status); - return false; - } - - if ($mode !== -1) { - $this->chmod($mode, $dir); - } - - return true; - } - - /** - * Removes a directory. - * - * @param string $dir - * @throws \UnexpectedValueException on receipt of unexpected packets - * @return bool - */ - public function rmdir($dir) - { - if (!$this->precheck()) { - return false; - } - - $dir = $this->realpath($dir); - if ($dir === false) { - return false; - } - - $this->send_sftp_packet(NET_SFTP_RMDIR, Strings::packSSH2('s', $dir)); - - $response = $this->get_sftp_packet(); - if ($this->packet_type != NET_SFTP_STATUS) { - throw new \UnexpectedValueException('Expected NET_SFTP_STATUS. ' - . 'Got packet type: ' . $this->packet_type); - } - - list($status) = Strings::unpackSSH2('N', $response); - if ($status != NET_SFTP_STATUS_OK) { - // presumably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED? - $this->logError($response, $status); - return false; - } - - $this->remove_from_stat_cache($dir); - // the following will do a soft delete, which would be useful if you deleted a file - // and then tried to do a stat on the deleted file. the above, in contrast, does - // a hard delete - //$this->update_stat_cache($dir, false); - - return true; - } - - /** - * Uploads a file to the SFTP server. - * - * By default, \phpseclib3\Net\SFTP::put() does not read from the local filesystem. $data is dumped directly into $remote_file. - * So, for example, if you set $data to 'filename.ext' and then do \phpseclib3\Net\SFTP::get(), you will get a file, twelve bytes - * long, containing 'filename.ext' as its contents. - * - * Setting $mode to self::SOURCE_LOCAL_FILE will change the above behavior. With self::SOURCE_LOCAL_FILE, $remote_file will - * contain as many bytes as filename.ext does on your local filesystem. If your filename.ext is 1MB then that is how - * large $remote_file will be, as well. - * - * Setting $mode to self::SOURCE_CALLBACK will use $data as callback function, which gets only one parameter -- number - * of bytes to return, and returns a string if there is some data or null if there is no more data - * - * If $data is a resource then it'll be used as a resource instead. - * - * Currently, only binary mode is supported. As such, if the line endings need to be adjusted, you will need to take - * care of that, yourself. - * - * $mode can take an additional two parameters - self::RESUME and self::RESUME_START. These are bitwise AND'd with - * $mode. So if you want to resume upload of a 300mb file on the local file system you'd set $mode to the following: - * - * self::SOURCE_LOCAL_FILE | self::RESUME - * - * If you wanted to simply append the full contents of a local file to the full contents of a remote file you'd replace - * self::RESUME with self::RESUME_START. - * - * If $mode & (self::RESUME | self::RESUME_START) then self::RESUME_START will be assumed. - * - * $start and $local_start give you more fine grained control over this process and take precident over self::RESUME - * when they're non-negative. ie. $start could let you write at the end of a file (like self::RESUME) or in the middle - * of one. $local_start could let you start your reading from the end of a file (like self::RESUME_START) or in the - * middle of one. - * - * Setting $local_start to > 0 or $mode | self::RESUME_START doesn't do anything unless $mode | self::SOURCE_LOCAL_FILE. - * - * {@internal ASCII mode for SFTPv4/5/6 can be supported by adding a new function - \phpseclib3\Net\SFTP::setMode().} - * - * @param string $remote_file - * @param string|resource $data - * @param int $mode - * @param int $start - * @param int $local_start - * @param callable|null $progressCallback - * @throws \UnexpectedValueException on receipt of unexpected packets - * @throws \BadFunctionCallException if you're uploading via a callback and the callback function is invalid - * @throws FileNotFoundException if you're uploading via a file and the file doesn't exist - * @return bool - */ - public function put($remote_file, $data, $mode = self::SOURCE_STRING, $start = -1, $local_start = -1, $progressCallback = null) - { - if (!$this->precheck()) { - return false; - } - - $remote_file = $this->realpath($remote_file); - if ($remote_file === false) { - return false; - } - - $this->remove_from_stat_cache($remote_file); - - if ($this->version >= 5) { - $flags = NET_SFTP_OPEN_OPEN_OR_CREATE; - } else { - $flags = NET_SFTP_OPEN_WRITE | NET_SFTP_OPEN_CREATE; - // according to the SFTP specs, NET_SFTP_OPEN_APPEND should "force all writes to append data at the end of the file." - // in practice, it doesn't seem to do that. - //$flags|= ($mode & self::RESUME) ? NET_SFTP_OPEN_APPEND : NET_SFTP_OPEN_TRUNCATE; - } - - if ($start >= 0) { - $offset = $start; - } elseif ($mode & (self::RESUME | self::RESUME_START)) { - // if NET_SFTP_OPEN_APPEND worked as it should _size() wouldn't need to be called - $stat = $this->stat($remote_file); - $offset = $stat !== false && $stat['size'] ? $stat['size'] : 0; - } else { - $offset = 0; - if ($this->version >= 5) { - $flags = NET_SFTP_OPEN_CREATE_TRUNCATE; - } else { - $flags |= NET_SFTP_OPEN_TRUNCATE; - } - } - - $this->remove_from_stat_cache($remote_file); - - $packet = Strings::packSSH2('s', $remote_file); - $packet .= $this->version >= 5 ? - pack('N3', 0, $flags, 0) : - pack('N2', $flags, 0); - $this->send_sftp_packet(NET_SFTP_OPEN, $packet); - - $response = $this->get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_HANDLE: - $handle = substr($response, 4); - break; - case NET_SFTP_STATUS: - $this->logError($response); - return false; - default: - throw new \UnexpectedValueException('Expected NET_SFTP_HANDLE or NET_SFTP_STATUS. ' - . 'Got packet type: ' . $this->packet_type); - } - - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.2.3 - $dataCallback = false; - switch (true) { - case $mode & self::SOURCE_CALLBACK: - if (!is_callable($data)) { - throw new \BadFunctionCallException("\$data should be is_callable() if you specify SOURCE_CALLBACK flag"); - } - $dataCallback = $data; - // do nothing - break; - case is_resource($data): - $mode = $mode & ~self::SOURCE_LOCAL_FILE; - $info = stream_get_meta_data($data); - if (isset($info['wrapper_type']) && $info['wrapper_type'] == 'PHP' && $info['stream_type'] == 'Input') { - $fp = fopen('php://memory', 'w+'); - stream_copy_to_stream($data, $fp); - rewind($fp); - } else { - $fp = $data; - } - break; - case $mode & self::SOURCE_LOCAL_FILE: - if (!is_file($data)) { - throw new FileNotFoundException("$data is not a valid file"); - } - $fp = @fopen($data, 'rb'); - if (!$fp) { - return false; - } - } - - if (isset($fp)) { - $stat = fstat($fp); - $size = !empty($stat) ? $stat['size'] : 0; - - if ($local_start >= 0) { - fseek($fp, $local_start); - $size -= $local_start; - } elseif ($mode & self::RESUME) { - fseek($fp, $offset); - $size -= $offset; - } - } elseif ($dataCallback) { - $size = 0; - } else { - $size = strlen($data); - } - - $sent = 0; - $size = $size < 0 ? ($size & 0x7FFFFFFF) + 0x80000000 : $size; - - $sftp_packet_size = $this->max_sftp_packet; - // make the SFTP packet be exactly the SFTP packet size by including the bytes in the NET_SFTP_WRITE packets "header" - $sftp_packet_size -= strlen($handle) + 25; - $i = $j = 0; - while ($dataCallback || ($size === 0 || $sent < $size)) { - if ($dataCallback) { - $temp = $dataCallback($sftp_packet_size); - if (is_null($temp)) { - break; - } - } else { - $temp = isset($fp) ? fread($fp, $sftp_packet_size) : substr($data, $sent, $sftp_packet_size); - if ($temp === false || $temp === '') { - break; - } - } - - $subtemp = $offset + $sent; - $packet = pack('Na*N3a*', strlen($handle), $handle, $subtemp / 4294967296, $subtemp, strlen($temp), $temp); - try { - $this->send_sftp_packet(NET_SFTP_WRITE, $packet, $j); - } catch (\Exception $e) { - if ($mode & self::SOURCE_LOCAL_FILE) { - fclose($fp); - } - throw $e; - } - $sent += strlen($temp); - if (is_callable($progressCallback)) { - $progressCallback($sent); - } - - $i++; - $j++; - if ($i == NET_SFTP_UPLOAD_QUEUE_SIZE) { - if (!$this->read_put_responses($i)) { - $i = 0; - break; - } - $i = 0; - } - } - - $result = $this->close_handle($handle); - - if (!$this->read_put_responses($i)) { - if ($mode & self::SOURCE_LOCAL_FILE) { - fclose($fp); - } - $this->close_handle($handle); - return false; - } - - if ($mode & SFTP::SOURCE_LOCAL_FILE) { - if (isset($fp) && is_resource($fp)) { - fclose($fp); - } - - if ($this->preserveTime) { - $stat = stat($data); - $attr = $this->version < 4 ? - pack('N3', NET_SFTP_ATTR_ACCESSTIME, $stat['atime'], $stat['mtime']) : - Strings::packSSH2('NQ2', NET_SFTP_ATTR_ACCESSTIME | NET_SFTP_ATTR_MODIFYTIME, $stat['atime'], $stat['mtime']); - if (!$this->setstat($remote_file, $attr, false)) { - throw new \RuntimeException('Error setting file time'); - } - } - } - - return $result; - } - - /** - * Reads multiple successive SSH_FXP_WRITE responses - * - * Sending an SSH_FXP_WRITE packet and immediately reading its response isn't as efficient as blindly sending out $i - * SSH_FXP_WRITEs, in succession, and then reading $i responses. - * - * @param int $i - * @return bool - * @throws \UnexpectedValueException on receipt of unexpected packets - */ - private function read_put_responses($i) - { - while ($i--) { - $response = $this->get_sftp_packet(); - if ($this->packet_type != NET_SFTP_STATUS) { - throw new \UnexpectedValueException('Expected NET_SFTP_STATUS. ' - . 'Got packet type: ' . $this->packet_type); - } - - list($status) = Strings::unpackSSH2('N', $response); - if ($status != NET_SFTP_STATUS_OK) { - $this->logError($response, $status); - break; - } - } - - return $i < 0; - } - - /** - * Close handle - * - * @param string $handle - * @return bool - * @throws \UnexpectedValueException on receipt of unexpected packets - */ - private function close_handle($handle) - { - $this->send_sftp_packet(NET_SFTP_CLOSE, pack('Na*', strlen($handle), $handle)); - - // "The client MUST release all resources associated with the handle regardless of the status." - // -- http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.1.3 - $response = $this->get_sftp_packet(); - if ($this->packet_type != NET_SFTP_STATUS) { - throw new \UnexpectedValueException('Expected NET_SFTP_STATUS. ' - . 'Got packet type: ' . $this->packet_type); - } - - list($status) = Strings::unpackSSH2('N', $response); - if ($status != NET_SFTP_STATUS_OK) { - $this->logError($response, $status); - return false; - } - - return true; - } - - /** - * Downloads a file from the SFTP server. - * - * Returns a string containing the contents of $remote_file if $local_file is left undefined or a boolean false if - * the operation was unsuccessful. If $local_file is defined, returns true or false depending on the success of the - * operation. - * - * $offset and $length can be used to download files in chunks. - * - * @param string $remote_file - * @param string|bool|resource|callable $local_file - * @param int $offset - * @param int $length - * @param callable|null $progressCallback - * @throws \UnexpectedValueException on receipt of unexpected packets - * @return string|bool - */ - public function get($remote_file, $local_file = false, $offset = 0, $length = -1, $progressCallback = null) - { - if (!$this->precheck()) { - return false; - } - - $remote_file = $this->realpath($remote_file); - if ($remote_file === false) { - return false; - } - - $packet = Strings::packSSH2('s', $remote_file); - $packet .= $this->version >= 5 ? - pack('N3', 0, NET_SFTP_OPEN_OPEN_EXISTING, 0) : - pack('N2', NET_SFTP_OPEN_READ, 0); - $this->send_sftp_packet(NET_SFTP_OPEN, $packet); - - $response = $this->get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_HANDLE: - $handle = substr($response, 4); - break; - case NET_SFTP_STATUS: // presumably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED - $this->logError($response); - return false; - default: - throw new \UnexpectedValueException('Expected NET_SFTP_HANDLE or NET_SFTP_STATUS. ' - . 'Got packet type: ' . $this->packet_type); - } - - if (is_resource($local_file)) { - $fp = $local_file; - $stat = fstat($fp); - $res_offset = $stat['size']; - } else { - $res_offset = 0; - if ($local_file !== false && !is_callable($local_file)) { - $fp = fopen($local_file, 'wb'); - if (!$fp) { - return false; - } - } else { - $content = ''; - } - } - - $fclose_check = $local_file !== false && !is_callable($local_file) && !is_resource($local_file); - - $start = $offset; - $read = 0; - while (true) { - $i = 0; - - while ($i < NET_SFTP_QUEUE_SIZE && ($length < 0 || $read < $length)) { - $tempoffset = $start + $read; - - $packet_size = $length > 0 ? min($this->max_sftp_packet, $length - $read) : $this->max_sftp_packet; - - $packet = Strings::packSSH2('sN3', $handle, $tempoffset / 4294967296, $tempoffset, $packet_size); - try { - $this->send_sftp_packet(NET_SFTP_READ, $packet, $i); - } catch (\Exception $e) { - if ($fclose_check) { - fclose($fp); - } - throw $e; - } - $packet = null; - $read += $packet_size; - $i++; - } - - if (!$i) { - break; - } - - $packets_sent = $i - 1; - - $clear_responses = false; - while ($i > 0) { - $i--; - - if ($clear_responses) { - $this->get_sftp_packet($packets_sent - $i); - continue; - } else { - $response = $this->get_sftp_packet($packets_sent - $i); - } - - switch ($this->packet_type) { - case NET_SFTP_DATA: - $temp = substr($response, 4); - $offset += strlen($temp); - if ($local_file === false) { - $content .= $temp; - } elseif (is_callable($local_file)) { - $local_file($temp); - } else { - fputs($fp, $temp); - } - if (is_callable($progressCallback)) { - call_user_func($progressCallback, $offset); - } - $temp = null; - break; - case NET_SFTP_STATUS: - // could, in theory, return false if !strlen($content) but we'll hold off for the time being - $this->logError($response); - $clear_responses = true; // don't break out of the loop yet, so we can read the remaining responses - break; - default: - if ($fclose_check) { - fclose($fp); - } - if ($this->channel_close) { - $this->partial_init = false; - $this->init_sftp_connection(); - return false; - } else { - throw new \UnexpectedValueException('Expected NET_SFTP_DATA or NET_SFTP_STATUS. ' - . 'Got packet type: ' . $this->packet_type); - } - } - $response = null; - } - - if ($clear_responses) { - break; - } - } - - if ($fclose_check) { - fclose($fp); - - if ($this->preserveTime) { - $stat = $this->stat($remote_file); - touch($local_file, $stat['mtime'], $stat['atime']); - } - } - - if (!$this->close_handle($handle)) { - return false; - } - - // if $content isn't set that means a file was written to - return isset($content) ? $content : true; - } - - /** - * Deletes a file on the SFTP server. - * - * @param string $path - * @param bool $recursive - * @return bool - * @throws \UnexpectedValueException on receipt of unexpected packets - */ - public function delete($path, $recursive = true) - { - if (!$this->precheck()) { - return false; - } - - if (is_object($path)) { - // It's an object. Cast it as string before we check anything else. - $path = (string) $path; - } - - if (!is_string($path) || $path == '') { - return false; - } - - $path = $this->realpath($path); - if ($path === false) { - return false; - } - - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.3 - $this->send_sftp_packet(NET_SFTP_REMOVE, pack('Na*', strlen($path), $path)); - - $response = $this->get_sftp_packet(); - if ($this->packet_type != NET_SFTP_STATUS) { - throw new \UnexpectedValueException('Expected NET_SFTP_STATUS. ' - . 'Got packet type: ' . $this->packet_type); - } - - // if $status isn't SSH_FX_OK it's probably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED - list($status) = Strings::unpackSSH2('N', $response); - if ($status != NET_SFTP_STATUS_OK) { - $this->logError($response, $status); - if (!$recursive) { - return false; - } - - $i = 0; - $result = $this->delete_recursive($path, $i); - $this->read_put_responses($i); - return $result; - } - - $this->remove_from_stat_cache($path); - - return true; - } - - /** - * Recursively deletes directories on the SFTP server - * - * Minimizes directory lookups and SSH_FXP_STATUS requests for speed. - * - * @param string $path - * @param int $i - * @return bool - */ - private function delete_recursive($path, &$i) - { - if (!$this->read_put_responses($i)) { - return false; - } - $i = 0; - $entries = $this->readlist($path, true); - - // The folder does not exist at all, so we cannot delete it. - if ($entries === NET_SFTP_STATUS_NO_SUCH_FILE) { - return false; - } - - // Normally $entries would have at least . and .. but it might not if the directories - // permissions didn't allow reading. If this happens then default to an empty list of files. - if ($entries === false || is_int($entries)) { - $entries = []; - } - - unset($entries['.'], $entries['..']); - foreach ($entries as $filename => $props) { - if (!isset($props['type'])) { - return false; - } - - $temp = $path . '/' . $filename; - if ($props['type'] == NET_SFTP_TYPE_DIRECTORY) { - if (!$this->delete_recursive($temp, $i)) { - return false; - } - } else { - $this->send_sftp_packet(NET_SFTP_REMOVE, Strings::packSSH2('s', $temp)); - $this->remove_from_stat_cache($temp); - - $i++; - - if ($i >= NET_SFTP_QUEUE_SIZE) { - if (!$this->read_put_responses($i)) { - return false; - } - $i = 0; - } - } - } - - $this->send_sftp_packet(NET_SFTP_RMDIR, Strings::packSSH2('s', $path)); - $this->remove_from_stat_cache($path); - - $i++; - - if ($i >= NET_SFTP_QUEUE_SIZE) { - if (!$this->read_put_responses($i)) { - return false; - } - $i = 0; - } - - return true; - } - - /** - * Checks whether a file or directory exists - * - * @param string $path - * @return bool - */ - public function file_exists($path) - { - if ($this->use_stat_cache) { - if (!$this->precheck()) { - return false; - } - - $path = $this->realpath($path); - - $result = $this->query_stat_cache($path); - - if (isset($result)) { - // return true if $result is an array or if it's an stdClass object - return $result !== false; - } - } - - return $this->stat($path) !== false; - } - - /** - * Tells whether the filename is a directory - * - * @param string $path - * @return bool - */ - public function is_dir($path) - { - $result = $this->get_stat_cache_prop($path, 'type'); - if ($result === false) { - return false; - } - return $result === NET_SFTP_TYPE_DIRECTORY; - } - - /** - * Tells whether the filename is a regular file - * - * @param string $path - * @return bool - */ - public function is_file($path) - { - $result = $this->get_stat_cache_prop($path, 'type'); - if ($result === false) { - return false; - } - return $result === NET_SFTP_TYPE_REGULAR; - } - - /** - * Tells whether the filename is a symbolic link - * - * @param string $path - * @return bool - */ - public function is_link($path) - { - $result = $this->get_lstat_cache_prop($path, 'type'); - if ($result === false) { - return false; - } - return $result === NET_SFTP_TYPE_SYMLINK; - } - - /** - * Tells whether a file exists and is readable - * - * @param string $path - * @return bool - */ - public function is_readable($path) - { - if (!$this->precheck()) { - return false; - } - - $packet = Strings::packSSH2('sNN', $this->realpath($path), NET_SFTP_OPEN_READ, 0); - $this->send_sftp_packet(NET_SFTP_OPEN, $packet); - - $response = $this->get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_HANDLE: - return true; - case NET_SFTP_STATUS: // presumably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED - return false; - default: - throw new \UnexpectedValueException('Expected NET_SFTP_HANDLE or NET_SFTP_STATUS. ' - . 'Got packet type: ' . $this->packet_type); - } - } - - /** - * Tells whether the filename is writable - * - * @param string $path - * @return bool - */ - public function is_writable($path) - { - if (!$this->precheck()) { - return false; - } - - $packet = Strings::packSSH2('sNN', $this->realpath($path), NET_SFTP_OPEN_WRITE, 0); - $this->send_sftp_packet(NET_SFTP_OPEN, $packet); - - $response = $this->get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_HANDLE: - return true; - case NET_SFTP_STATUS: // presumably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED - return false; - default: - throw new \UnexpectedValueException('Expected SSH_FXP_HANDLE or SSH_FXP_STATUS. ' - . 'Got packet type: ' . $this->packet_type); - } - } - - /** - * Tells whether the filename is writeable - * - * Alias of is_writable - * - * @param string $path - * @return bool - */ - public function is_writeable($path) - { - return $this->is_writable($path); - } - - /** - * Gets last access time of file - * - * @param string $path - * @return mixed - */ - public function fileatime($path) - { - return $this->get_stat_cache_prop($path, 'atime'); - } - - /** - * Gets file modification time - * - * @param string $path - * @return mixed - */ - public function filemtime($path) - { - return $this->get_stat_cache_prop($path, 'mtime'); - } - - /** - * Gets file permissions - * - * @param string $path - * @return mixed - */ - public function fileperms($path) - { - return $this->get_stat_cache_prop($path, 'mode'); - } - - /** - * Gets file owner - * - * @param string $path - * @return mixed - */ - public function fileowner($path) - { - return $this->get_stat_cache_prop($path, 'uid'); - } - - /** - * Gets file group - * - * @param string $path - * @return mixed - */ - public function filegroup($path) - { - return $this->get_stat_cache_prop($path, 'gid'); - } - - /** - * Recursively go through rawlist() output to get the total filesize - * - * @return int - */ - private static function recursiveFilesize(array $files) - { - $size = 0; - foreach ($files as $name => $file) { - if ($name == '.' || $name == '..') { - continue; - } - $size += is_array($file) ? - self::recursiveFilesize($file) : - $file->size; - } - return $size; - } - - /** - * Gets file size - * - * @param string $path - * @param bool $recursive - * @return mixed - */ - public function filesize($path, $recursive = false) - { - return !$recursive || $this->filetype($path) != 'dir' ? - $this->get_stat_cache_prop($path, 'size') : - self::recursiveFilesize($this->rawlist($path, true)); - } - - /** - * Gets file type - * - * @param string $path - * @return string|false - */ - public function filetype($path) - { - $type = $this->get_stat_cache_prop($path, 'type'); - if ($type === false) { - return false; - } - - switch ($type) { - case NET_SFTP_TYPE_BLOCK_DEVICE: - return 'block'; - case NET_SFTP_TYPE_CHAR_DEVICE: - return 'char'; - case NET_SFTP_TYPE_DIRECTORY: - return 'dir'; - case NET_SFTP_TYPE_FIFO: - return 'fifo'; - case NET_SFTP_TYPE_REGULAR: - return 'file'; - case NET_SFTP_TYPE_SYMLINK: - return 'link'; - default: - return false; - } - } - - /** - * Return a stat properity - * - * Uses cache if appropriate. - * - * @param string $path - * @param string $prop - * @return mixed - */ - private function get_stat_cache_prop($path, $prop) - { - return $this->get_xstat_cache_prop($path, $prop, 'stat'); - } - - /** - * Return an lstat properity - * - * Uses cache if appropriate. - * - * @param string $path - * @param string $prop - * @return mixed - */ - private function get_lstat_cache_prop($path, $prop) - { - return $this->get_xstat_cache_prop($path, $prop, 'lstat'); - } - - /** - * Return a stat or lstat properity - * - * Uses cache if appropriate. - * - * @param string $path - * @param string $prop - * @param string $type - * @return mixed - */ - private function get_xstat_cache_prop($path, $prop, $type) - { - if (!$this->precheck()) { - return false; - } - - if ($this->use_stat_cache) { - $path = $this->realpath($path); - - $result = $this->query_stat_cache($path); - - if (is_object($result) && isset($result->$type)) { - return $result->{$type}[$prop]; - } - } - - $result = $this->$type($path); - - if ($result === false || !isset($result[$prop])) { - return false; - } - - return $result[$prop]; - } - - /** - * Renames a file or a directory on the SFTP server. - * - * If the file already exists this will return false - * - * @param string $oldname - * @param string $newname - * @return bool - * @throws \UnexpectedValueException on receipt of unexpected packets - */ - public function rename($oldname, $newname) - { - if (!$this->precheck()) { - return false; - } - - $oldname = $this->realpath($oldname); - $newname = $this->realpath($newname); - if ($oldname === false || $newname === false) { - return false; - } - - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-13#section-8.3 - $packet = Strings::packSSH2('ss', $oldname, $newname); - if ($this->version >= 5) { - /* quoting https://datatracker.ietf.org/doc/html/draft-ietf-secsh-filexfer-05#section-6.5 , - - 'flags' is 0 or a combination of: - - SSH_FXP_RENAME_OVERWRITE 0x00000001 - SSH_FXP_RENAME_ATOMIC 0x00000002 - SSH_FXP_RENAME_NATIVE 0x00000004 - - (none of these are currently supported) */ - $packet .= "\0\0\0\0"; - } - $this->send_sftp_packet(NET_SFTP_RENAME, $packet); - - $response = $this->get_sftp_packet(); - if ($this->packet_type != NET_SFTP_STATUS) { - throw new \UnexpectedValueException('Expected NET_SFTP_STATUS. ' - . 'Got packet type: ' . $this->packet_type); - } - - // if $status isn't SSH_FX_OK it's probably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED - list($status) = Strings::unpackSSH2('N', $response); - if ($status != NET_SFTP_STATUS_OK) { - $this->logError($response, $status); - return false; - } - - // don't move the stat cache entry over since this operation could very well change the - // atime and mtime attributes - //$this->update_stat_cache($newname, $this->query_stat_cache($oldname)); - $this->remove_from_stat_cache($oldname); - $this->remove_from_stat_cache($newname); - - return true; - } - - /** - * Parse Time - * - * See '7.7. Times' of draft-ietf-secsh-filexfer-13 for more info. - * - * @param string $key - * @param int $flags - * @param string $response - * @return array - */ - private function parseTime($key, $flags, &$response) - { - $attr = []; - list($attr[$key]) = Strings::unpackSSH2('Q', $response); - if ($flags & NET_SFTP_ATTR_SUBSECOND_TIMES) { - list($attr[$key . '-nseconds']) = Strings::unpackSSH2('N', $response); - } - return $attr; - } - - /** - * Parse Attributes - * - * See '7. File Attributes' of draft-ietf-secsh-filexfer-13 for more info. - * - * @param string $response - * @return array - */ - protected function parseAttributes(&$response) - { - $attr = []; - - if ($this->version >= 4) { - list($flags, $attr['type']) = Strings::unpackSSH2('NC', $response); - } else { - list($flags) = Strings::unpackSSH2('N', $response); - } - - foreach (self::$attributes as $key => $value) { - switch ($flags & $key) { - case NET_SFTP_ATTR_UIDGID: - if ($this->version > 3) { - continue 2; - } - break; - case NET_SFTP_ATTR_CREATETIME: - case NET_SFTP_ATTR_MODIFYTIME: - case NET_SFTP_ATTR_ACL: - case NET_SFTP_ATTR_OWNERGROUP: - case NET_SFTP_ATTR_SUBSECOND_TIMES: - if ($this->version < 4) { - continue 2; - } - break; - case NET_SFTP_ATTR_BITS: - if ($this->version < 5) { - continue 2; - } - break; - case NET_SFTP_ATTR_ALLOCATION_SIZE: - case NET_SFTP_ATTR_TEXT_HINT: - case NET_SFTP_ATTR_MIME_TYPE: - case NET_SFTP_ATTR_LINK_COUNT: - case NET_SFTP_ATTR_UNTRANSLATED_NAME: - case NET_SFTP_ATTR_CTIME: - if ($this->version < 6) { - continue 2; - } - } - switch ($flags & $key) { - case NET_SFTP_ATTR_SIZE: // 0x00000001 - // The size attribute is defined as an unsigned 64-bit integer. - // The following will use floats on 32-bit platforms, if necessary. - // As can be seen in the BigInteger class, floats are generally - // IEEE 754 binary64 "double precision" on such platforms and - // as such can represent integers of at least 2^50 without loss - // of precision. Interpreted in filesize, 2^50 bytes = 1024 TiB. - list($attr['size']) = Strings::unpackSSH2('Q', $response); - break; - case NET_SFTP_ATTR_UIDGID: // 0x00000002 (SFTPv3 only) - list($attr['uid'], $attr['gid']) = Strings::unpackSSH2('NN', $response); - break; - case NET_SFTP_ATTR_PERMISSIONS: // 0x00000004 - list($attr['mode']) = Strings::unpackSSH2('N', $response); - $fileType = $this->parseMode($attr['mode']); - if ($this->version < 4 && $fileType !== false) { - $attr += ['type' => $fileType]; - } - break; - case NET_SFTP_ATTR_ACCESSTIME: // 0x00000008 - if ($this->version >= 4) { - $attr += $this->parseTime('atime', $flags, $response); - break; - } - list($attr['atime'], $attr['mtime']) = Strings::unpackSSH2('NN', $response); - break; - case NET_SFTP_ATTR_CREATETIME: // 0x00000010 (SFTPv4+) - $attr += $this->parseTime('createtime', $flags, $response); - break; - case NET_SFTP_ATTR_MODIFYTIME: // 0x00000020 - $attr += $this->parseTime('mtime', $flags, $response); - break; - case NET_SFTP_ATTR_ACL: // 0x00000040 - // access control list - // see https://datatracker.ietf.org/doc/html/draft-ietf-secsh-filexfer-04#section-5.7 - // currently unsupported - list($count) = Strings::unpackSSH2('N', $response); - for ($i = 0; $i < $count; $i++) { - list($type, $flag, $mask, $who) = Strings::unpackSSH2('N3s', $result); - } - break; - case NET_SFTP_ATTR_OWNERGROUP: // 0x00000080 - list($attr['owner'], $attr['$group']) = Strings::unpackSSH2('ss', $response); - break; - case NET_SFTP_ATTR_SUBSECOND_TIMES: // 0x00000100 - break; - case NET_SFTP_ATTR_BITS: // 0x00000200 (SFTPv5+) - // see https://datatracker.ietf.org/doc/html/draft-ietf-secsh-filexfer-05#section-5.8 - // currently unsupported - // tells if you file is: - // readonly, system, hidden, case inensitive, archive, encrypted, compressed, sparse - // append only, immutable, sync - list($attrib_bits, $attrib_bits_valid) = Strings::unpackSSH2('N2', $response); - // if we were actually gonna implement the above it ought to be - // $attr['attrib-bits'] and $attr['attrib-bits-valid'] - // eg. - instead of _ - break; - case NET_SFTP_ATTR_ALLOCATION_SIZE: // 0x00000400 (SFTPv6+) - // see https://datatracker.ietf.org/doc/html/draft-ietf-secsh-filexfer-13#section-7.4 - // represents the number of bytes that the file consumes on the disk. will - // usually be larger than the 'size' field - list($attr['allocation-size']) = Strings::unpackSSH2('Q', $response); - break; - case NET_SFTP_ATTR_TEXT_HINT: // 0x00000800 - // https://datatracker.ietf.org/doc/html/draft-ietf-secsh-filexfer-13#section-7.10 - // currently unsupported - // tells if file is "known text", "guessed text", "known binary", "guessed binary" - list($text_hint) = Strings::unpackSSH2('C', $response); - // the above should be $attr['text-hint'] - break; - case NET_SFTP_ATTR_MIME_TYPE: // 0x00001000 - // see https://datatracker.ietf.org/doc/html/draft-ietf-secsh-filexfer-13#section-7.11 - list($attr['mime-type']) = Strings::unpackSSH2('s', $response); - break; - case NET_SFTP_ATTR_LINK_COUNT: // 0x00002000 - // see https://datatracker.ietf.org/doc/html/draft-ietf-secsh-filexfer-13#section-7.12 - list($attr['link-count']) = Strings::unpackSSH2('N', $response); - break; - case NET_SFTP_ATTR_UNTRANSLATED_NAME:// 0x00004000 - // see https://datatracker.ietf.org/doc/html/draft-ietf-secsh-filexfer-13#section-7.13 - list($attr['untranslated-name']) = Strings::unpackSSH2('s', $response); - break; - case NET_SFTP_ATTR_CTIME: // 0x00008000 - // 'ctime' contains the last time the file attributes were changed. The - // exact meaning of this field depends on the server. - $attr += $this->parseTime('ctime', $flags, $response); - break; - case NET_SFTP_ATTR_EXTENDED: // 0x80000000 - list($count) = Strings::unpackSSH2('N', $response); - for ($i = 0; $i < $count; $i++) { - list($key, $value) = Strings::unpackSSH2('ss', $response); - $attr[$key] = $value; - } - } - } - return $attr; - } - - /** - * Attempt to identify the file type - * - * Quoting the SFTP RFC, "Implementations MUST NOT send bits that are not defined" but they seem to anyway - * - * @param int $mode - * @return int - */ - private function parseMode($mode) - { - // values come from http://lxr.free-electrons.com/source/include/uapi/linux/stat.h#L12 - // see, also, http://linux.die.net/man/2/stat - switch ($mode & 0170000) {// ie. 1111 0000 0000 0000 - case 0000000: // no file type specified - figure out the file type using alternative means - return false; - case 0040000: - return NET_SFTP_TYPE_DIRECTORY; - case 0100000: - return NET_SFTP_TYPE_REGULAR; - case 0120000: - return NET_SFTP_TYPE_SYMLINK; - // new types introduced in SFTPv5+ - // http://tools.ietf.org/html/draft-ietf-secsh-filexfer-05#section-5.2 - case 0010000: // named pipe (fifo) - return NET_SFTP_TYPE_FIFO; - case 0020000: // character special - return NET_SFTP_TYPE_CHAR_DEVICE; - case 0060000: // block special - return NET_SFTP_TYPE_BLOCK_DEVICE; - case 0140000: // socket - return NET_SFTP_TYPE_SOCKET; - case 0160000: // whiteout - // "SPECIAL should be used for files that are of - // a known type which cannot be expressed in the protocol" - return NET_SFTP_TYPE_SPECIAL; - default: - return NET_SFTP_TYPE_UNKNOWN; - } - } - - /** - * Parse Longname - * - * SFTPv3 doesn't provide any easy way of identifying a file type. You could try to open - * a file as a directory and see if an error is returned or you could try to parse the - * SFTPv3-specific longname field of the SSH_FXP_NAME packet. That's what this function does. - * The result is returned using the - * {@link http://tools.ietf.org/html/draft-ietf-secsh-filexfer-04#section-5.2 SFTPv4 type constants}. - * - * If the longname is in an unrecognized format bool(false) is returned. - * - * @param string $longname - * @return mixed - */ - private function parseLongname($longname) - { - // http://en.wikipedia.org/wiki/Unix_file_types - // http://en.wikipedia.org/wiki/Filesystem_permissions#Notation_of_traditional_Unix_permissions - if (preg_match('#^[^/]([r-][w-][xstST-]){3}#', $longname)) { - switch ($longname[0]) { - case '-': - return NET_SFTP_TYPE_REGULAR; - case 'd': - return NET_SFTP_TYPE_DIRECTORY; - case 'l': - return NET_SFTP_TYPE_SYMLINK; - default: - return NET_SFTP_TYPE_SPECIAL; - } - } - - return false; - } - - /** - * Sends SFTP Packets - * - * See '6. General Packet Format' of draft-ietf-secsh-filexfer-13 for more info. - * - * @param int $type - * @param string $data - * @param int $request_id - * @see self::_get_sftp_packet() - * @see self::send_channel_packet() - * @return void - */ - private function send_sftp_packet($type, $data, $request_id = 1) - { - // in SSH2.php the timeout is cumulative per function call. eg. exec() will - // timeout after 10s. but for SFTP.php it's cumulative per packet - $this->curTimeout = $this->timeout; - $this->is_timeout = false; - - $packet = $this->use_request_id ? - pack('NCNa*', strlen($data) + 5, $type, $request_id, $data) : - pack('NCa*', strlen($data) + 1, $type, $data); - - $start = microtime(true); - $this->send_channel_packet(self::CHANNEL, $packet); - $stop = microtime(true); - - if (defined('NET_SFTP_LOGGING')) { - $packet_type = '-> ' . self::$packet_types[$type] . - ' (' . round($stop - $start, 4) . 's)'; - $this->append_log($packet_type, $data); - } - } - - /** - * Resets the SFTP channel for re-use - */ - private function reset_sftp() - { - $this->use_request_id = false; - $this->pwd = false; - $this->requestBuffer = []; - $this->partial_init = false; - } - - /** - * Resets a connection for re-use - */ - protected function reset_connection() - { - parent::reset_connection(); - $this->reset_sftp(); - } - - /** - * Receives SFTP Packets - * - * See '6. General Packet Format' of draft-ietf-secsh-filexfer-13 for more info. - * - * Incidentally, the number of SSH_MSG_CHANNEL_DATA messages has no bearing on the number of SFTP packets present. - * There can be one SSH_MSG_CHANNEL_DATA messages containing two SFTP packets or there can be two SSH_MSG_CHANNEL_DATA - * messages containing one SFTP packet. - * - * @see self::_send_sftp_packet() - * @return string - */ - private function get_sftp_packet($request_id = null) - { - $this->channel_close = false; - - if (isset($request_id) && isset($this->requestBuffer[$request_id])) { - $this->packet_type = $this->requestBuffer[$request_id]['packet_type']; - $temp = $this->requestBuffer[$request_id]['packet']; - unset($this->requestBuffer[$request_id]); - return $temp; - } - - // in SSH2.php the timeout is cumulative per function call. eg. exec() will - // timeout after 10s. but for SFTP.php it's cumulative per packet - $this->curTimeout = $this->timeout; - $this->is_timeout = false; - - $start = microtime(true); - - // SFTP packet length - while (strlen($this->packet_buffer) < 4) { - $temp = $this->get_channel_packet(self::CHANNEL, true); - if ($temp === true) { - if ($this->channel_status[self::CHANNEL] === NET_SSH2_MSG_CHANNEL_CLOSE) { - $this->channel_close = true; - } - $this->packet_type = false; - $this->packet_buffer = ''; - return false; - } - $this->packet_buffer .= $temp; - } - if (strlen($this->packet_buffer) < 4) { - throw new \RuntimeException('Packet is too small'); - } - $length = unpack('Nlength', Strings::shift($this->packet_buffer, 4))['length']; - - $tempLength = $length; - $tempLength -= strlen($this->packet_buffer); - - // 256 * 1024 is what SFTP_MAX_MSG_LENGTH is set to in OpenSSH's sftp-common.h - if (!$this->allow_arbitrary_length_packets && !$this->use_request_id && $tempLength > 256 * 1024) { - throw new \RuntimeException('Invalid Size'); - } - - // SFTP packet type and data payload - while ($tempLength > 0) { - $temp = $this->get_channel_packet(self::CHANNEL, true); - if ($temp === true) { - if ($this->channel_status[self::CHANNEL] === NET_SSH2_MSG_CHANNEL_CLOSE) { - $this->channel_close = true; - } - $this->packet_type = false; - $this->packet_buffer = ''; - return false; - } - $this->packet_buffer .= $temp; - $tempLength -= strlen($temp); - } - - $stop = microtime(true); - - $this->packet_type = ord(Strings::shift($this->packet_buffer)); - - if ($this->use_request_id) { - $packet_id = unpack('Npacket_id', Strings::shift($this->packet_buffer, 4))['packet_id']; // remove the request id - $length -= 5; // account for the request id and the packet type - } else { - $length -= 1; // account for the packet type - } - - $packet = Strings::shift($this->packet_buffer, $length); - - if (defined('NET_SFTP_LOGGING')) { - $packet_type = '<- ' . self::$packet_types[$this->packet_type] . - ' (' . round($stop - $start, 4) . 's)'; - $this->append_log($packet_type, $packet); - } - - if (isset($request_id) && $this->use_request_id && $packet_id != $request_id) { - $this->requestBuffer[$packet_id] = [ - 'packet_type' => $this->packet_type, - 'packet' => $packet - ]; - return $this->get_sftp_packet($request_id); - } - - return $packet; - } - - /** - * Logs data packets - * - * Makes sure that only the last 1MB worth of packets will be logged - * - * @param string $message_number - * @param string $message - */ - private function append_log($message_number, $message) - { - $this->append_log_helper( - NET_SFTP_LOGGING, - $message_number, - $message, - $this->packet_type_log, - $this->packet_log, - $this->log_size, - $this->realtime_log_file, - $this->realtime_log_wrap, - $this->realtime_log_size - ); - } - - /** - * Returns a log of the packets that have been sent and received. - * - * Returns a string if NET_SFTP_LOGGING == self::LOG_COMPLEX, an array if NET_SFTP_LOGGING == self::LOG_SIMPLE and false if !defined('NET_SFTP_LOGGING') - * - * @return array|string|false - */ - public function getSFTPLog() - { - if (!defined('NET_SFTP_LOGGING')) { - return false; - } - - switch (NET_SFTP_LOGGING) { - case self::LOG_COMPLEX: - return $this->format_log($this->packet_log, $this->packet_type_log); - break; - //case self::LOG_SIMPLE: - default: - return $this->packet_type_log; - } - } - - /** - * Returns all errors on the SFTP layer - * - * @return array - */ - public function getSFTPErrors() - { - return $this->sftp_errors; - } - - /** - * Returns the last error on the SFTP layer - * - * @return string - */ - public function getLastSFTPError() - { - return count($this->sftp_errors) ? $this->sftp_errors[count($this->sftp_errors) - 1] : ''; - } - - /** - * Get supported SFTP versions - * - * @return array - */ - public function getSupportedVersions() - { - if (!($this->bitmap & SSH2::MASK_LOGIN)) { - return false; - } - - if (!$this->partial_init) { - $this->partial_init_sftp_connection(); - } - - $temp = ['version' => $this->defaultVersion]; - if (isset($this->extensions['versions'])) { - $temp['extensions'] = $this->extensions['versions']; - } - return $temp; - } - - /** - * Get supported SFTP extensions - * - * @return array - */ - public function getSupportedExtensions() - { - if (!($this->bitmap & SSH2::MASK_LOGIN)) { - return false; - } - - if (!$this->partial_init) { - $this->partial_init_sftp_connection(); - } - - return $this->extensions; - } - - /** - * Get supported SFTP versions - * - * @return int|false - */ - public function getNegotiatedVersion() - { - if (!$this->precheck()) { - return false; - } - - return $this->version; - } - - /** - * Set preferred version - * - * If you're preferred version isn't supported then the highest supported - * version of SFTP will be utilized. Set to null or false or int(0) to - * unset the preferred version - * - * @param int $version - */ - public function setPreferredVersion($version) - { - $this->preferredVersion = $version; - } - - /** - * Disconnect - * - * @param int $reason - * @return false - */ - protected function disconnect_helper($reason) - { - $this->pwd = false; - return parent::disconnect_helper($reason); - } - - /** - * Enable Date Preservation - */ - public function enableDatePreservation() - { - $this->preserveTime = true; - } - - /** - * Disable Date Preservation - */ - public function disableDatePreservation() - { - $this->preserveTime = false; - } - - /** - * Copy - * - * This method (currently) only works if the copy-data extension is available - * - * @param string $oldname - * @param string $newname - * @return bool - */ - public function copy($oldname, $newname) - { - if (!$this->precheck()) { - return false; - } - - $oldname = $this->realpath($oldname); - $newname = $this->realpath($newname); - if ($oldname === false || $newname === false) { - return false; - } - - if (!isset($this->extensions['copy-data']) || $this->extensions['copy-data'] !== '1') { - throw new \RuntimeException( - "Extension 'copy-data' is not supported by the server. " . - "Call getSupportedVersions() to see a list of supported extension" - ); - } - - $size = $this->filesize($oldname); - - $packet = Strings::packSSH2('s', $oldname); - $packet .= $this->version >= 5 ? - pack('N3', 0, NET_SFTP_OPEN_OPEN_EXISTING, 0) : - pack('N2', NET_SFTP_OPEN_READ, 0); - $this->send_sftp_packet(NET_SFTP_OPEN, $packet); - - $response = $this->get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_HANDLE: - $oldhandle = substr($response, 4); - break; - case NET_SFTP_STATUS: // presumably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED - $this->logError($response); - return false; - default: - throw new \UnexpectedValueException('Expected NET_SFTP_HANDLE or NET_SFTP_STATUS. ' - . 'Got packet type: ' . $this->packet_type); - } - - if ($this->version >= 5) { - $flags = NET_SFTP_OPEN_OPEN_OR_CREATE; - } else { - $flags = NET_SFTP_OPEN_WRITE | NET_SFTP_OPEN_CREATE; - } - - $packet = Strings::packSSH2('s', $newname); - $packet .= $this->version >= 5 ? - pack('N3', 0, $flags, 0) : - pack('N2', $flags, 0); - $this->send_sftp_packet(NET_SFTP_OPEN, $packet); - - $response = $this->get_sftp_packet(); - switch ($this->packet_type) { - case NET_SFTP_HANDLE: - $newhandle = substr($response, 4); - break; - case NET_SFTP_STATUS: - $this->logError($response); - return false; - default: - throw new \UnexpectedValueException('Expected NET_SFTP_HANDLE or NET_SFTP_STATUS. ' - . 'Got packet type: ' . $this->packet_type); - } - - $packet = Strings::packSSH2('ssQQsQ', 'copy-data', $oldhandle, 0, $size, $newhandle, 0); - $this->send_sftp_packet(NET_SFTP_EXTENDED, $packet); - - $response = $this->get_sftp_packet(); - if ($this->packet_type != NET_SFTP_STATUS) { - throw new \UnexpectedValueException('Expected NET_SFTP_STATUS. ' - . 'Got packet type: ' . $this->packet_type); - } - - $this->close_handle($oldhandle); - $this->close_handle($newhandle); - - return true; - } - - /** - * POSIX Rename - * - * Where rename() fails "if there already exists a file with the name specified by newpath" - * (draft-ietf-secsh-filexfer-02#section-6.5), posix_rename() overwrites the existing file in an atomic fashion. - * ie. "there is no observable instant in time where the name does not refer to either the old or the new file" - * (draft-ietf-secsh-filexfer-13#page-39). - * - * @param string $oldname - * @param string $newname - * @return bool - */ - public function posix_rename($oldname, $newname) - { - if (!$this->precheck()) { - return false; - } - - $oldname = $this->realpath($oldname); - $newname = $this->realpath($newname); - if ($oldname === false || $newname === false) { - return false; - } - - if ($this->version >= 5) { - $packet = Strings::packSSH2('ssN', $oldname, $newname, 2); // 2 = SSH_FXP_RENAME_ATOMIC - $this->send_sftp_packet(NET_SFTP_RENAME, $packet); - } elseif (isset($this->extensions['posix-rename@openssh.com']) && $this->extensions['posix-rename@openssh.com'] === '1') { - $packet = Strings::packSSH2('sss', 'posix-rename@openssh.com', $oldname, $newname); - $this->send_sftp_packet(NET_SFTP_EXTENDED, $packet); - } else { - throw new \RuntimeException( - "Extension 'posix-rename@openssh.com' is not supported by the server. " . - "Call getSupportedVersions() to see a list of supported extension" - ); - } - - $response = $this->get_sftp_packet(); - if ($this->packet_type != NET_SFTP_STATUS) { - throw new \UnexpectedValueException('Expected NET_SFTP_STATUS. ' - . 'Got packet type: ' . $this->packet_type); - } - - // if $status isn't SSH_FX_OK it's probably SSH_FX_NO_SUCH_FILE or SSH_FX_PERMISSION_DENIED - list($status) = Strings::unpackSSH2('N', $response); - if ($status != NET_SFTP_STATUS_OK) { - $this->logError($response, $status); - return false; - } - - // don't move the stat cache entry over since this operation could very well change the - // atime and mtime attributes - //$this->update_stat_cache($newname, $this->query_stat_cache($oldname)); - $this->remove_from_stat_cache($oldname); - $this->remove_from_stat_cache($newname); - - return true; - } - - /** - * Returns general information about a file system. - * - * The function statvfs() returns information about a mounted filesystem. - * @see https://man7.org/linux/man-pages/man3/statvfs.3.html - * - * @param string $path - * @return false|array{bsize: int, frsize: int, blocks: int, bfree: int, bavail: int, files: int, ffree: int, favail: int, fsid: int, flag: int, namemax: int} - */ - public function statvfs($path) - { - if (!$this->precheck()) { - return false; - } - - if (!isset($this->extensions['statvfs@openssh.com']) || $this->extensions['statvfs@openssh.com'] !== '2') { - throw new \RuntimeException( - "Extension 'statvfs@openssh.com' is not supported by the server. " . - "Call getSupportedVersions() to see a list of supported extension" - ); - } - - $realpath = $this->realpath($path); - if ($realpath === false) { - return false; - } - - $packet = Strings::packSSH2('ss', 'statvfs@openssh.com', $realpath); - $this->send_sftp_packet(NET_SFTP_EXTENDED, $packet); - - $response = $this->get_sftp_packet(); - if ($this->packet_type !== NET_SFTP_EXTENDED_REPLY) { - throw new \UnexpectedValueException( - 'Expected SSH_FXP_EXTENDED_REPLY. ' - . 'Got packet type: ' . $this->packet_type - ); - } - - /** - * These requests return a SSH_FXP_STATUS reply on failure. On success they - * return the following SSH_FXP_EXTENDED_REPLY reply: - * - * uint32 id - * uint64 f_bsize file system block size - * uint64 f_frsize fundamental fs block size - * uint64 f_blocks number of blocks (unit f_frsize) - * uint64 f_bfree free blocks in file system - * uint64 f_bavail free blocks for non-root - * uint64 f_files total file inodes - * uint64 f_ffree free file inodes - * uint64 f_favail free file inodes for to non-root - * uint64 f_fsid file system id - * uint64 f_flag bit mask of f_flag values - * uint64 f_namemax maximum filename length - */ - return array_combine( - ['bsize', 'frsize', 'blocks', 'bfree', 'bavail', 'files', 'ffree', 'favail', 'fsid', 'flag', 'namemax'], - Strings::unpackSSH2('QQQQQQQQQQQ', $response) - ); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Net/SFTP/Stream.php b/composer/phpseclib/phpseclib/phpseclib/Net/SFTP/Stream.php deleted file mode 100644 index a77fa97..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Net/SFTP/Stream.php +++ /dev/null @@ -1,764 +0,0 @@ - - * @copyright 2013 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Net\SFTP; - -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\PrivateKey; -use OCA\Libresign\Vendor\phpseclib3\Net\SFTP; -use OCA\Libresign\Vendor\phpseclib3\Net\SSH2; - -/** - * SFTP Stream Wrapper - * - * @author Jim Wigginton - */ -class Stream -{ - /** - * SFTP instances - * - * Rather than re-create the connection we re-use instances if possible - * - * @var array - */ - public static $instances; - - /** - * SFTP instance - * - * @var object - */ - private $sftp; - - /** - * Path - * - * @var string - */ - private $path; - - /** - * Mode - * - * @var string - */ - private $mode; - - /** - * Position - * - * @var int - */ - private $pos; - - /** - * Size - * - * @var int - */ - private $size; - - /** - * Directory entries - * - * @var array - */ - private $entries; - - /** - * EOF flag - * - * @var bool - */ - private $eof; - - /** - * Context resource - * - * Technically this needs to be publicly accessible so PHP can set it directly - * - * @var resource - */ - public $context; - - /** - * Notification callback function - * - * @var callable - */ - private $notification; - - /** - * Registers this class as a URL wrapper. - * - * @param string $protocol The wrapper name to be registered. - * @return bool True on success, false otherwise. - */ - public static function register($protocol = 'sftp') - { - if (in_array($protocol, stream_get_wrappers(), true)) { - return false; - } - return stream_wrapper_register($protocol, get_called_class()); - } - - /** - * The Constructor - * - */ - public function __construct() - { - if (defined('NET_SFTP_STREAM_LOGGING')) { - echo "__construct()\r\n"; - } - } - - /** - * Path Parser - * - * Extract a path from a URI and actually connect to an SSH server if appropriate - * - * If "notification" is set as a context parameter the message code for successful login is - * NET_SSH2_MSG_USERAUTH_SUCCESS. For a failed login it's NET_SSH2_MSG_USERAUTH_FAILURE. - * - * @param string $path - * @return string - */ - protected function parse_path($path) - { - $orig = $path; - $url = parse_url($path) + ['port' => 22]; - - $keys = ['scheme', 'host', 'port', 'user', 'pass', 'path', 'query', 'fragment']; - foreach ($keys as $key) { - if (isset($url[$key])) { - $$key = $url[$key]; - } - } - - if (isset($query)) { - $path .= '?' . $query; - } elseif (preg_match('/(\?|\?#)$/', $orig)) { - $path .= '?'; - } - if (isset($fragment)) { - $path .= '#' . $fragment; - } elseif ($orig[strlen($orig) - 1] == '#') { - $path .= '#'; - } - - if (!isset($host)) { - return false; - } - - if (isset($this->context)) { - $context = stream_context_get_params($this->context); - if (isset($context['notification'])) { - $this->notification = $context['notification']; - } - } - - if (preg_match('/^{[a-z0-9]+}$/i', $host)) { - $host = SSH2::getConnectionByResourceId($host); - if ($host === false) { - return false; - } - $this->sftp = $host; - } else { - if (isset($this->context)) { - $context = stream_context_get_options($this->context); - } - if (isset($context[$scheme]['session'])) { - $sftp = $context[$scheme]['session']; - } - if (isset($context[$scheme]['sftp'])) { - $sftp = $context[$scheme]['sftp']; - } - if (isset($sftp) && $sftp instanceof SFTP) { - $this->sftp = $sftp; - return $path; - } - if (isset($context[$scheme]['username'])) { - $user = $context[$scheme]['username']; - } - if (isset($context[$scheme]['password'])) { - $pass = $context[$scheme]['password']; - } - if (isset($context[$scheme]['privkey']) && $context[$scheme]['privkey'] instanceof PrivateKey) { - $pass = $context[$scheme]['privkey']; - } - - if (!isset($user) || !isset($pass)) { - return false; - } - - // casting $pass to a string is necessary in the event that it's a \phpseclib3\Crypt\RSA object - if (isset(self::$instances[$host][$port][$user][(string) $pass])) { - $this->sftp = self::$instances[$host][$port][$user][(string) $pass]; - } else { - $this->sftp = new SFTP($host, $port); - $this->sftp->disableStatCache(); - if (isset($this->notification) && is_callable($this->notification)) { - /* if !is_callable($this->notification) we could do this: - - user_error('fopen(): failed to call user notifier', E_USER_WARNING); - - the ftp wrapper gives errors like that when the notifier isn't callable. - i've opted not to do that, however, since the ftp wrapper gives the line - on which the fopen occurred as the line number - not the line that the - user_error is on. - */ - call_user_func($this->notification, STREAM_NOTIFY_CONNECT, STREAM_NOTIFY_SEVERITY_INFO, '', 0, 0, 0); - call_user_func($this->notification, STREAM_NOTIFY_AUTH_REQUIRED, STREAM_NOTIFY_SEVERITY_INFO, '', 0, 0, 0); - if (!$this->sftp->login($user, $pass)) { - call_user_func($this->notification, STREAM_NOTIFY_AUTH_RESULT, STREAM_NOTIFY_SEVERITY_ERR, 'Login Failure', NET_SSH2_MSG_USERAUTH_FAILURE, 0, 0); - return false; - } - call_user_func($this->notification, STREAM_NOTIFY_AUTH_RESULT, STREAM_NOTIFY_SEVERITY_INFO, 'Login Success', NET_SSH2_MSG_USERAUTH_SUCCESS, 0, 0); - } else { - if (!$this->sftp->login($user, $pass)) { - return false; - } - } - self::$instances[$host][$port][$user][(string) $pass] = $this->sftp; - } - } - - return $path; - } - - /** - * Opens file or URL - * - * @param string $path - * @param string $mode - * @param int $options - * @param string $opened_path - * @return bool - */ - private function _stream_open($path, $mode, $options, &$opened_path) - { - $path = $this->parse_path($path); - - if ($path === false) { - return false; - } - $this->path = $path; - - $this->size = $this->sftp->filesize($path); - $this->mode = preg_replace('#[bt]$#', '', $mode); - $this->eof = false; - - if ($this->size === false) { - if ($this->mode[0] == 'r') { - return false; - } else { - $this->sftp->touch($path); - $this->size = 0; - } - } else { - switch ($this->mode[0]) { - case 'x': - return false; - case 'w': - $this->sftp->truncate($path, 0); - $this->size = 0; - } - } - - $this->pos = $this->mode[0] != 'a' ? 0 : $this->size; - - return true; - } - - /** - * Read from stream - * - * @param int $count - * @return mixed - */ - private function _stream_read($count) - { - switch ($this->mode) { - case 'w': - case 'a': - case 'x': - case 'c': - return false; - } - - // commented out because some files - eg. /dev/urandom - will say their size is 0 when in fact it's kinda infinite - //if ($this->pos >= $this->size) { - // $this->eof = true; - // return false; - //} - - $result = $this->sftp->get($this->path, false, $this->pos, $count); - if (isset($this->notification) && is_callable($this->notification)) { - if ($result === false) { - call_user_func($this->notification, STREAM_NOTIFY_FAILURE, STREAM_NOTIFY_SEVERITY_ERR, $this->sftp->getLastSFTPError(), NET_SFTP_OPEN, 0, 0); - return 0; - } - // seems that PHP calls stream_read in 8k chunks - call_user_func($this->notification, STREAM_NOTIFY_PROGRESS, STREAM_NOTIFY_SEVERITY_INFO, '', 0, strlen($result), $this->size); - } - - if (empty($result)) { // ie. false or empty string - $this->eof = true; - return false; - } - $this->pos += strlen($result); - - return $result; - } - - /** - * Write to stream - * - * @param string $data - * @return int|false - */ - private function _stream_write($data) - { - switch ($this->mode) { - case 'r': - return false; - } - - $result = $this->sftp->put($this->path, $data, SFTP::SOURCE_STRING, $this->pos); - if (isset($this->notification) && is_callable($this->notification)) { - if (!$result) { - call_user_func($this->notification, STREAM_NOTIFY_FAILURE, STREAM_NOTIFY_SEVERITY_ERR, $this->sftp->getLastSFTPError(), NET_SFTP_OPEN, 0, 0); - return 0; - } - // seems that PHP splits up strings into 8k blocks before calling stream_write - call_user_func($this->notification, STREAM_NOTIFY_PROGRESS, STREAM_NOTIFY_SEVERITY_INFO, '', 0, strlen($data), strlen($data)); - } - - if ($result === false) { - return false; - } - $this->pos += strlen($data); - if ($this->pos > $this->size) { - $this->size = $this->pos; - } - $this->eof = false; - return strlen($data); - } - - /** - * Retrieve the current position of a stream - * - * @return int - */ - private function _stream_tell() - { - return $this->pos; - } - - /** - * Tests for end-of-file on a file pointer - * - * In my testing there are four classes functions that normally effect the pointer: - * fseek, fputs / fwrite, fgets / fread and ftruncate. - * - * Only fgets / fread, however, results in feof() returning true. do fputs($fp, 'aaa') on a blank file and feof() - * will return false. do fread($fp, 1) and feof() will then return true. do fseek($fp, 10) on ablank file and feof() - * will return false. do fread($fp, 1) and feof() will then return true. - * - * @return bool - */ - private function _stream_eof() - { - return $this->eof; - } - - /** - * Seeks to specific location in a stream - * - * @param int $offset - * @param int $whence - * @return bool - */ - private function _stream_seek($offset, $whence) - { - switch ($whence) { - case SEEK_SET: - if ($offset < 0) { - return false; - } - break; - case SEEK_CUR: - $offset += $this->pos; - break; - case SEEK_END: - $offset += $this->size; - } - - $this->pos = $offset; - $this->eof = false; - return true; - } - - /** - * Change stream options - * - * @param string $path - * @param int $option - * @param mixed $var - * @return bool - */ - private function _stream_metadata($path, $option, $var) - { - $path = $this->parse_path($path); - if ($path === false) { - return false; - } - - // stream_metadata was introduced in PHP 5.4.0 but as of 5.4.11 the constants haven't been defined - // see http://www.php.net/streamwrapper.stream-metadata and https://bugs.php.net/64246 - // and https://github.com/php/php-src/blob/master/main/php_streams.h#L592 - switch ($option) { - case 1: // PHP_STREAM_META_TOUCH - $time = isset($var[0]) ? $var[0] : null; - $atime = isset($var[1]) ? $var[1] : null; - return $this->sftp->touch($path, $time, $atime); - case 2: // PHP_STREAM_OWNER_NAME - case 3: // PHP_STREAM_GROUP_NAME - return false; - case 4: // PHP_STREAM_META_OWNER - return $this->sftp->chown($path, $var); - case 5: // PHP_STREAM_META_GROUP - return $this->sftp->chgrp($path, $var); - case 6: // PHP_STREAM_META_ACCESS - return $this->sftp->chmod($path, $var) !== false; - } - } - - /** - * Retrieve the underlaying resource - * - * @param int $cast_as - * @return resource - */ - private function _stream_cast($cast_as) - { - return $this->sftp->fsock; - } - - /** - * Advisory file locking - * - * @param int $operation - * @return bool - */ - private function _stream_lock($operation) - { - return false; - } - - /** - * Renames a file or directory - * - * Attempts to rename oldname to newname, moving it between directories if necessary. - * If newname exists, it will be overwritten. This is a departure from what \phpseclib3\Net\SFTP - * does. - * - * @param string $path_from - * @param string $path_to - * @return bool - */ - private function _rename($path_from, $path_to) - { - $path1 = parse_url($path_from); - $path2 = parse_url($path_to); - unset($path1['path'], $path2['path']); - if ($path1 != $path2) { - return false; - } - - $path_from = $this->parse_path($path_from); - $path_to = parse_url($path_to); - if ($path_from === false) { - return false; - } - - $path_to = $path_to['path']; // the $component part of parse_url() was added in PHP 5.1.2 - // "It is an error if there already exists a file with the name specified by newpath." - // -- http://tools.ietf.org/html/draft-ietf-secsh-filexfer-02#section-6.5 - if (!$this->sftp->rename($path_from, $path_to)) { - if ($this->sftp->stat($path_to)) { - return $this->sftp->delete($path_to, true) && $this->sftp->rename($path_from, $path_to); - } - return false; - } - - return true; - } - - /** - * Open directory handle - * - * The only $options is "whether or not to enforce safe_mode (0x04)". Since safe mode was deprecated in 5.3 and - * removed in 5.4 I'm just going to ignore it. - * - * Also, nlist() is the best that this function is realistically going to be able to do. When an SFTP client - * sends a SSH_FXP_READDIR packet you don't generally get info on just one file but on multiple files. Quoting - * the SFTP specs: - * - * The SSH_FXP_NAME response has the following format: - * - * uint32 id - * uint32 count - * repeats count times: - * string filename - * string longname - * ATTRS attrs - * - * @param string $path - * @param int $options - * @return bool - */ - private function _dir_opendir($path, $options) - { - $path = $this->parse_path($path); - if ($path === false) { - return false; - } - $this->pos = 0; - $this->entries = $this->sftp->nlist($path); - return $this->entries !== false; - } - - /** - * Read entry from directory handle - * - * @return mixed - */ - private function _dir_readdir() - { - if (isset($this->entries[$this->pos])) { - return $this->entries[$this->pos++]; - } - return false; - } - - /** - * Rewind directory handle - * - * @return bool - */ - private function _dir_rewinddir() - { - $this->pos = 0; - return true; - } - - /** - * Close directory handle - * - * @return bool - */ - private function _dir_closedir() - { - return true; - } - - /** - * Create a directory - * - * Only valid $options is STREAM_MKDIR_RECURSIVE - * - * @param string $path - * @param int $mode - * @param int $options - * @return bool - */ - private function _mkdir($path, $mode, $options) - { - $path = $this->parse_path($path); - if ($path === false) { - return false; - } - - return $this->sftp->mkdir($path, $mode, $options & STREAM_MKDIR_RECURSIVE); - } - - /** - * Removes a directory - * - * Only valid $options is STREAM_MKDIR_RECURSIVE per , however, - * does not have a $recursive parameter as mkdir() does so I don't know how - * STREAM_MKDIR_RECURSIVE is supposed to be set. Also, when I try it out with rmdir() I get 8 as - * $options. What does 8 correspond to? - * - * @param string $path - * @param int $options - * @return bool - */ - private function _rmdir($path, $options) - { - $path = $this->parse_path($path); - if ($path === false) { - return false; - } - - return $this->sftp->rmdir($path); - } - - /** - * Flushes the output - * - * See . Always returns true because \phpseclib3\Net\SFTP doesn't cache stuff before writing - * - * @return bool - */ - private function _stream_flush() - { - return true; - } - - /** - * Retrieve information about a file resource - * - * @return mixed - */ - private function _stream_stat() - { - $results = $this->sftp->stat($this->path); - if ($results === false) { - return false; - } - return $results; - } - - /** - * Delete a file - * - * @param string $path - * @return bool - */ - private function _unlink($path) - { - $path = $this->parse_path($path); - if ($path === false) { - return false; - } - - return $this->sftp->delete($path, false); - } - - /** - * Retrieve information about a file - * - * Ignores the STREAM_URL_STAT_QUIET flag because the entirety of \phpseclib3\Net\SFTP\Stream is quiet by default - * might be worthwhile to reconstruct bits 12-16 (ie. the file type) if mode doesn't have them but we'll - * cross that bridge when and if it's reached - * - * @param string $path - * @param int $flags - * @return mixed - */ - private function _url_stat($path, $flags) - { - $path = $this->parse_path($path); - if ($path === false) { - return false; - } - - $results = $flags & STREAM_URL_STAT_LINK ? $this->sftp->lstat($path) : $this->sftp->stat($path); - if ($results === false) { - return false; - } - - return $results; - } - - /** - * Truncate stream - * - * @param int $new_size - * @return bool - */ - private function _stream_truncate($new_size) - { - if (!$this->sftp->truncate($this->path, $new_size)) { - return false; - } - - $this->eof = false; - $this->size = $new_size; - - return true; - } - - /** - * Change stream options - * - * STREAM_OPTION_WRITE_BUFFER isn't supported for the same reason stream_flush isn't. - * The other two aren't supported because of limitations in \phpseclib3\Net\SFTP. - * - * @param int $option - * @param int $arg1 - * @param int $arg2 - * @return bool - */ - private function _stream_set_option($option, $arg1, $arg2) - { - return false; - } - - /** - * Close an resource - * - */ - private function _stream_close() - { - } - - /** - * __call Magic Method - * - * When you're utilizing an SFTP stream you're not calling the methods in this class directly - PHP is calling them for you. - * Which kinda begs the question... what methods is PHP calling and what parameters is it passing to them? This function - * lets you figure that out. - * - * If NET_SFTP_STREAM_LOGGING is defined all calls will be output on the screen and then (regardless of whether or not - * NET_SFTP_STREAM_LOGGING is enabled) the parameters will be passed through to the appropriate method. - * - * @param string $name - * @param array $arguments - * @return mixed - */ - public function __call($name, array $arguments) - { - if (defined('NET_SFTP_STREAM_LOGGING')) { - echo $name . '('; - $last = count($arguments) - 1; - foreach ($arguments as $i => $argument) { - var_export($argument); - if ($i != $last) { - echo ','; - } - } - echo ")\r\n"; - } - $name = '_' . $name; - if (!method_exists($this, $name)) { - return false; - } - return $this->$name(...$arguments); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/Net/SSH2.php b/composer/phpseclib/phpseclib/phpseclib/Net/SSH2.php deleted file mode 100644 index 1da9e34..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/Net/SSH2.php +++ /dev/null @@ -1,5633 +0,0 @@ - - * login('username', 'password')) { - * exit('Login Failed'); - * } - * - * echo $ssh->exec('pwd'); - * echo $ssh->exec('ls -la'); - * ?> - * - * - * - * login('username', $key)) { - * exit('Login Failed'); - * } - * - * echo $ssh->read('username@username:~$'); - * $ssh->write("ls -la\n"); - * echo $ssh->read('username@username:~$'); - * ?> - * - * - * @author Jim Wigginton - * @copyright 2007 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\Net; - -use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Blowfish; -use OCA\Libresign\Vendor\phpseclib3\Crypt\ChaCha20; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\AsymmetricKey; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\PrivateKey; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\PublicKey; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\SymmetricKey; -use OCA\Libresign\Vendor\phpseclib3\Crypt\DH; -use OCA\Libresign\Vendor\phpseclib3\Crypt\DSA; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Hash; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Random; -use OCA\Libresign\Vendor\phpseclib3\Crypt\RC4; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Rijndael; -use OCA\Libresign\Vendor\phpseclib3\Crypt\RSA; -use OCA\Libresign\Vendor\phpseclib3\Crypt\TripleDES; // Used to do Diffie-Hellman key exchange and DSA/RSA signature verification. -use OCA\Libresign\Vendor\phpseclib3\Crypt\Twofish; -use OCA\Libresign\Vendor\phpseclib3\Exception\ConnectionClosedException; -use OCA\Libresign\Vendor\phpseclib3\Exception\InsufficientSetupException; -use OCA\Libresign\Vendor\phpseclib3\Exception\InvalidPacketLengthException; -use OCA\Libresign\Vendor\phpseclib3\Exception\NoSupportedAlgorithmsException; -use OCA\Libresign\Vendor\phpseclib3\Exception\TimeoutException; -use OCA\Libresign\Vendor\phpseclib3\Exception\UnableToConnectException; -use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedAlgorithmException; -use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedCurveException; -use OCA\Libresign\Vendor\phpseclib3\Math\BigInteger; -use OCA\Libresign\Vendor\phpseclib3\System\SSH\Agent; - -/** - * Pure-PHP implementation of SSHv2. - * - * @author Jim Wigginton - */ -class SSH2 -{ - /**#@+ - * Compression Types - * - */ - /** - * No compression - */ - const NET_SSH2_COMPRESSION_NONE = 1; - /** - * zlib compression - */ - const NET_SSH2_COMPRESSION_ZLIB = 2; - /** - * zlib@openssh.com - */ - const NET_SSH2_COMPRESSION_ZLIB_AT_OPENSSH = 3; - /**#@-*/ - - // Execution Bitmap Masks - const MASK_CONSTRUCTOR = 0x00000001; - const MASK_CONNECTED = 0x00000002; - const MASK_LOGIN_REQ = 0x00000004; - const MASK_LOGIN = 0x00000008; - const MASK_SHELL = 0x00000010; - const MASK_DISCONNECT = 0x00000020; - - /* - * Channel constants - * - * RFC4254 refers not to client and server channels but rather to sender and recipient channels. we don't refer - * to them in that way because RFC4254 toggles the meaning. the client sends a SSH_MSG_CHANNEL_OPEN message with - * a sender channel and the server sends a SSH_MSG_CHANNEL_OPEN_CONFIRMATION in response, with a sender and a - * recipient channel. at first glance, you might conclude that SSH_MSG_CHANNEL_OPEN_CONFIRMATION's sender channel - * would be the same thing as SSH_MSG_CHANNEL_OPEN's sender channel, but it's not, per this snippet: - * The 'recipient channel' is the channel number given in the original - * open request, and 'sender channel' is the channel number allocated by - * the other side. - * - * @see \phpseclib3\Net\SSH2::send_channel_packet() - * @see \phpseclib3\Net\SSH2::get_channel_packet() - */ - const CHANNEL_EXEC = 1; // PuTTy uses 0x100 - const CHANNEL_SHELL = 2; - const CHANNEL_SUBSYSTEM = 3; - const CHANNEL_AGENT_FORWARD = 4; - const CHANNEL_KEEP_ALIVE = 5; - - /** - * Returns the message numbers - * - * @see \phpseclib3\Net\SSH2::getLog() - */ - const LOG_SIMPLE = 1; - /** - * Returns the message content - * - * @see \phpseclib3\Net\SSH2::getLog() - */ - const LOG_COMPLEX = 2; - /** - * Outputs the content real-time - */ - const LOG_REALTIME = 3; - /** - * Dumps the content real-time to a file - */ - const LOG_REALTIME_FILE = 4; - /** - * Outputs the message numbers real-time - */ - const LOG_SIMPLE_REALTIME = 5; - /* - * Dumps the message numbers real-time - */ - const LOG_REALTIME_SIMPLE = 5; - /** - * Make sure that the log never gets larger than this - * - * @see \phpseclib3\Net\SSH2::getLog() - */ - const LOG_MAX_SIZE = 1048576; // 1024 * 1024 - - /** - * Returns when a string matching $expect exactly is found - * - * @see \phpseclib3\Net\SSH2::read() - */ - const READ_SIMPLE = 1; - /** - * Returns when a string matching the regular expression $expect is found - * - * @see \phpseclib3\Net\SSH2::read() - */ - const READ_REGEX = 2; - /** - * Returns whenever a data packet is received. - * - * Some data packets may only contain a single character so it may be necessary - * to call read() multiple times when using this option - * - * @see \phpseclib3\Net\SSH2::read() - */ - const READ_NEXT = 3; - - /** - * The SSH identifier - * - * @var string - */ - private $identifier; - - /** - * The Socket Object - * - * @var resource|closed-resource|null - */ - public $fsock; - - /** - * Execution Bitmap - * - * The bits that are set represent functions that have been called already. This is used to determine - * if a requisite function has been successfully executed. If not, an error should be thrown. - * - * @var int - */ - protected $bitmap = 0; - - /** - * Error information - * - * @see self::getErrors() - * @see self::getLastError() - * @var array - */ - private $errors = []; - - /** - * Server Identifier - * - * @see self::getServerIdentification() - * @var string|false - */ - protected $server_identifier = false; - - /** - * Key Exchange Algorithms - * - * @see self::getKexAlgorithims() - * @var array|false - */ - private $kex_algorithms = false; - - /** - * Key Exchange Algorithm - * - * @see self::getMethodsNegotiated() - * @var string|false - */ - private $kex_algorithm = false; - - /** - * Minimum Diffie-Hellman Group Bit Size in RFC 4419 Key Exchange Methods - * - * @see self::_key_exchange() - * @var int - */ - private $kex_dh_group_size_min = 1536; - - /** - * Preferred Diffie-Hellman Group Bit Size in RFC 4419 Key Exchange Methods - * - * @see self::_key_exchange() - * @var int - */ - private $kex_dh_group_size_preferred = 2048; - - /** - * Maximum Diffie-Hellman Group Bit Size in RFC 4419 Key Exchange Methods - * - * @see self::_key_exchange() - * @var int - */ - private $kex_dh_group_size_max = 4096; - - /** - * Server Host Key Algorithms - * - * @see self::getServerHostKeyAlgorithms() - * @var array|false - */ - private $server_host_key_algorithms = false; - - /** - * Supported Private Key Algorithms - * - * In theory this should be the same as the Server Host Key Algorithms but, in practice, - * some servers (eg. Azure) will support rsa-sha2-512 as a server host key algorithm but - * not a private key algorithm - * - * @see self::privatekey_login() - * @var array|false - */ - private $supported_private_key_algorithms = false; - - /** - * Encryption Algorithms: Client to Server - * - * @see self::getEncryptionAlgorithmsClient2Server() - * @var array|false - */ - private $encryption_algorithms_client_to_server = false; - - /** - * Encryption Algorithms: Server to Client - * - * @see self::getEncryptionAlgorithmsServer2Client() - * @var array|false - */ - private $encryption_algorithms_server_to_client = false; - - /** - * MAC Algorithms: Client to Server - * - * @see self::getMACAlgorithmsClient2Server() - * @var array|false - */ - private $mac_algorithms_client_to_server = false; - - /** - * MAC Algorithms: Server to Client - * - * @see self::getMACAlgorithmsServer2Client() - * @var array|false - */ - private $mac_algorithms_server_to_client = false; - - /** - * Compression Algorithms: Client to Server - * - * @see self::getCompressionAlgorithmsClient2Server() - * @var array|false - */ - private $compression_algorithms_client_to_server = false; - - /** - * Compression Algorithms: Server to Client - * - * @see self::getCompressionAlgorithmsServer2Client() - * @var array|false - */ - private $compression_algorithms_server_to_client = false; - - /** - * Languages: Server to Client - * - * @see self::getLanguagesServer2Client() - * @var array|false - */ - private $languages_server_to_client = false; - - /** - * Languages: Client to Server - * - * @see self::getLanguagesClient2Server() - * @var array|false - */ - private $languages_client_to_server = false; - - /** - * Preferred Algorithms - * - * @see self::setPreferredAlgorithms() - * @var array - */ - private $preferred = []; - - /** - * Block Size for Server to Client Encryption - * - * "Note that the length of the concatenation of 'packet_length', - * 'padding_length', 'payload', and 'random padding' MUST be a multiple - * of the cipher block size or 8, whichever is larger. This constraint - * MUST be enforced, even when using stream ciphers." - * - * -- http://tools.ietf.org/html/rfc4253#section-6 - * - * @see self::__construct() - * @see self::_send_binary_packet() - * @var int - */ - private $encrypt_block_size = 8; - - /** - * Block Size for Client to Server Encryption - * - * @see self::__construct() - * @see self::_get_binary_packet() - * @var int - */ - private $decrypt_block_size = 8; - - /** - * Server to Client Encryption Object - * - * @see self::_get_binary_packet() - * @var SymmetricKey|false - */ - private $decrypt = false; - - /** - * Decryption Algorithm Name - * - * @var string|null - */ - private $decryptName; - - /** - * Decryption Invocation Counter - * - * Used by GCM - * - * @var string|null - */ - private $decryptInvocationCounter; - - /** - * Fixed Part of Nonce - * - * Used by GCM - * - * @var string|null - */ - private $decryptFixedPart; - - /** - * Server to Client Length Encryption Object - * - * @see self::_get_binary_packet() - * @var object - */ - private $lengthDecrypt = false; - - /** - * Client to Server Encryption Object - * - * @see self::_send_binary_packet() - * @var SymmetricKey|false - */ - private $encrypt = false; - - /** - * Encryption Algorithm Name - * - * @var string|null - */ - private $encryptName; - - /** - * Encryption Invocation Counter - * - * Used by GCM - * - * @var string|null - */ - private $encryptInvocationCounter; - - /** - * Fixed Part of Nonce - * - * Used by GCM - * - * @var string|null - */ - private $encryptFixedPart; - - /** - * Client to Server Length Encryption Object - * - * @see self::_send_binary_packet() - * @var object - */ - private $lengthEncrypt = false; - - /** - * Client to Server HMAC Object - * - * @see self::_send_binary_packet() - * @var object - */ - private $hmac_create = false; - - /** - * Client to Server HMAC Name - * - * @var string|false - */ - private $hmac_create_name; - - /** - * Client to Server ETM - * - * @var int|false - */ - private $hmac_create_etm; - - /** - * Server to Client HMAC Object - * - * @see self::_get_binary_packet() - * @var object - */ - private $hmac_check = false; - - /** - * Server to Client HMAC Name - * - * @var string|false - */ - private $hmac_check_name; - - /** - * Server to Client ETM - * - * @var int|false - */ - private $hmac_check_etm; - - /** - * Size of server to client HMAC - * - * We need to know how big the HMAC will be for the server to client direction so that we know how many bytes to read. - * For the client to server side, the HMAC object will make the HMAC as long as it needs to be. All we need to do is - * append it. - * - * @see self::_get_binary_packet() - * @var int - */ - private $hmac_size = false; - - /** - * Server Public Host Key - * - * @see self::getServerPublicHostKey() - * @var string - */ - private $server_public_host_key; - - /** - * Session identifier - * - * "The exchange hash H from the first key exchange is additionally - * used as the session identifier, which is a unique identifier for - * this connection." - * - * -- http://tools.ietf.org/html/rfc4253#section-7.2 - * - * @see self::_key_exchange() - * @var string - */ - private $session_id = false; - - /** - * Exchange hash - * - * The current exchange hash - * - * @see self::_key_exchange() - * @var string - */ - private $exchange_hash = false; - - /** - * Message Numbers - * - * @see self::__construct() - * @var array - * @access private - */ - private static $message_numbers = []; - - /** - * Disconnection Message 'reason codes' defined in RFC4253 - * - * @see self::__construct() - * @var array - * @access private - */ - private static $disconnect_reasons = []; - - /** - * SSH_MSG_CHANNEL_OPEN_FAILURE 'reason codes', defined in RFC4254 - * - * @see self::__construct() - * @var array - * @access private - */ - private static $channel_open_failure_reasons = []; - - /** - * Terminal Modes - * - * @link http://tools.ietf.org/html/rfc4254#section-8 - * @see self::__construct() - * @var array - * @access private - */ - private static $terminal_modes = []; - - /** - * SSH_MSG_CHANNEL_EXTENDED_DATA's data_type_codes - * - * @link http://tools.ietf.org/html/rfc4254#section-5.2 - * @see self::__construct() - * @var array - * @access private - */ - private static $channel_extended_data_type_codes = []; - - /** - * Send Sequence Number - * - * See 'Section 6.4. Data Integrity' of rfc4253 for more info. - * - * @see self::_send_binary_packet() - * @var int - */ - private $send_seq_no = 0; - - /** - * Get Sequence Number - * - * See 'Section 6.4. Data Integrity' of rfc4253 for more info. - * - * @see self::_get_binary_packet() - * @var int - */ - private $get_seq_no = 0; - - /** - * Server Channels - * - * Maps client channels to server channels - * - * @see self::get_channel_packet() - * @see self::exec() - * @var array - */ - protected $server_channels = []; - - /** - * Channel Read Buffers - * - * If a client requests a packet from one channel but receives two packets from another those packets should - * be placed in a buffer - * - * @see self::get_channel_packet() - * @see self::exec() - * @var array - */ - private $channel_buffers = []; - - /** - * Channel Write Buffers - * - * If a client sends a packet and receives a timeout error mid-transmission, buffer the data written so it - * can be de-duplicated upon resuming write - * - * @see self::send_channel_packet() - * @var array - */ - private $channel_buffers_write = []; - - /** - * Channel Status - * - * Contains the type of the last sent message - * - * @see self::get_channel_packet() - * @var array - */ - protected $channel_status = []; - - /** - * The identifier of the interactive channel which was opened most recently - * - * @see self::getInteractiveChannelId() - * @var int - */ - private $channel_id_last_interactive = 0; - - /** - * Packet Size - * - * Maximum packet size indexed by channel - * - * @see self::send_channel_packet() - * @var array - */ - private $packet_size_client_to_server = []; - - /** - * Message Number Log - * - * @see self::getLog() - * @var array - */ - private $message_number_log = []; - - /** - * Message Log - * - * @see self::getLog() - * @var array - */ - private $message_log = []; - - /** - * The Window Size - * - * Bytes the other party can send before it must wait for the window to be adjusted (0x7FFFFFFF = 2GB) - * - * @var int - * @see self::send_channel_packet() - * @see self::exec() - */ - protected $window_size = 0x7FFFFFFF; - - /** - * What we resize the window to - * - * When PuTTY resizes the window it doesn't add an additional 0x7FFFFFFF bytes - it adds 0x40000000 bytes. - * Some SFTP clients (GoAnywhere) don't support adding 0x7FFFFFFF to the window size after the fact so - * we'll just do what PuTTY does - * - * @var int - * @see self::_send_channel_packet() - * @see self::exec() - */ - private $window_resize = 0x40000000; - - /** - * Window size, server to client - * - * Window size indexed by channel - * - * @see self::send_channel_packet() - * @var array - */ - protected $window_size_server_to_client = []; - - /** - * Window size, client to server - * - * Window size indexed by channel - * - * @see self::get_channel_packet() - * @var array - */ - private $window_size_client_to_server = []; - - /** - * Server signature - * - * Verified against $this->session_id - * - * @see self::getServerPublicHostKey() - * @var string - */ - private $signature = ''; - - /** - * Server signature format - * - * ssh-rsa or ssh-dss. - * - * @see self::getServerPublicHostKey() - * @var string - */ - private $signature_format = ''; - - /** - * Interactive Buffer - * - * @see self::read() - * @var string - */ - private $interactiveBuffer = ''; - - /** - * Current log size - * - * Should never exceed self::LOG_MAX_SIZE - * - * @see self::_send_binary_packet() - * @see self::_get_binary_packet() - * @var int - */ - private $log_size; - - /** - * Timeout - * - * @see self::setTimeout() - */ - protected $timeout; - - /** - * Current Timeout - * - * @see self::get_channel_packet() - */ - protected $curTimeout; - - /** - * Keep Alive Interval - * - * @see self::setKeepAlive() - */ - private $keepAlive; - - /** - * Real-time log file pointer - * - * @see self::_append_log() - * @var resource|closed-resource - */ - private $realtime_log_file; - - /** - * Real-time log file size - * - * @see self::_append_log() - * @var int - */ - private $realtime_log_size; - - /** - * Has the signature been validated? - * - * @see self::getServerPublicHostKey() - * @var bool - */ - private $signature_validated = false; - - /** - * Real-time log file wrap boolean - * - * @see self::_append_log() - * @var bool - */ - private $realtime_log_wrap; - - /** - * Flag to suppress stderr from output - * - * @see self::enableQuietMode() - */ - private $quiet_mode = false; - - /** - * Time of last read/write network activity - * - * @var float - */ - private $last_packet = null; - - /** - * Exit status returned from ssh if any - * - * @var int - */ - private $exit_status; - - /** - * Flag to request a PTY when using exec() - * - * @var bool - * @see self::enablePTY() - */ - private $request_pty = false; - - /** - * Contents of stdError - * - * @var string - */ - private $stdErrorLog; - - /** - * The Last Interactive Response - * - * @see self::_keyboard_interactive_process() - * @var string - */ - private $last_interactive_response = ''; - - /** - * Keyboard Interactive Request / Responses - * - * @see self::_keyboard_interactive_process() - * @var array - */ - private $keyboard_requests_responses = []; - - /** - * Banner Message - * - * Quoting from the RFC, "in some jurisdictions, sending a warning message before - * authentication may be relevant for getting legal protection." - * - * @see self::_filter() - * @see self::getBannerMessage() - * @var string - */ - private $banner_message = ''; - - /** - * Did read() timeout or return normally? - * - * @see self::isTimeout() - * @var bool - */ - protected $is_timeout = false; - - /** - * Log Boundary - * - * @see self::_format_log() - * @var string - */ - private $log_boundary = ':'; - - /** - * Log Long Width - * - * @see self::_format_log() - * @var int - */ - private $log_long_width = 65; - - /** - * Log Short Width - * - * @see self::_format_log() - * @var int - */ - private $log_short_width = 16; - - /** - * Hostname - * - * @see self::__construct() - * @see self::_connect() - * @var string - */ - private $host; - - /** - * Port Number - * - * @see self::__construct() - * @see self::_connect() - * @var int - */ - private $port; - - /** - * Number of columns for terminal window size - * - * @see self::getWindowColumns() - * @see self::setWindowColumns() - * @see self::setWindowSize() - * @var int - */ - private $windowColumns = 80; - - /** - * Number of columns for terminal window size - * - * @see self::getWindowRows() - * @see self::setWindowRows() - * @see self::setWindowSize() - * @var int - */ - private $windowRows = 24; - - /** - * Crypto Engine - * - * @see self::setCryptoEngine() - * @see self::_key_exchange() - * @var int - */ - private static $crypto_engine = false; - - /** - * A System_SSH_Agent for use in the SSH2 Agent Forwarding scenario - * - * @var Agent - */ - private $agent; - - /** - * Connection storage to replicates ssh2 extension functionality: - * {@link http://php.net/manual/en/wrappers.ssh2.php#refsect1-wrappers.ssh2-examples} - * - * @var array> - */ - private static $connections; - - /** - * Send the identification string first? - * - * @var bool - */ - private $send_id_string_first = true; - - /** - * Send the key exchange initiation packet first? - * - * @var bool - */ - private $send_kex_first = true; - - /** - * Some versions of OpenSSH incorrectly calculate the key size - * - * @var bool - */ - private $bad_key_size_fix = false; - - /** - * Should we try to re-connect to re-establish keys? - * - * @var bool - */ - private $login_credentials_finalized = false; - - /** - * Binary Packet Buffer - * - * @var object|null - */ - private $binary_packet_buffer = null; - - /** - * Preferred Signature Format - * - * @var string|false - */ - protected $preferred_signature_format = false; - - /** - * Authentication Credentials - * - * @var array - */ - protected $auth = []; - - /** - * Terminal - * - * @var string - */ - private $term = 'vt100'; - - /** - * The authentication methods that may productively continue authentication. - * - * @see https://tools.ietf.org/html/rfc4252#section-5.1 - * @var array|null - */ - private $auth_methods_to_continue = null; - - /** - * Compression method - * - * @var int - */ - private $compress = self::NET_SSH2_COMPRESSION_NONE; - - /** - * Decompression method - * - * @var int - */ - private $decompress = self::NET_SSH2_COMPRESSION_NONE; - - /** - * Compression context - * - * @var resource|false|null - */ - private $compress_context; - - /** - * Decompression context - * - * @var resource|object - */ - private $decompress_context; - - /** - * Regenerate Compression Context - * - * @var bool - */ - private $regenerate_compression_context = false; - - /** - * Regenerate Decompression Context - * - * @var bool - */ - private $regenerate_decompression_context = false; - - /** - * Smart multi-factor authentication flag - * - * @var bool - */ - private $smartMFA = true; - - /** - * How many channels are currently opened - * - * @var int - */ - private $channelCount = 0; - - /** - * Does the server support multiple channels? If not then error out - * when multiple channels are attempted to be opened - * - * @var bool - */ - private $errorOnMultipleChannels; - - /** - * Bytes Transferred Since Last Key Exchange - * - * Includes outbound and inbound totals - * - * @var int - */ - private $bytesTransferredSinceLastKEX = 0; - - /** - * After how many transferred byte should phpseclib initiate a key re-exchange? - * - * @var int - */ - private $doKeyReexchangeAfterXBytes = 1024 * 1024 * 1024; - - /** - * Has a key re-exchange been initialized? - * - * @var bool - * @access private - */ - private $keyExchangeInProgress = false; - - /** - * KEX Buffer - * - * If we're in the middle of a key exchange we want to buffer any additional packets we get until - * the key exchange is over - * - * @see self::_get_binary_packet() - * @see self::_key_exchange() - * @see self::exec() - * @var array - * @access private - */ - private $kex_buffer = []; - - /** - * Strict KEX Flag - * - * If kex-strict-s-v00@openssh.com is present in the first KEX packet it need not - * be present in subsequent packet - * - * @see self::_key_exchange() - * @see self::exec() - * @var array - * @access private - */ - private $strict_kex_flag = false; - - /** - * Default Constructor. - * - * $host can either be a string, representing the host, or a stream resource. - * If $host is a stream resource then $port doesn't do anything, altho $timeout - * still will be used - * - * @param mixed $host - * @param int $port - * @param int $timeout - * @see self::login() - */ - public function __construct($host, $port = 22, $timeout = 10) - { - if (empty(self::$message_numbers)) { - self::$message_numbers = [ - 1 => 'NET_SSH2_MSG_DISCONNECT', - 2 => 'NET_SSH2_MSG_IGNORE', - 3 => 'NET_SSH2_MSG_UNIMPLEMENTED', - 4 => 'NET_SSH2_MSG_DEBUG', - 5 => 'NET_SSH2_MSG_SERVICE_REQUEST', - 6 => 'NET_SSH2_MSG_SERVICE_ACCEPT', - 7 => 'NET_SSH2_MSG_EXT_INFO', // RFC 8308 - 20 => 'NET_SSH2_MSG_KEXINIT', - 21 => 'NET_SSH2_MSG_NEWKEYS', - 30 => 'NET_SSH2_MSG_KEXDH_INIT', - 31 => 'NET_SSH2_MSG_KEXDH_REPLY', - 50 => 'NET_SSH2_MSG_USERAUTH_REQUEST', - 51 => 'NET_SSH2_MSG_USERAUTH_FAILURE', - 52 => 'NET_SSH2_MSG_USERAUTH_SUCCESS', - 53 => 'NET_SSH2_MSG_USERAUTH_BANNER', - - 80 => 'NET_SSH2_MSG_GLOBAL_REQUEST', - 81 => 'NET_SSH2_MSG_REQUEST_SUCCESS', - 82 => 'NET_SSH2_MSG_REQUEST_FAILURE', - 90 => 'NET_SSH2_MSG_CHANNEL_OPEN', - 91 => 'NET_SSH2_MSG_CHANNEL_OPEN_CONFIRMATION', - 92 => 'NET_SSH2_MSG_CHANNEL_OPEN_FAILURE', - 93 => 'NET_SSH2_MSG_CHANNEL_WINDOW_ADJUST', - 94 => 'NET_SSH2_MSG_CHANNEL_DATA', - 95 => 'NET_SSH2_MSG_CHANNEL_EXTENDED_DATA', - 96 => 'NET_SSH2_MSG_CHANNEL_EOF', - 97 => 'NET_SSH2_MSG_CHANNEL_CLOSE', - 98 => 'NET_SSH2_MSG_CHANNEL_REQUEST', - 99 => 'NET_SSH2_MSG_CHANNEL_SUCCESS', - 100 => 'NET_SSH2_MSG_CHANNEL_FAILURE' - ]; - self::$disconnect_reasons = [ - 1 => 'NET_SSH2_DISCONNECT_HOST_NOT_ALLOWED_TO_CONNECT', - 2 => 'NET_SSH2_DISCONNECT_PROTOCOL_ERROR', - 3 => 'NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED', - 4 => 'NET_SSH2_DISCONNECT_RESERVED', - 5 => 'NET_SSH2_DISCONNECT_MAC_ERROR', - 6 => 'NET_SSH2_DISCONNECT_COMPRESSION_ERROR', - 7 => 'NET_SSH2_DISCONNECT_SERVICE_NOT_AVAILABLE', - 8 => 'NET_SSH2_DISCONNECT_PROTOCOL_VERSION_NOT_SUPPORTED', - 9 => 'NET_SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE', - 10 => 'NET_SSH2_DISCONNECT_CONNECTION_LOST', - 11 => 'NET_SSH2_DISCONNECT_BY_APPLICATION', - 12 => 'NET_SSH2_DISCONNECT_TOO_MANY_CONNECTIONS', - 13 => 'NET_SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER', - 14 => 'NET_SSH2_DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE', - 15 => 'NET_SSH2_DISCONNECT_ILLEGAL_USER_NAME' - ]; - self::$channel_open_failure_reasons = [ - 1 => 'NET_SSH2_OPEN_ADMINISTRATIVELY_PROHIBITED' - ]; - self::$terminal_modes = [ - 0 => 'NET_SSH2_TTY_OP_END' - ]; - self::$channel_extended_data_type_codes = [ - 1 => 'NET_SSH2_EXTENDED_DATA_STDERR' - ]; - - self::define_array( - self::$message_numbers, - self::$disconnect_reasons, - self::$channel_open_failure_reasons, - self::$terminal_modes, - self::$channel_extended_data_type_codes, - [60 => 'NET_SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ'], - [60 => 'NET_SSH2_MSG_USERAUTH_PK_OK'], - [60 => 'NET_SSH2_MSG_USERAUTH_INFO_REQUEST', - 61 => 'NET_SSH2_MSG_USERAUTH_INFO_RESPONSE'], - // RFC 4419 - diffie-hellman-group-exchange-sha{1,256} - [30 => 'NET_SSH2_MSG_KEXDH_GEX_REQUEST_OLD', - 31 => 'NET_SSH2_MSG_KEXDH_GEX_GROUP', - 32 => 'NET_SSH2_MSG_KEXDH_GEX_INIT', - 33 => 'NET_SSH2_MSG_KEXDH_GEX_REPLY', - 34 => 'NET_SSH2_MSG_KEXDH_GEX_REQUEST'], - // RFC 5656 - Elliptic Curves (for curve25519-sha256@libssh.org) - [30 => 'NET_SSH2_MSG_KEX_ECDH_INIT', - 31 => 'NET_SSH2_MSG_KEX_ECDH_REPLY'] - ); - } - - /** - * Typehint is required due to a bug in Psalm: https://github.com/vimeo/psalm/issues/7508 - * @var \WeakReference|SSH2 - */ - self::$connections[$this->getResourceId()] = class_exists('WeakReference') - ? \WeakReference::create($this) - : $this; - - $this->timeout = $timeout; - - if (is_resource($host)) { - $this->fsock = $host; - return; - } - - if (Strings::is_stringable($host)) { - $this->host = $host; - $this->port = $port; - } - } - - /** - * Set Crypto Engine Mode - * - * Possible $engine values: - * OpenSSL, mcrypt, Eval, PHP - * - * @param int $engine - */ - public static function setCryptoEngine($engine) - { - self::$crypto_engine = $engine; - } - - /** - * Send Identification String First - * - * https://tools.ietf.org/html/rfc4253#section-4.2 says "when the connection has been established, - * both sides MUST send an identification string". It does not say which side sends it first. In - * theory it shouldn't matter but it is a fact of life that some SSH servers are simply buggy - * - */ - public function sendIdentificationStringFirst() - { - $this->send_id_string_first = true; - } - - /** - * Send Identification String Last - * - * https://tools.ietf.org/html/rfc4253#section-4.2 says "when the connection has been established, - * both sides MUST send an identification string". It does not say which side sends it first. In - * theory it shouldn't matter but it is a fact of life that some SSH servers are simply buggy - * - */ - public function sendIdentificationStringLast() - { - $this->send_id_string_first = false; - } - - /** - * Send SSH_MSG_KEXINIT First - * - * https://tools.ietf.org/html/rfc4253#section-7.1 says "key exchange begins by each sending - * sending the [SSH_MSG_KEXINIT] packet". It does not say which side sends it first. In theory - * it shouldn't matter but it is a fact of life that some SSH servers are simply buggy - * - */ - public function sendKEXINITFirst() - { - $this->send_kex_first = true; - } - - /** - * Send SSH_MSG_KEXINIT Last - * - * https://tools.ietf.org/html/rfc4253#section-7.1 says "key exchange begins by each sending - * sending the [SSH_MSG_KEXINIT] packet". It does not say which side sends it first. In theory - * it shouldn't matter but it is a fact of life that some SSH servers are simply buggy - * - */ - public function sendKEXINITLast() - { - $this->send_kex_first = false; - } - - /** - * stream_select wrapper - * - * Quoting https://stackoverflow.com/a/14262151/569976, - * "The general approach to `EINTR` is to simply handle the error and retry the operation again" - * - * This wrapper does that loop - */ - private static function stream_select(&$read, &$write, &$except, $seconds, $microseconds = null) - { - $remaining = $seconds + $microseconds / 1000000; - $start = microtime(true); - while (true) { - $result = @stream_select($read, $write, $except, $seconds, $microseconds); - if ($result !== false) { - return $result; - } - $elapsed = microtime(true) - $start; - $seconds = (int) ($remaining - floor($elapsed)); - $microseconds = (int) (1000000 * ($remaining - $seconds)); - if ($elapsed >= $remaining) { - return false; - } - } - } - - /** - * Connect to an SSHv2 server - * - * @throws \UnexpectedValueException on receipt of unexpected packets - * @throws \RuntimeException on other errors - */ - private function connect() - { - if ($this->bitmap & self::MASK_CONSTRUCTOR) { - return; - } - - $this->bitmap |= self::MASK_CONSTRUCTOR; - - $this->curTimeout = $this->timeout; - - if (!is_resource($this->fsock)) { - $start = microtime(true); - // with stream_select a timeout of 0 means that no timeout takes place; - // with fsockopen a timeout of 0 means that you instantly timeout - // to resolve this incompatibility a timeout of 100,000 will be used for fsockopen if timeout is 0 - $this->fsock = @fsockopen($this->host, $this->port, $errno, $errstr, $this->curTimeout == 0 ? 100000 : $this->curTimeout); - if (!$this->fsock) { - $host = $this->host . ':' . $this->port; - throw new UnableToConnectException(rtrim("Cannot connect to $host. Error $errno. $errstr")); - } - $elapsed = microtime(true) - $start; - - if ($this->curTimeout) { - $this->curTimeout -= $elapsed; - if ($this->curTimeout < 0) { - throw new \RuntimeException('Connection timed out whilst attempting to open socket connection'); - } - } - - if (defined('NET_SSH2_LOGGING')) { - $this->append_log('(fsockopen took ' . round($elapsed, 4) . 's)', ''); - } - } - - $this->identifier = $this->generate_identifier(); - - if ($this->send_id_string_first) { - $start = microtime(true); - fputs($this->fsock, $this->identifier . "\r\n"); - $elapsed = round(microtime(true) - $start, 4); - if (defined('NET_SSH2_LOGGING')) { - $this->append_log("-> (network: $elapsed)", $this->identifier . "\r\n"); - } - } - - /* According to the SSH2 specs, - - "The server MAY send other lines of data before sending the version - string. Each line SHOULD be terminated by a Carriage Return and Line - Feed. Such lines MUST NOT begin with "SSH-", and SHOULD be encoded - in ISO-10646 UTF-8 [RFC3629] (language is not specified). Clients - MUST be able to process such lines." */ - $data = ''; - $totalElapsed = 0; - while (!feof($this->fsock) && !preg_match('#(.*)^(SSH-(\d\.\d+).*)#ms', $data, $matches)) { - $line = ''; - while (true) { - if ($this->curTimeout) { - if ($this->curTimeout < 0) { - throw new \RuntimeException('Connection timed out whilst receiving server identification string'); - } - $read = [$this->fsock]; - $write = $except = null; - $start = microtime(true); - $sec = (int) floor($this->curTimeout); - $usec = (int) (1000000 * ($this->curTimeout - $sec)); - if (static::stream_select($read, $write, $except, $sec, $usec) === false) { - throw new \RuntimeException('Connection timed out whilst receiving server identification string'); - } - $elapsed = microtime(true) - $start; - $totalElapsed += $elapsed; - $this->curTimeout -= $elapsed; - } - - $temp = stream_get_line($this->fsock, 255, "\n"); - if ($temp === false) { - throw new \RuntimeException('Error reading SSH identification string; are you sure you\'re connecting to an SSH server?'); - } - - $line .= $temp; - if (strlen($temp) == 255) { - continue; - } - - $line .= "\n"; - - break; - } - - $data .= $line; - } - - if (defined('NET_SSH2_LOGGING')) { - $this->append_log('<- (network: ' . round($totalElapsed, 4) . ')', $data); - } - - if (feof($this->fsock)) { - $this->bitmap = 0; - throw new ConnectionClosedException('Connection closed by server; are you sure you\'re connected to an SSH server?'); - } - - $extra = $matches[1]; - - // earlier the SSH specs were quoted. - // "The server MAY send other lines of data before sending the version string." they said. - // the implication of this is that the lines of data before the server string are *not* a part of it - // getting this right is important because the correct server identifier needs to be fed into the - // exchange hash for the shared keys to be calculated correctly - $data = explode("\r\n", trim($data, "\r\n")); - $this->server_identifier = $data[count($data) - 1]; - if (strlen($extra)) { - $this->errors[] = $data; - } - - if (version_compare($matches[3], '1.99', '<')) { - $this->bitmap = 0; - throw new UnableToConnectException("Cannot connect to SSH $matches[3] servers"); - } - - // Ubuntu's OpenSSH from 5.8 to 6.9 didn't work with multiple channels. see - // https://bugs.launchpad.net/ubuntu/+source/openssh/+bug/1334916 for more info. - // https://lists.ubuntu.com/archives/oneiric-changes/2011-July/005772.html discusses - // when consolekit was incorporated. - // https://marc.info/?l=openssh-unix-dev&m=163409903417589&w=2 discusses some of the - // issues with how Ubuntu incorporated consolekit - $pattern = '#^SSH-2\.0-OpenSSH_([\d.]+)[^ ]* Ubuntu-.*$#'; - $match = preg_match($pattern, $this->server_identifier, $matches); - $match = $match && version_compare('5.8', $matches[1], '<='); - $match = $match && version_compare('6.9', $matches[1], '>='); - $this->errorOnMultipleChannels = $match; - - if (!$this->send_id_string_first) { - $start = microtime(true); - fputs($this->fsock, $this->identifier . "\r\n"); - $elapsed = round(microtime(true) - $start, 4); - if (defined('NET_SSH2_LOGGING')) { - $this->append_log("-> (network: $elapsed)", $this->identifier . "\r\n"); - } - } - - $this->last_packet = microtime(true); - - if (!$this->send_kex_first) { - $response = $this->get_binary_packet_or_close(NET_SSH2_MSG_KEXINIT); - $this->key_exchange($response); - } - - if ($this->send_kex_first) { - $this->key_exchange(); - } - - $this->bitmap |= self::MASK_CONNECTED; - - return true; - } - - /** - * Generates the SSH identifier - * - * You should overwrite this method in your own class if you want to use another identifier - * - * @return string - */ - private function generate_identifier() - { - $identifier = 'SSH-2.0-phpseclib_3.0'; - - $ext = []; - if (extension_loaded('sodium')) { - $ext[] = 'libsodium'; - } - - if (extension_loaded('openssl')) { - $ext[] = 'openssl'; - } elseif (extension_loaded('mcrypt')) { - $ext[] = 'mcrypt'; - } - - if (extension_loaded('gmp')) { - $ext[] = 'gmp'; - } elseif (extension_loaded('bcmath')) { - $ext[] = 'bcmath'; - } - - if (!empty($ext)) { - $identifier .= ' (' . implode(', ', $ext) . ')'; - } - - return $identifier; - } - - /** - * Key Exchange - * - * @return bool - * @param string|bool $kexinit_payload_server optional - * @throws \UnexpectedValueException on receipt of unexpected packets - * @throws \RuntimeException on other errors - * @throws NoSupportedAlgorithmsException when none of the algorithms phpseclib has loaded are compatible - */ - private function key_exchange($kexinit_payload_server = false) - { - $this->bytesTransferredSinceLastKEX = 0; - - $preferred = $this->preferred; - // for the initial key exchange $send_kex is true (no key re-exchange has been started) - // for phpseclib initiated key exchanges $send_kex is false - $send_kex = !$this->keyExchangeInProgress; - $this->keyExchangeInProgress = true; - - $kex_algorithms = isset($preferred['kex']) ? - $preferred['kex'] : - SSH2::getSupportedKEXAlgorithms(); - $server_host_key_algorithms = isset($preferred['hostkey']) ? - $preferred['hostkey'] : - SSH2::getSupportedHostKeyAlgorithms(); - $s2c_encryption_algorithms = isset($preferred['server_to_client']['crypt']) ? - $preferred['server_to_client']['crypt'] : - SSH2::getSupportedEncryptionAlgorithms(); - $c2s_encryption_algorithms = isset($preferred['client_to_server']['crypt']) ? - $preferred['client_to_server']['crypt'] : - SSH2::getSupportedEncryptionAlgorithms(); - $s2c_mac_algorithms = isset($preferred['server_to_client']['mac']) ? - $preferred['server_to_client']['mac'] : - SSH2::getSupportedMACAlgorithms(); - $c2s_mac_algorithms = isset($preferred['client_to_server']['mac']) ? - $preferred['client_to_server']['mac'] : - SSH2::getSupportedMACAlgorithms(); - $s2c_compression_algorithms = isset($preferred['server_to_client']['comp']) ? - $preferred['server_to_client']['comp'] : - SSH2::getSupportedCompressionAlgorithms(); - $c2s_compression_algorithms = isset($preferred['client_to_server']['comp']) ? - $preferred['client_to_server']['comp'] : - SSH2::getSupportedCompressionAlgorithms(); - - $kex_algorithms = array_merge($kex_algorithms, ['ext-info-c', 'kex-strict-c-v00@openssh.com']); - - // some SSH servers have buggy implementations of some of the above algorithms - switch (true) { - case $this->server_identifier == 'SSH-2.0-SSHD': - case substr($this->server_identifier, 0, 13) == 'SSH-2.0-DLINK': - if (!isset($preferred['server_to_client']['mac'])) { - $s2c_mac_algorithms = array_values(array_diff( - $s2c_mac_algorithms, - ['hmac-sha1-96', 'hmac-md5-96'] - )); - } - if (!isset($preferred['client_to_server']['mac'])) { - $c2s_mac_algorithms = array_values(array_diff( - $c2s_mac_algorithms, - ['hmac-sha1-96', 'hmac-md5-96'] - )); - } - break; - case substr($this->server_identifier, 0, 24) == 'SSH-2.0-TurboFTP_SERVER_': - if (!isset($preferred['server_to_client']['crypt'])) { - $s2c_encryption_algorithms = array_values(array_diff( - $s2c_encryption_algorithms, - ['aes128-gcm@openssh.com', 'aes256-gcm@openssh.com'] - )); - } - if (!isset($preferred['client_to_server']['crypt'])) { - $c2s_encryption_algorithms = array_values(array_diff( - $c2s_encryption_algorithms, - ['aes128-gcm@openssh.com', 'aes256-gcm@openssh.com'] - )); - } - } - - $client_cookie = Random::string(16); - - $kexinit_payload_client = pack('Ca*', NET_SSH2_MSG_KEXINIT, $client_cookie); - $kexinit_payload_client .= Strings::packSSH2( - 'L10bN', - $kex_algorithms, - $server_host_key_algorithms, - $c2s_encryption_algorithms, - $s2c_encryption_algorithms, - $c2s_mac_algorithms, - $s2c_mac_algorithms, - $c2s_compression_algorithms, - $s2c_compression_algorithms, - [], // language, client to server - [], // language, server to client - false, // first_kex_packet_follows - 0 // reserved for future extension - ); - - if ($kexinit_payload_server === false && $send_kex) { - $this->send_binary_packet($kexinit_payload_client); - - while (true) { - $kexinit_payload_server = $this->get_binary_packet(); - switch (ord($kexinit_payload_server[0])) { - case NET_SSH2_MSG_KEXINIT: - break 2; - case NET_SSH2_MSG_DISCONNECT: - return $this->handleDisconnect($kexinit_payload_server); - } - $this->kex_buffer[] = $kexinit_payload_server; - } - - $send_kex = false; - } - - $response = $kexinit_payload_server; - Strings::shift($response, 1); // skip past the message number (it should be SSH_MSG_KEXINIT) - $server_cookie = Strings::shift($response, 16); - - list( - $this->kex_algorithms, - $this->server_host_key_algorithms, - $this->encryption_algorithms_client_to_server, - $this->encryption_algorithms_server_to_client, - $this->mac_algorithms_client_to_server, - $this->mac_algorithms_server_to_client, - $this->compression_algorithms_client_to_server, - $this->compression_algorithms_server_to_client, - $this->languages_client_to_server, - $this->languages_server_to_client, - $first_kex_packet_follows - ) = Strings::unpackSSH2('L10C', $response); - if (in_array('kex-strict-s-v00@openssh.com', $this->kex_algorithms)) { - if ($this->session_id === false) { - // [kex-strict-s-v00@openssh.com is] only valid in the initial SSH2_MSG_KEXINIT and MUST be ignored - // if [it is] present in subsequent SSH2_MSG_KEXINIT packets - $this->strict_kex_flag = true; - if (count($this->kex_buffer)) { - throw new \UnexpectedValueException('Possible Terrapin Attack detected'); - } - } - } - - $this->supported_private_key_algorithms = $this->server_host_key_algorithms; - - if ($send_kex) { - $this->send_binary_packet($kexinit_payload_client); - } - - // we need to decide upon the symmetric encryption algorithms before we do the diffie-hellman key exchange - - // we don't initialize any crypto-objects, yet - we do that, later. for now, we need the lengths to make the - // diffie-hellman key exchange as fast as possible - $decrypt = self::array_intersect_first($s2c_encryption_algorithms, $this->encryption_algorithms_server_to_client); - if (!$decrypt || ($decryptKeyLength = $this->encryption_algorithm_to_key_size($decrypt)) === null) { - $this->disconnect_helper(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); - throw new NoSupportedAlgorithmsException('No compatible server to client encryption algorithms found'); - } - - $encrypt = self::array_intersect_first($c2s_encryption_algorithms, $this->encryption_algorithms_client_to_server); - if (!$encrypt || ($encryptKeyLength = $this->encryption_algorithm_to_key_size($encrypt)) === null) { - $this->disconnect_helper(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); - throw new NoSupportedAlgorithmsException('No compatible client to server encryption algorithms found'); - } - - // through diffie-hellman key exchange a symmetric key is obtained - $this->kex_algorithm = self::array_intersect_first($kex_algorithms, $this->kex_algorithms); - if ($this->kex_algorithm === false) { - $this->disconnect_helper(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); - throw new NoSupportedAlgorithmsException('No compatible key exchange algorithms found'); - } - - $server_host_key_algorithm = self::array_intersect_first($server_host_key_algorithms, $this->server_host_key_algorithms); - if ($server_host_key_algorithm === false) { - $this->disconnect_helper(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); - throw new NoSupportedAlgorithmsException('No compatible server host key algorithms found'); - } - - $mac_algorithm_out = self::array_intersect_first($c2s_mac_algorithms, $this->mac_algorithms_client_to_server); - if ($mac_algorithm_out === false) { - $this->disconnect_helper(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); - throw new NoSupportedAlgorithmsException('No compatible client to server message authentication algorithms found'); - } - - $mac_algorithm_in = self::array_intersect_first($s2c_mac_algorithms, $this->mac_algorithms_server_to_client); - if ($mac_algorithm_in === false) { - $this->disconnect_helper(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); - throw new NoSupportedAlgorithmsException('No compatible server to client message authentication algorithms found'); - } - - $compression_map = [ - 'none' => self::NET_SSH2_COMPRESSION_NONE, - 'zlib' => self::NET_SSH2_COMPRESSION_ZLIB, - 'zlib@openssh.com' => self::NET_SSH2_COMPRESSION_ZLIB_AT_OPENSSH - ]; - - $compression_algorithm_in = self::array_intersect_first($s2c_compression_algorithms, $this->compression_algorithms_server_to_client); - if ($compression_algorithm_in === false) { - $this->disconnect_helper(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); - throw new NoSupportedAlgorithmsException('No compatible server to client compression algorithms found'); - } - $this->decompress = $compression_map[$compression_algorithm_in]; - - $compression_algorithm_out = self::array_intersect_first($c2s_compression_algorithms, $this->compression_algorithms_client_to_server); - if ($compression_algorithm_out === false) { - $this->disconnect_helper(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); - throw new NoSupportedAlgorithmsException('No compatible client to server compression algorithms found'); - } - $this->compress = $compression_map[$compression_algorithm_out]; - - switch ($this->kex_algorithm) { - case 'diffie-hellman-group15-sha512': - case 'diffie-hellman-group16-sha512': - case 'diffie-hellman-group17-sha512': - case 'diffie-hellman-group18-sha512': - case 'ecdh-sha2-nistp521': - $kexHash = new Hash('sha512'); - break; - case 'ecdh-sha2-nistp384': - $kexHash = new Hash('sha384'); - break; - case 'diffie-hellman-group-exchange-sha256': - case 'diffie-hellman-group14-sha256': - case 'ecdh-sha2-nistp256': - case 'curve25519-sha256@libssh.org': - case 'curve25519-sha256': - $kexHash = new Hash('sha256'); - break; - default: - $kexHash = new Hash('sha1'); - } - - // Only relevant in diffie-hellman-group-exchange-sha{1,256}, otherwise empty. - - $exchange_hash_rfc4419 = ''; - - if (strpos($this->kex_algorithm, 'curve25519-sha256') === 0 || strpos($this->kex_algorithm, 'ecdh-sha2-nistp') === 0) { - $curve = strpos($this->kex_algorithm, 'curve25519-sha256') === 0 ? - 'Curve25519' : - substr($this->kex_algorithm, 10); - $ourPrivate = EC::createKey($curve); - $ourPublicBytes = $ourPrivate->getPublicKey()->getEncodedCoordinates(); - $clientKexInitMessage = 'NET_SSH2_MSG_KEX_ECDH_INIT'; - $serverKexReplyMessage = 'NET_SSH2_MSG_KEX_ECDH_REPLY'; - } else { - if (strpos($this->kex_algorithm, 'diffie-hellman-group-exchange') === 0) { - $dh_group_sizes_packed = pack( - 'NNN', - $this->kex_dh_group_size_min, - $this->kex_dh_group_size_preferred, - $this->kex_dh_group_size_max - ); - $packet = pack( - 'Ca*', - NET_SSH2_MSG_KEXDH_GEX_REQUEST, - $dh_group_sizes_packed - ); - $this->send_binary_packet($packet); - $this->updateLogHistory('UNKNOWN (34)', 'NET_SSH2_MSG_KEXDH_GEX_REQUEST'); - - $response = $this->get_binary_packet_or_close(NET_SSH2_MSG_KEXDH_GEX_GROUP); - list($type, $primeBytes, $gBytes) = Strings::unpackSSH2('Css', $response); - $this->updateLogHistory('NET_SSH2_MSG_KEXDH_REPLY', 'NET_SSH2_MSG_KEXDH_GEX_GROUP'); - $prime = new BigInteger($primeBytes, -256); - $g = new BigInteger($gBytes, -256); - - $exchange_hash_rfc4419 = $dh_group_sizes_packed . Strings::packSSH2( - 'ss', - $primeBytes, - $gBytes - ); - - $params = DH::createParameters($prime, $g); - $clientKexInitMessage = 'NET_SSH2_MSG_KEXDH_GEX_INIT'; - $serverKexReplyMessage = 'NET_SSH2_MSG_KEXDH_GEX_REPLY'; - } else { - $params = DH::createParameters($this->kex_algorithm); - $clientKexInitMessage = 'NET_SSH2_MSG_KEXDH_INIT'; - $serverKexReplyMessage = 'NET_SSH2_MSG_KEXDH_REPLY'; - } - - $keyLength = min($kexHash->getLengthInBytes(), max($encryptKeyLength, $decryptKeyLength)); - - $ourPrivate = DH::createKey($params, 16 * $keyLength); // 2 * 8 * $keyLength - $ourPublic = $ourPrivate->getPublicKey()->toBigInteger(); - $ourPublicBytes = $ourPublic->toBytes(true); - } - - $data = pack('CNa*', constant($clientKexInitMessage), strlen($ourPublicBytes), $ourPublicBytes); - - $this->send_binary_packet($data); - - switch ($clientKexInitMessage) { - case 'NET_SSH2_MSG_KEX_ECDH_INIT': - $this->updateLogHistory('NET_SSH2_MSG_KEXDH_INIT', 'NET_SSH2_MSG_KEX_ECDH_INIT'); - break; - case 'NET_SSH2_MSG_KEXDH_GEX_INIT': - $this->updateLogHistory('UNKNOWN (32)', 'NET_SSH2_MSG_KEXDH_GEX_INIT'); - } - - $response = $this->get_binary_packet_or_close(constant($serverKexReplyMessage)); - - list( - $type, - $server_public_host_key, - $theirPublicBytes, - $this->signature - ) = Strings::unpackSSH2('Csss', $response); - - switch ($serverKexReplyMessage) { - case 'NET_SSH2_MSG_KEX_ECDH_REPLY': - $this->updateLogHistory('NET_SSH2_MSG_KEXDH_REPLY', 'NET_SSH2_MSG_KEX_ECDH_REPLY'); - break; - case 'NET_SSH2_MSG_KEXDH_GEX_REPLY': - $this->updateLogHistory('UNKNOWN (33)', 'NET_SSH2_MSG_KEXDH_GEX_REPLY'); - } - - $this->server_public_host_key = $server_public_host_key; - list($public_key_format) = Strings::unpackSSH2('s', $server_public_host_key); - if (strlen($this->signature) < 4) { - throw new \LengthException('The signature needs at least four bytes'); - } - $temp = unpack('Nlength', substr($this->signature, 0, 4)); - $this->signature_format = substr($this->signature, 4, $temp['length']); - - $keyBytes = DH::computeSecret($ourPrivate, $theirPublicBytes); - if (($keyBytes & "\xFF\x80") === "\x00\x00") { - $keyBytes = substr($keyBytes, 1); - } elseif (($keyBytes[0] & "\x80") === "\x80") { - $keyBytes = "\0$keyBytes"; - } - - $this->exchange_hash = Strings::packSSH2( - 's5', - $this->identifier, - $this->server_identifier, - $kexinit_payload_client, - $kexinit_payload_server, - $this->server_public_host_key - ); - $this->exchange_hash .= $exchange_hash_rfc4419; - $this->exchange_hash .= Strings::packSSH2( - 's3', - $ourPublicBytes, - $theirPublicBytes, - $keyBytes - ); - - $this->exchange_hash = $kexHash->hash($this->exchange_hash); - - if ($this->session_id === false) { - $this->session_id = $this->exchange_hash; - } - - switch ($server_host_key_algorithm) { - case 'rsa-sha2-256': - case 'rsa-sha2-512': - //case 'ssh-rsa': - $expected_key_format = 'ssh-rsa'; - break; - default: - $expected_key_format = $server_host_key_algorithm; - } - if ($public_key_format != $expected_key_format || $this->signature_format != $server_host_key_algorithm) { - switch (true) { - case $this->signature_format == $server_host_key_algorithm: - case $server_host_key_algorithm != 'rsa-sha2-256' && $server_host_key_algorithm != 'rsa-sha2-512': - case $this->signature_format != 'ssh-rsa': - $this->disconnect_helper(NET_SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE); - throw new \RuntimeException('Server Host Key Algorithm Mismatch (' . $this->signature_format . ' vs ' . $server_host_key_algorithm . ')'); - } - } - - $packet = pack('C', NET_SSH2_MSG_NEWKEYS); - $this->send_binary_packet($packet); - $this->get_binary_packet_or_close(NET_SSH2_MSG_NEWKEYS); - - $this->keyExchangeInProgress = false; - - if ($this->strict_kex_flag) { - $this->get_seq_no = $this->send_seq_no = 0; - } - - $keyBytes = pack('Na*', strlen($keyBytes), $keyBytes); - - $this->encrypt = self::encryption_algorithm_to_crypt_instance($encrypt); - if ($this->encrypt) { - if (self::$crypto_engine) { - $this->encrypt->setPreferredEngine(self::$crypto_engine); - } - if ($this->encrypt->getBlockLengthInBytes()) { - $this->encrypt_block_size = $this->encrypt->getBlockLengthInBytes(); - } - $this->encrypt->disablePadding(); - - if ($this->encrypt->usesIV()) { - $iv = $kexHash->hash($keyBytes . $this->exchange_hash . 'A' . $this->session_id); - while ($this->encrypt_block_size > strlen($iv)) { - $iv .= $kexHash->hash($keyBytes . $this->exchange_hash . $iv); - } - $this->encrypt->setIV(substr($iv, 0, $this->encrypt_block_size)); - } - - switch ($encrypt) { - case 'aes128-gcm@openssh.com': - case 'aes256-gcm@openssh.com': - $nonce = $kexHash->hash($keyBytes . $this->exchange_hash . 'A' . $this->session_id); - $this->encryptFixedPart = substr($nonce, 0, 4); - $this->encryptInvocationCounter = substr($nonce, 4, 8); - // fall-through - case 'chacha20-poly1305@openssh.com': - break; - default: - $this->encrypt->enableContinuousBuffer(); - } - - $key = $kexHash->hash($keyBytes . $this->exchange_hash . 'C' . $this->session_id); - while ($encryptKeyLength > strlen($key)) { - $key .= $kexHash->hash($keyBytes . $this->exchange_hash . $key); - } - switch ($encrypt) { - case 'chacha20-poly1305@openssh.com': - $encryptKeyLength = 32; - $this->lengthEncrypt = self::encryption_algorithm_to_crypt_instance($encrypt); - $this->lengthEncrypt->setKey(substr($key, 32, 32)); - } - $this->encrypt->setKey(substr($key, 0, $encryptKeyLength)); - $this->encryptName = $encrypt; - } - - $this->decrypt = self::encryption_algorithm_to_crypt_instance($decrypt); - if ($this->decrypt) { - if (self::$crypto_engine) { - $this->decrypt->setPreferredEngine(self::$crypto_engine); - } - if ($this->decrypt->getBlockLengthInBytes()) { - $this->decrypt_block_size = $this->decrypt->getBlockLengthInBytes(); - } - $this->decrypt->disablePadding(); - - if ($this->decrypt->usesIV()) { - $iv = $kexHash->hash($keyBytes . $this->exchange_hash . 'B' . $this->session_id); - while ($this->decrypt_block_size > strlen($iv)) { - $iv .= $kexHash->hash($keyBytes . $this->exchange_hash . $iv); - } - $this->decrypt->setIV(substr($iv, 0, $this->decrypt_block_size)); - } - - switch ($decrypt) { - case 'aes128-gcm@openssh.com': - case 'aes256-gcm@openssh.com': - // see https://tools.ietf.org/html/rfc5647#section-7.1 - $nonce = $kexHash->hash($keyBytes . $this->exchange_hash . 'B' . $this->session_id); - $this->decryptFixedPart = substr($nonce, 0, 4); - $this->decryptInvocationCounter = substr($nonce, 4, 8); - // fall-through - case 'chacha20-poly1305@openssh.com': - break; - default: - $this->decrypt->enableContinuousBuffer(); - } - - $key = $kexHash->hash($keyBytes . $this->exchange_hash . 'D' . $this->session_id); - while ($decryptKeyLength > strlen($key)) { - $key .= $kexHash->hash($keyBytes . $this->exchange_hash . $key); - } - switch ($decrypt) { - case 'chacha20-poly1305@openssh.com': - $decryptKeyLength = 32; - $this->lengthDecrypt = self::encryption_algorithm_to_crypt_instance($decrypt); - $this->lengthDecrypt->setKey(substr($key, 32, 32)); - } - $this->decrypt->setKey(substr($key, 0, $decryptKeyLength)); - $this->decryptName = $decrypt; - } - - /* The "arcfour128" algorithm is the RC4 cipher, as described in - [SCHNEIER], using a 128-bit key. The first 1536 bytes of keystream - generated by the cipher MUST be discarded, and the first byte of the - first encrypted packet MUST be encrypted using the 1537th byte of - keystream. - - -- http://tools.ietf.org/html/rfc4345#section-4 */ - if ($encrypt == 'arcfour128' || $encrypt == 'arcfour256') { - $this->encrypt->encrypt(str_repeat("\0", 1536)); - } - if ($decrypt == 'arcfour128' || $decrypt == 'arcfour256') { - $this->decrypt->decrypt(str_repeat("\0", 1536)); - } - - if (!$this->encrypt->usesNonce()) { - list($this->hmac_create, $createKeyLength) = self::mac_algorithm_to_hash_instance($mac_algorithm_out); - } else { - $this->hmac_create = new \stdClass(); - $this->hmac_create_name = $mac_algorithm_out; - //$mac_algorithm_out = 'none'; - $createKeyLength = 0; - } - - if ($this->hmac_create instanceof Hash) { - $key = $kexHash->hash($keyBytes . $this->exchange_hash . 'E' . $this->session_id); - while ($createKeyLength > strlen($key)) { - $key .= $kexHash->hash($keyBytes . $this->exchange_hash . $key); - } - $this->hmac_create->setKey(substr($key, 0, $createKeyLength)); - $this->hmac_create_name = $mac_algorithm_out; - $this->hmac_create_etm = preg_match('#-etm@openssh\.com$#', $mac_algorithm_out); - } - - if (!$this->decrypt->usesNonce()) { - list($this->hmac_check, $checkKeyLength) = self::mac_algorithm_to_hash_instance($mac_algorithm_in); - $this->hmac_size = $this->hmac_check->getLengthInBytes(); - } else { - $this->hmac_check = new \stdClass(); - $this->hmac_check_name = $mac_algorithm_in; - //$mac_algorithm_in = 'none'; - $checkKeyLength = 0; - $this->hmac_size = 0; - } - - if ($this->hmac_check instanceof Hash) { - $key = $kexHash->hash($keyBytes . $this->exchange_hash . 'F' . $this->session_id); - while ($checkKeyLength > strlen($key)) { - $key .= $kexHash->hash($keyBytes . $this->exchange_hash . $key); - } - $this->hmac_check->setKey(substr($key, 0, $checkKeyLength)); - $this->hmac_check_name = $mac_algorithm_in; - $this->hmac_check_etm = preg_match('#-etm@openssh\.com$#', $mac_algorithm_in); - } - - $this->regenerate_compression_context = $this->regenerate_decompression_context = true; - - return true; - } - - /** - * Maps an encryption algorithm name to the number of key bytes. - * - * @param string $algorithm Name of the encryption algorithm - * @return int|null Number of bytes as an integer or null for unknown - */ - private function encryption_algorithm_to_key_size($algorithm) - { - if ($this->bad_key_size_fix && self::bad_algorithm_candidate($algorithm)) { - return 16; - } - - switch ($algorithm) { - case 'none': - return 0; - case 'aes128-gcm@openssh.com': - case 'aes128-cbc': - case 'aes128-ctr': - case 'arcfour': - case 'arcfour128': - case 'blowfish-cbc': - case 'blowfish-ctr': - case 'twofish128-cbc': - case 'twofish128-ctr': - return 16; - case '3des-cbc': - case '3des-ctr': - case 'aes192-cbc': - case 'aes192-ctr': - case 'twofish192-cbc': - case 'twofish192-ctr': - return 24; - case 'aes256-gcm@openssh.com': - case 'aes256-cbc': - case 'aes256-ctr': - case 'arcfour256': - case 'twofish-cbc': - case 'twofish256-cbc': - case 'twofish256-ctr': - return 32; - case 'chacha20-poly1305@openssh.com': - return 64; - } - return null; - } - - /** - * Maps an encryption algorithm name to an instance of a subclass of - * \phpseclib3\Crypt\Common\SymmetricKey. - * - * @param string $algorithm Name of the encryption algorithm - * @return SymmetricKey|null - */ - private static function encryption_algorithm_to_crypt_instance($algorithm) - { - switch ($algorithm) { - case '3des-cbc': - return new TripleDES('cbc'); - case '3des-ctr': - return new TripleDES('ctr'); - case 'aes256-cbc': - case 'aes192-cbc': - case 'aes128-cbc': - return new Rijndael('cbc'); - case 'aes256-ctr': - case 'aes192-ctr': - case 'aes128-ctr': - return new Rijndael('ctr'); - case 'blowfish-cbc': - return new Blowfish('cbc'); - case 'blowfish-ctr': - return new Blowfish('ctr'); - case 'twofish128-cbc': - case 'twofish192-cbc': - case 'twofish256-cbc': - case 'twofish-cbc': - return new Twofish('cbc'); - case 'twofish128-ctr': - case 'twofish192-ctr': - case 'twofish256-ctr': - return new Twofish('ctr'); - case 'arcfour': - case 'arcfour128': - case 'arcfour256': - return new RC4(); - case 'aes128-gcm@openssh.com': - case 'aes256-gcm@openssh.com': - return new Rijndael('gcm'); - case 'chacha20-poly1305@openssh.com': - return new ChaCha20(); - } - return null; - } - - /** - * Maps an encryption algorithm name to an instance of a subclass of - * \phpseclib3\Crypt\Hash. - * - * @param string $algorithm Name of the encryption algorithm - * @return array{Hash, int}|null - */ - private static function mac_algorithm_to_hash_instance($algorithm) - { - switch ($algorithm) { - case 'umac-64@openssh.com': - case 'umac-64-etm@openssh.com': - return [new Hash('umac-64'), 16]; - case 'umac-128@openssh.com': - case 'umac-128-etm@openssh.com': - return [new Hash('umac-128'), 16]; - case 'hmac-sha2-512': - case 'hmac-sha2-512-etm@openssh.com': - return [new Hash('sha512'), 64]; - case 'hmac-sha2-256': - case 'hmac-sha2-256-etm@openssh.com': - return [new Hash('sha256'), 32]; - case 'hmac-sha1': - case 'hmac-sha1-etm@openssh.com': - return [new Hash('sha1'), 20]; - case 'hmac-sha1-96': - return [new Hash('sha1-96'), 20]; - case 'hmac-md5': - return [new Hash('md5'), 16]; - case 'hmac-md5-96': - return [new Hash('md5-96'), 16]; - } - } - - /** - * Tests whether or not proposed algorithm has a potential for issues - * - * @link https://www.chiark.greenend.org.uk/~sgtatham/putty/wishlist/ssh2-aesctr-openssh.html - * @link https://bugzilla.mindrot.org/show_bug.cgi?id=1291 - * @param string $algorithm Name of the encryption algorithm - * @return bool - */ - private static function bad_algorithm_candidate($algorithm) - { - switch ($algorithm) { - case 'arcfour256': - case 'aes192-ctr': - case 'aes256-ctr': - return true; - } - - return false; - } - - /** - * Login - * - * The $password parameter can be a plaintext password, a \phpseclib3\Crypt\RSA|EC|DSA object, a \phpseclib3\System\SSH\Agent object or an array - * - * @param string $username - * @param string|PrivateKey|array[]|Agent|null ...$args - * @return bool - * @see self::_login() - */ - public function login($username, ...$args) - { - if (!$this->login_credentials_finalized) { - $this->auth[] = func_get_args(); - } - - // try logging with 'none' as an authentication method first since that's what - // PuTTY does - if (substr($this->server_identifier, 0, 15) != 'SSH-2.0-CoreFTP' && $this->auth_methods_to_continue === null) { - if ($this->sublogin($username)) { - return true; - } - if (!count($args)) { - return false; - } - } - return $this->sublogin($username, ...$args); - } - - /** - * Login Helper - * - * @param string $username - * @param string|PrivateKey|array[]|Agent|null ...$args - * @return bool - * @see self::_login_helper() - */ - protected function sublogin($username, ...$args) - { - if (!($this->bitmap & self::MASK_CONSTRUCTOR)) { - $this->connect(); - } - - if (empty($args)) { - return $this->login_helper($username); - } - - foreach ($args as $arg) { - switch (true) { - case $arg instanceof PublicKey: - throw new \UnexpectedValueException('A PublicKey object was passed to the login method instead of a PrivateKey object'); - case $arg instanceof PrivateKey: - case $arg instanceof Agent: - case is_array($arg): - case Strings::is_stringable($arg): - break; - default: - throw new \UnexpectedValueException('$password needs to either be an instance of \phpseclib3\Crypt\Common\PrivateKey, \System\SSH\Agent, an array or a string'); - } - } - - while (count($args)) { - if (!$this->auth_methods_to_continue || !$this->smartMFA) { - $newargs = $args; - $args = []; - } else { - $newargs = []; - foreach ($this->auth_methods_to_continue as $method) { - switch ($method) { - case 'publickey': - foreach ($args as $key => $arg) { - if ($arg instanceof PrivateKey || $arg instanceof Agent) { - $newargs[] = $arg; - unset($args[$key]); - break; - } - } - break; - case 'keyboard-interactive': - $hasArray = $hasString = false; - foreach ($args as $arg) { - if ($hasArray || is_array($arg)) { - $hasArray = true; - break; - } - if ($hasString || Strings::is_stringable($arg)) { - $hasString = true; - break; - } - } - if ($hasArray && $hasString) { - foreach ($args as $key => $arg) { - if (is_array($arg)) { - $newargs[] = $arg; - break 2; - } - } - } - // fall-through - case 'password': - foreach ($args as $key => $arg) { - $newargs[] = $arg; - unset($args[$key]); - break; - } - } - } - } - - if (!count($newargs)) { - return false; - } - - foreach ($newargs as $arg) { - if ($this->login_helper($username, $arg)) { - $this->login_credentials_finalized = true; - return true; - } - } - } - return false; - } - - /** - * Login Helper - * - * {@internal It might be worthwhile, at some point, to protect against {@link http://tools.ietf.org/html/rfc4251#section-9.3.9 traffic analysis} - * by sending dummy SSH_MSG_IGNORE messages.} - * - * @param string $username - * @param string|AsymmetricKey|array[]|Agent|null ...$args - * @return bool - * @throws \UnexpectedValueException on receipt of unexpected packets - * @throws \RuntimeException on other errors - */ - private function login_helper($username, $password = null) - { - if (!($this->bitmap & self::MASK_CONNECTED)) { - return false; - } - - if (!($this->bitmap & self::MASK_LOGIN_REQ)) { - $packet = Strings::packSSH2('Cs', NET_SSH2_MSG_SERVICE_REQUEST, 'ssh-userauth'); - $this->send_binary_packet($packet); - - try { - $response = $this->get_binary_packet_or_close(NET_SSH2_MSG_SERVICE_ACCEPT); - } catch (InvalidPacketLengthException $e) { - // the first opportunity to encounter the "bad key size" error - if (!$this->bad_key_size_fix && $this->decryptName != null && self::bad_algorithm_candidate($this->decryptName)) { - // bad_key_size_fix is only ever re-assigned to true here - // retry the connection with that new setting but we'll - // only try it once. - $this->bad_key_size_fix = true; - return $this->reconnect(); - } - throw $e; - } - - list($type) = Strings::unpackSSH2('C', $response); - list($service) = Strings::unpackSSH2('s', $response); - - if ($service != 'ssh-userauth') { - $this->disconnect_helper(NET_SSH2_DISCONNECT_PROTOCOL_ERROR); - throw new \UnexpectedValueException('Expected SSH_MSG_SERVICE_ACCEPT'); - } - $this->bitmap |= self::MASK_LOGIN_REQ; - } - - if (strlen($this->last_interactive_response)) { - return !Strings::is_stringable($password) && !is_array($password) ? false : $this->keyboard_interactive_process($password); - } - - if ($password instanceof PrivateKey) { - return $this->privatekey_login($username, $password); - } - - if ($password instanceof Agent) { - return $this->ssh_agent_login($username, $password); - } - - if (is_array($password)) { - if ($this->keyboard_interactive_login($username, $password)) { - $this->bitmap |= self::MASK_LOGIN; - return true; - } - return false; - } - - if (!isset($password)) { - $packet = Strings::packSSH2( - 'Cs3', - NET_SSH2_MSG_USERAUTH_REQUEST, - $username, - 'ssh-connection', - 'none' - ); - - $this->send_binary_packet($packet); - - $response = $this->get_binary_packet_or_close(); - - list($type) = Strings::unpackSSH2('C', $response); - switch ($type) { - case NET_SSH2_MSG_USERAUTH_SUCCESS: - $this->bitmap |= self::MASK_LOGIN; - return true; - case NET_SSH2_MSG_USERAUTH_FAILURE: - list($auth_methods) = Strings::unpackSSH2('L', $response); - $this->auth_methods_to_continue = $auth_methods; - // fall-through - default: - return false; - } - } - - $packet = Strings::packSSH2( - 'Cs3bs', - NET_SSH2_MSG_USERAUTH_REQUEST, - $username, - 'ssh-connection', - 'password', - false, - $password - ); - - // remove the username and password from the logged packet - if (!defined('NET_SSH2_LOGGING')) { - $logged = null; - } else { - $logged = Strings::packSSH2( - 'Cs3bs', - NET_SSH2_MSG_USERAUTH_REQUEST, - $username, - 'ssh-connection', - 'password', - false, - 'password' - ); - } - - $this->send_binary_packet($packet, $logged); - - $response = $this->get_binary_packet_or_close(); - list($type) = Strings::unpackSSH2('C', $response); - switch ($type) { - case NET_SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ: // in theory, the password can be changed - $this->updateLogHistory('UNKNOWN (60)', 'NET_SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ'); - - list($message) = Strings::unpackSSH2('s', $response); - $this->errors[] = 'SSH_MSG_USERAUTH_PASSWD_CHANGEREQ: ' . $message; - - return $this->disconnect_helper(NET_SSH2_DISCONNECT_AUTH_CANCELLED_BY_USER); - case NET_SSH2_MSG_USERAUTH_FAILURE: - // can we use keyboard-interactive authentication? if not then either the login is bad or the server employees - // multi-factor authentication - list($auth_methods, $partial_success) = Strings::unpackSSH2('Lb', $response); - $this->auth_methods_to_continue = $auth_methods; - if (!$partial_success && in_array('keyboard-interactive', $auth_methods)) { - if ($this->keyboard_interactive_login($username, $password)) { - $this->bitmap |= self::MASK_LOGIN; - return true; - } - return false; - } - return false; - case NET_SSH2_MSG_USERAUTH_SUCCESS: - $this->bitmap |= self::MASK_LOGIN; - return true; - } - - return false; - } - - /** - * Login via keyboard-interactive authentication - * - * See {@link http://tools.ietf.org/html/rfc4256 RFC4256} for details. This is not a full-featured keyboard-interactive authenticator. - * - * @param string $username - * @param string|array $password - * @return bool - */ - private function keyboard_interactive_login($username, $password) - { - $packet = Strings::packSSH2( - 'Cs5', - NET_SSH2_MSG_USERAUTH_REQUEST, - $username, - 'ssh-connection', - 'keyboard-interactive', - '', // language tag - '' // submethods - ); - $this->send_binary_packet($packet); - - return $this->keyboard_interactive_process($password); - } - - /** - * Handle the keyboard-interactive requests / responses. - * - * @param string|array ...$responses - * @return bool - * @throws \RuntimeException on connection error - */ - private function keyboard_interactive_process(...$responses) - { - if (strlen($this->last_interactive_response)) { - $response = $this->last_interactive_response; - } else { - $orig = $response = $this->get_binary_packet_or_close(); - } - - list($type) = Strings::unpackSSH2('C', $response); - switch ($type) { - case NET_SSH2_MSG_USERAUTH_INFO_REQUEST: - list( - , // name; may be empty - , // instruction; may be empty - , // language tag; may be empty - $num_prompts - ) = Strings::unpackSSH2('s3N', $response); - - for ($i = 0; $i < count($responses); $i++) { - if (is_array($responses[$i])) { - foreach ($responses[$i] as $key => $value) { - $this->keyboard_requests_responses[$key] = $value; - } - unset($responses[$i]); - } - } - $responses = array_values($responses); - - if (isset($this->keyboard_requests_responses)) { - for ($i = 0; $i < $num_prompts; $i++) { - list( - $prompt, // prompt - ie. "Password: "; must not be empty - // echo - ) = Strings::unpackSSH2('sC', $response); - foreach ($this->keyboard_requests_responses as $key => $value) { - if (substr($prompt, 0, strlen($key)) == $key) { - $responses[] = $value; - break; - } - } - } - } - - // see http://tools.ietf.org/html/rfc4256#section-3.2 - if (strlen($this->last_interactive_response)) { - $this->last_interactive_response = ''; - } else { - $this->updateLogHistory('UNKNOWN (60)', 'NET_SSH2_MSG_USERAUTH_INFO_REQUEST'); - } - - if (!count($responses) && $num_prompts) { - $this->last_interactive_response = $orig; - return false; - } - - /* - After obtaining the requested information from the user, the client - MUST respond with an SSH_MSG_USERAUTH_INFO_RESPONSE message. - */ - // see http://tools.ietf.org/html/rfc4256#section-3.4 - $packet = $logged = pack('CN', NET_SSH2_MSG_USERAUTH_INFO_RESPONSE, count($responses)); - for ($i = 0; $i < count($responses); $i++) { - $packet .= Strings::packSSH2('s', $responses[$i]); - $logged .= Strings::packSSH2('s', 'dummy-answer'); - } - - $this->send_binary_packet($packet, $logged); - - $this->updateLogHistory('UNKNOWN (61)', 'NET_SSH2_MSG_USERAUTH_INFO_RESPONSE'); - - /* - After receiving the response, the server MUST send either an - SSH_MSG_USERAUTH_SUCCESS, SSH_MSG_USERAUTH_FAILURE, or another - SSH_MSG_USERAUTH_INFO_REQUEST message. - */ - // maybe phpseclib should force close the connection after x request / responses? unless something like that is done - // there could be an infinite loop of request / responses. - return $this->keyboard_interactive_process(); - case NET_SSH2_MSG_USERAUTH_SUCCESS: - return true; - case NET_SSH2_MSG_USERAUTH_FAILURE: - list($auth_methods) = Strings::unpackSSH2('L', $response); - $this->auth_methods_to_continue = $auth_methods; - return false; - } - - return false; - } - - /** - * Login with an ssh-agent provided key - * - * @param string $username - * @param Agent $agent - * @return bool - */ - private function ssh_agent_login($username, Agent $agent) - { - $this->agent = $agent; - $keys = $agent->requestIdentities(); - $orig_algorithms = $this->supported_private_key_algorithms; - foreach ($keys as $key) { - if ($this->privatekey_login($username, $key)) { - return true; - } - $this->supported_private_key_algorithms = $orig_algorithms; - } - - return false; - } - - /** - * Login with an RSA private key - * - * {@internal It might be worthwhile, at some point, to protect against {@link http://tools.ietf.org/html/rfc4251#section-9.3.9 traffic analysis} - * by sending dummy SSH_MSG_IGNORE messages.} - * - * @param string $username - * @param PrivateKey $privatekey - * @return bool - * @throws \RuntimeException on connection error - */ - private function privatekey_login($username, PrivateKey $privatekey) - { - $publickey = $privatekey->getPublicKey(); - - if ($publickey instanceof RSA) { - $privatekey = $privatekey->withPadding(RSA::SIGNATURE_PKCS1); - $algos = ['rsa-sha2-256', 'rsa-sha2-512', 'ssh-rsa']; - if (isset($this->preferred['hostkey'])) { - $algos = array_intersect($algos, $this->preferred['hostkey']); - } - $algo = self::array_intersect_first($algos, $this->supported_private_key_algorithms); - switch ($algo) { - case 'rsa-sha2-512': - $hash = 'sha512'; - $signatureType = 'rsa-sha2-512'; - break; - case 'rsa-sha2-256': - $hash = 'sha256'; - $signatureType = 'rsa-sha2-256'; - break; - //case 'ssh-rsa': - default: - $hash = 'sha1'; - $signatureType = 'ssh-rsa'; - } - } elseif ($publickey instanceof EC) { - $privatekey = $privatekey->withSignatureFormat('SSH2'); - $curveName = $privatekey->getCurve(); - switch ($curveName) { - case 'Ed25519': - $hash = 'sha512'; - $signatureType = 'ssh-ed25519'; - break; - case 'secp256r1': // nistp256 - $hash = 'sha256'; - $signatureType = 'ecdsa-sha2-nistp256'; - break; - case 'secp384r1': // nistp384 - $hash = 'sha384'; - $signatureType = 'ecdsa-sha2-nistp384'; - break; - case 'secp521r1': // nistp521 - $hash = 'sha512'; - $signatureType = 'ecdsa-sha2-nistp521'; - break; - default: - if (is_array($curveName)) { - throw new UnsupportedCurveException('Specified Curves are not supported by SSH2'); - } - throw new UnsupportedCurveException('Named Curve of ' . $curveName . ' is not supported by phpseclib3\'s SSH2 implementation'); - } - } elseif ($publickey instanceof DSA) { - $privatekey = $privatekey->withSignatureFormat('SSH2'); - $hash = 'sha1'; - $signatureType = 'ssh-dss'; - } else { - throw new UnsupportedAlgorithmException('Please use either an RSA key, an EC one or a DSA key'); - } - - $publickeyStr = $publickey->toString('OpenSSH', ['binary' => true]); - - $part1 = Strings::packSSH2( - 'Csss', - NET_SSH2_MSG_USERAUTH_REQUEST, - $username, - 'ssh-connection', - 'publickey' - ); - $part2 = Strings::packSSH2('ss', $signatureType, $publickeyStr); - - $packet = $part1 . chr(0) . $part2; - $this->send_binary_packet($packet); - - $response = $this->get_binary_packet_or_close( - NET_SSH2_MSG_USERAUTH_SUCCESS, - NET_SSH2_MSG_USERAUTH_FAILURE, - NET_SSH2_MSG_USERAUTH_PK_OK - ); - - list($type) = Strings::unpackSSH2('C', $response); - switch ($type) { - case NET_SSH2_MSG_USERAUTH_FAILURE: - list($auth_methods) = Strings::unpackSSH2('L', $response); - if (in_array('publickey', $auth_methods) && substr($signatureType, 0, 9) == 'rsa-sha2-') { - $this->supported_private_key_algorithms = array_diff($this->supported_private_key_algorithms, ['rsa-sha2-256', 'rsa-sha2-512']); - return $this->privatekey_login($username, $privatekey); - } - $this->auth_methods_to_continue = $auth_methods; - $this->errors[] = 'SSH_MSG_USERAUTH_FAILURE'; - return false; - case NET_SSH2_MSG_USERAUTH_PK_OK: - // we'll just take it on faith that the public key blob and the public key algorithm name are as - // they should be - $this->updateLogHistory('UNKNOWN (60)', 'NET_SSH2_MSG_USERAUTH_PK_OK'); - break; - case NET_SSH2_MSG_USERAUTH_SUCCESS: - $this->bitmap |= self::MASK_LOGIN; - return true; - } - - $packet = $part1 . chr(1) . $part2; - $privatekey = $privatekey->withHash($hash); - $signature = $privatekey->sign(Strings::packSSH2('s', $this->session_id) . $packet); - if ($publickey instanceof RSA) { - $signature = Strings::packSSH2('ss', $signatureType, $signature); - } - $packet .= Strings::packSSH2('s', $signature); - - $this->send_binary_packet($packet); - - $response = $this->get_binary_packet_or_close( - NET_SSH2_MSG_USERAUTH_SUCCESS, - NET_SSH2_MSG_USERAUTH_FAILURE - ); - - list($type) = Strings::unpackSSH2('C', $response); - switch ($type) { - case NET_SSH2_MSG_USERAUTH_FAILURE: - // either the login is bad or the server employs multi-factor authentication - list($auth_methods) = Strings::unpackSSH2('L', $response); - $this->auth_methods_to_continue = $auth_methods; - return false; - case NET_SSH2_MSG_USERAUTH_SUCCESS: - $this->bitmap |= self::MASK_LOGIN; - return true; - } - } - - /** - * Return the currently configured timeout - * - * @return int - */ - public function getTimeout() - { - return $this->timeout; - } - - /** - * Set Timeout - * - * $ssh->exec('ping 127.0.0.1'); on a Linux host will never return and will run indefinitely. setTimeout() makes it so it'll timeout. - * Setting $timeout to false or 0 will revert to the default socket timeout. - * - * @param mixed $timeout - */ - public function setTimeout($timeout) - { - $this->timeout = $this->curTimeout = $timeout; - } - - /** - * Set Keep Alive - * - * Sends an SSH2_MSG_IGNORE message every x seconds, if x is a positive non-zero number. - * - * @param int $interval - */ - public function setKeepAlive($interval) - { - $this->keepAlive = $interval; - } - - /** - * Get the output from stdError - * - */ - public function getStdError() - { - return $this->stdErrorLog; - } - - /** - * Execute Command - * - * If $callback is set to false then \phpseclib3\Net\SSH2::get_channel_packet(self::CHANNEL_EXEC) will need to be called manually. - * In all likelihood, this is not a feature you want to be taking advantage of. - * - * @param string $command - * @param callable $callback - * @return string|bool - * @psalm-return ($callback is callable ? bool : string|bool) - * @throws \RuntimeException on connection error - */ - public function exec($command, $callback = null) - { - $this->curTimeout = $this->timeout; - $this->is_timeout = false; - $this->stdErrorLog = ''; - - if (!$this->isAuthenticated()) { - return false; - } - - //if ($this->isPTYOpen()) { - // throw new \RuntimeException('If you want to run multiple exec()\'s you will need to disable (and re-enable if appropriate) a PTY for each one.'); - //} - - $this->open_channel(self::CHANNEL_EXEC); - - if ($this->request_pty === true) { - $terminal_modes = pack('C', NET_SSH2_TTY_OP_END); - $packet = Strings::packSSH2( - 'CNsCsN4s', - NET_SSH2_MSG_CHANNEL_REQUEST, - $this->server_channels[self::CHANNEL_EXEC], - 'pty-req', - 1, - $this->term, - $this->windowColumns, - $this->windowRows, - 0, - 0, - $terminal_modes - ); - - $this->send_binary_packet($packet); - - $this->channel_status[self::CHANNEL_EXEC] = NET_SSH2_MSG_CHANNEL_REQUEST; - if (!$this->get_channel_packet(self::CHANNEL_EXEC)) { - $this->disconnect_helper(NET_SSH2_DISCONNECT_BY_APPLICATION); - throw new \RuntimeException('Unable to request pseudo-terminal'); - } - } - - // sending a pty-req SSH_MSG_CHANNEL_REQUEST message is unnecessary and, in fact, in most cases, slows things - // down. the one place where it might be desirable is if you're doing something like \phpseclib3\Net\SSH2::exec('ping localhost &'). - // with a pty-req SSH_MSG_CHANNEL_REQUEST, exec() will return immediately and the ping process will then - // then immediately terminate. without such a request exec() will loop indefinitely. the ping process won't end but - // neither will your script. - - // although, in theory, the size of SSH_MSG_CHANNEL_REQUEST could exceed the maximum packet size established by - // SSH_MSG_CHANNEL_OPEN_CONFIRMATION, RFC4254#section-5.1 states that the "maximum packet size" refers to the - // "maximum size of an individual data packet". ie. SSH_MSG_CHANNEL_DATA. RFC4254#section-5.2 corroborates. - $packet = Strings::packSSH2( - 'CNsCs', - NET_SSH2_MSG_CHANNEL_REQUEST, - $this->server_channels[self::CHANNEL_EXEC], - 'exec', - 1, - $command - ); - $this->send_binary_packet($packet); - - $this->channel_status[self::CHANNEL_EXEC] = NET_SSH2_MSG_CHANNEL_REQUEST; - - if (!$this->get_channel_packet(self::CHANNEL_EXEC)) { - return false; - } - - $this->channel_status[self::CHANNEL_EXEC] = NET_SSH2_MSG_CHANNEL_DATA; - - if ($this->request_pty === true) { - $this->channel_id_last_interactive = self::CHANNEL_EXEC; - return true; - } - - $output = ''; - while (true) { - $temp = $this->get_channel_packet(self::CHANNEL_EXEC); - switch (true) { - case $temp === true: - return is_callable($callback) ? true : $output; - case $temp === false: - return false; - default: - if (is_callable($callback)) { - if ($callback($temp) === true) { - $this->close_channel(self::CHANNEL_EXEC); - return true; - } - } else { - $output .= $temp; - } - } - } - } - - /** - * How many channels are currently open? - * - * @return int - */ - public function getOpenChannelCount() - { - return $this->channelCount; - } - - /** - * Opens a channel - * - * @param string $channel - * @param bool $skip_extended - * @return bool - */ - protected function open_channel($channel, $skip_extended = false) - { - if (isset($this->channel_status[$channel])) { - throw new \RuntimeException('Please close the channel (' . $channel . ') before trying to open it again'); - } - - $this->channelCount++; - - if ($this->channelCount > 1 && $this->errorOnMultipleChannels) { - throw new \RuntimeException("Ubuntu's OpenSSH from 5.8 to 6.9 doesn't work with multiple channels"); - } - - // RFC4254 defines the (client) window size as "bytes the other party can send before it must wait for the window to - // be adjusted". 0x7FFFFFFF is, at 2GB, the max size. technically, it should probably be decremented, but, - // honestly, if you're transferring more than 2GB, you probably shouldn't be using phpseclib, anyway. - // see http://tools.ietf.org/html/rfc4254#section-5.2 for more info - $this->window_size_server_to_client[$channel] = $this->window_size; - // 0x8000 is the maximum max packet size, per http://tools.ietf.org/html/rfc4253#section-6.1, although since PuTTy - // uses 0x4000, that's what will be used here, as well. - $packet_size = 0x4000; - - $packet = Strings::packSSH2( - 'CsN3', - NET_SSH2_MSG_CHANNEL_OPEN, - 'session', - $channel, - $this->window_size_server_to_client[$channel], - $packet_size - ); - - $this->send_binary_packet($packet); - - $this->channel_status[$channel] = NET_SSH2_MSG_CHANNEL_OPEN; - - return $this->get_channel_packet($channel, $skip_extended); - } - - /** - * Creates an interactive shell - * - * Returns bool(true) if the shell was opened. - * Returns bool(false) if the shell was already open. - * - * @see self::isShellOpen() - * @see self::read() - * @see self::write() - * @return bool - * @throws InsufficientSetupException if not authenticated - * @throws \UnexpectedValueException on receipt of unexpected packets - * @throws \RuntimeException on other errors - */ - public function openShell() - { - if (!$this->isAuthenticated()) { - throw new InsufficientSetupException('Operation disallowed prior to login()'); - } - - $this->open_channel(self::CHANNEL_SHELL); - - $terminal_modes = pack('C', NET_SSH2_TTY_OP_END); - $packet = Strings::packSSH2( - 'CNsbsN4s', - NET_SSH2_MSG_CHANNEL_REQUEST, - $this->server_channels[self::CHANNEL_SHELL], - 'pty-req', - true, // want reply - $this->term, - $this->windowColumns, - $this->windowRows, - 0, - 0, - $terminal_modes - ); - - $this->send_binary_packet($packet); - - $this->channel_status[self::CHANNEL_SHELL] = NET_SSH2_MSG_CHANNEL_REQUEST; - - if (!$this->get_channel_packet(self::CHANNEL_SHELL)) { - throw new \RuntimeException('Unable to request pty'); - } - - $packet = Strings::packSSH2( - 'CNsb', - NET_SSH2_MSG_CHANNEL_REQUEST, - $this->server_channels[self::CHANNEL_SHELL], - 'shell', - true // want reply - ); - $this->send_binary_packet($packet); - - $response = $this->get_channel_packet(self::CHANNEL_SHELL); - if ($response === false) { - throw new \RuntimeException('Unable to request shell'); - } - - $this->channel_status[self::CHANNEL_SHELL] = NET_SSH2_MSG_CHANNEL_DATA; - - $this->channel_id_last_interactive = self::CHANNEL_SHELL; - - $this->bitmap |= self::MASK_SHELL; - - return true; - } - - /** - * Return the channel to be used with read(), write(), and reset(), if none were specified - * @deprecated for lack of transparency in intended channel target, to be potentially replaced - * with method which guarantees open-ness of all yielded channels and throws - * error for multiple open channels - * @see self::read() - * @see self::write() - * @return int - */ - private function get_interactive_channel() - { - switch (true) { - case $this->is_channel_status_data(self::CHANNEL_SUBSYSTEM): - return self::CHANNEL_SUBSYSTEM; - case $this->is_channel_status_data(self::CHANNEL_EXEC): - return self::CHANNEL_EXEC; - default: - return self::CHANNEL_SHELL; - } - } - - /** - * Indicates the DATA status on the given channel - * - * @param int $channel The channel number to evaluate - * @return bool - */ - private function is_channel_status_data($channel) - { - return isset($this->channel_status[$channel]) && $this->channel_status[$channel] == NET_SSH2_MSG_CHANNEL_DATA; - } - - /** - * Return an available open channel - * - * @return int - */ - private function get_open_channel() - { - $channel = self::CHANNEL_EXEC; - do { - if (isset($this->channel_status[$channel]) && $this->channel_status[$channel] == NET_SSH2_MSG_CHANNEL_OPEN) { - return $channel; - } - } while ($channel++ < self::CHANNEL_SUBSYSTEM); - - return false; - } - - /** - * Request agent forwarding of remote server - * - * @return bool - */ - public function requestAgentForwarding() - { - $request_channel = $this->get_open_channel(); - if ($request_channel === false) { - return false; - } - - $packet = Strings::packSSH2( - 'CNsC', - NET_SSH2_MSG_CHANNEL_REQUEST, - $this->server_channels[$request_channel], - 'auth-agent-req@openssh.com', - 1 - ); - - $this->channel_status[$request_channel] = NET_SSH2_MSG_CHANNEL_REQUEST; - - $this->send_binary_packet($packet); - - if (!$this->get_channel_packet($request_channel)) { - return false; - } - - $this->channel_status[$request_channel] = NET_SSH2_MSG_CHANNEL_OPEN; - - return true; - } - - /** - * Returns the output of an interactive shell - * - * Returns when there's a match for $expect, which can take the form of a string literal or, - * if $mode == self::READ_REGEX, a regular expression. - * - * If not specifying a channel, an open interactive channel will be selected, or, if there are - * no open channels, an interactive shell will be created. If there are multiple open - * interactive channels, a legacy behavior will apply in which channel selection prioritizes - * an active subsystem, the exec pty, and, lastly, the shell. If using multiple interactive - * channels, callers are discouraged from relying on this legacy behavior and should specify - * the intended channel. - * - * @see self::write() - * @param string $expect - * @param int $mode One of the self::READ_* constants - * @param int|null $channel Channel id returned by self::getInteractiveChannelId() - * @return string|bool|null - * @throws \RuntimeException on connection error - * @throws InsufficientSetupException on unexpected channel status, possibly due to closure - */ - public function read($expect = '', $mode = self::READ_SIMPLE, $channel = null) - { - if (!$this->isAuthenticated()) { - throw new InsufficientSetupException('Operation disallowed prior to login()'); - } - - $this->curTimeout = $this->timeout; - $this->is_timeout = false; - - if ($channel === null) { - $channel = $this->get_interactive_channel(); - } - - if (!$this->is_channel_status_data($channel) && empty($this->channel_buffers[$channel])) { - if ($channel != self::CHANNEL_SHELL) { - throw new InsufficientSetupException('Data is not available on channel'); - } elseif (!$this->openShell()) { - throw new \RuntimeException('Unable to initiate an interactive shell session'); - } - } - - if ($mode == self::READ_NEXT) { - return $this->get_channel_packet($channel); - } - - $match = $expect; - while (true) { - if ($mode == self::READ_REGEX) { - preg_match($expect, substr($this->interactiveBuffer, -1024), $matches); - $match = isset($matches[0]) ? $matches[0] : ''; - } - $pos = strlen($match) ? strpos($this->interactiveBuffer, $match) : false; - if ($pos !== false) { - return Strings::shift($this->interactiveBuffer, $pos + strlen($match)); - } - $response = $this->get_channel_packet($channel); - if ($response === true) { - return Strings::shift($this->interactiveBuffer, strlen($this->interactiveBuffer)); - } - - $this->interactiveBuffer .= $response; - } - } - - /** - * Inputs a command into an interactive shell. - * - * If not specifying a channel, an open interactive channel will be selected, or, if there are - * no open channels, an interactive shell will be created. If there are multiple open - * interactive channels, a legacy behavior will apply in which channel selection prioritizes - * an active subsystem, the exec pty, and, lastly, the shell. If using multiple interactive - * channels, callers are discouraged from relying on this legacy behavior and should specify - * the intended channel. - * - * @see SSH2::read() - * @param string $cmd - * @param int|null $channel Channel id returned by self::getInteractiveChannelId() - * @return void - * @throws \RuntimeException on connection error - * @throws InsufficientSetupException on unexpected channel status, possibly due to closure - * @throws TimeoutException if the write could not be completed within the requested self::setTimeout() - */ - public function write($cmd, $channel = null) - { - if (!$this->isAuthenticated()) { - throw new InsufficientSetupException('Operation disallowed prior to login()'); - } - - if ($channel === null) { - $channel = $this->get_interactive_channel(); - } - - if (!$this->is_channel_status_data($channel)) { - if ($channel != self::CHANNEL_SHELL) { - throw new InsufficientSetupException('Data is not available on channel'); - } elseif (!$this->openShell()) { - throw new \RuntimeException('Unable to initiate an interactive shell session'); - } - } - - $this->curTimeout = $this->timeout; - $this->is_timeout = false; - $this->send_channel_packet($channel, $cmd); - } - - /** - * Start a subsystem. - * - * Right now only one subsystem at a time is supported. To support multiple subsystem's stopSubsystem() could accept - * a string that contained the name of the subsystem, but at that point, only one subsystem of each type could be opened. - * To support multiple subsystem's of the same name maybe it'd be best if startSubsystem() generated a new channel id and - * returns that and then that that was passed into stopSubsystem() but that'll be saved for a future date and implemented - * if there's sufficient demand for such a feature. - * - * @see self::stopSubsystem() - * @param string $subsystem - * @return bool - */ - public function startSubsystem($subsystem) - { - $this->open_channel(self::CHANNEL_SUBSYSTEM); - - $packet = Strings::packSSH2( - 'CNsCs', - NET_SSH2_MSG_CHANNEL_REQUEST, - $this->server_channels[self::CHANNEL_SUBSYSTEM], - 'subsystem', - 1, - $subsystem - ); - $this->send_binary_packet($packet); - - $this->channel_status[self::CHANNEL_SUBSYSTEM] = NET_SSH2_MSG_CHANNEL_REQUEST; - - if (!$this->get_channel_packet(self::CHANNEL_SUBSYSTEM)) { - return false; - } - - $this->channel_status[self::CHANNEL_SUBSYSTEM] = NET_SSH2_MSG_CHANNEL_DATA; - - $this->channel_id_last_interactive = self::CHANNEL_SUBSYSTEM; - - return true; - } - - /** - * Stops a subsystem. - * - * @see self::startSubsystem() - * @return bool - */ - public function stopSubsystem() - { - if ($this->isInteractiveChannelOpen(self::CHANNEL_SUBSYSTEM)) { - $this->close_channel(self::CHANNEL_SUBSYSTEM); - } - return true; - } - - /** - * Closes a channel - * - * If read() timed out you might want to just close the channel and have it auto-restart on the next read() call - * - * If not specifying a channel, an open interactive channel will be selected. If there are - * multiple open interactive channels, a legacy behavior will apply in which channel selection - * prioritizes an active subsystem, the exec pty, and, lastly, the shell. If using multiple - * interactive channels, callers are discouraged from relying on this legacy behavior and - * should specify the intended channel. - * - * @param int|null $channel Channel id returned by self::getInteractiveChannelId() - * @return void - */ - public function reset($channel = null) - { - if ($channel === null) { - $channel = $this->get_interactive_channel(); - } - if ($this->isInteractiveChannelOpen($channel)) { - $this->close_channel($channel); - } - } - - /** - * Send EOF on a channel - * - * Sends an EOF to the stream; this is typically used to close standard - * input, while keeping output and error alive. - * - * @param int|null $channel Channel id returned by self::getInteractiveChannelId() - * @return void - */ - public function sendEOF($channel = null) - { - if ($channel === null) { - $channel = $this->get_interactive_channel(); - } - - $excludeStatuses = [NET_SSH2_MSG_CHANNEL_EOF, NET_SSH2_MSG_CHANNEL_CLOSE]; - if (isset($this->channel_status[$channel]) && !in_array($this->channel_status[$channel], $excludeStatuses)) { - $this->send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_EOF, $this->server_channels[$channel])); - } - } - - /** - * Is timeout? - * - * Did exec() or read() return because they timed out or because they encountered the end? - * - */ - public function isTimeout() - { - return $this->is_timeout; - } - - /** - * Disconnect - * - */ - public function disconnect() - { - $this->disconnect_helper(NET_SSH2_DISCONNECT_BY_APPLICATION); - if (isset($this->realtime_log_file) && is_resource($this->realtime_log_file)) { - fclose($this->realtime_log_file); - } - unset(self::$connections[$this->getResourceId()]); - } - - /** - * Destructor. - * - * Will be called, automatically, if you're supporting just PHP5. If you're supporting PHP4, you'll need to call - * disconnect(). - * - */ - public function __destruct() - { - $this->disconnect(); - } - - /** - * Is the connection still active? - * - * $level has 3x possible values: - * 0 (default): phpseclib takes a passive approach to see if the connection is still active by calling feof() - * on the socket - * 1: phpseclib takes an active approach to see if the connection is still active by sending an SSH_MSG_IGNORE - * packet that doesn't require a response - * 2: phpseclib takes an active approach to see if the connection is still active by sending an SSH_MSG_CHANNEL_OPEN - * packet and imediately trying to close that channel. some routers, in particular, however, will only let you - * open one channel, so this approach could yield false positives - * - * @param int $level - * @return bool - */ - public function isConnected($level = 0) - { - if (!is_int($level) || $level < 0 || $level > 2) { - throw new \InvalidArgumentException('$level must be 0, 1 or 2'); - } - - if ($level == 0) { - return ($this->bitmap & self::MASK_CONNECTED) && is_resource($this->fsock) && !feof($this->fsock); - } - try { - if ($level == 1) { - $this->send_binary_packet(pack('CN', NET_SSH2_MSG_IGNORE, 0)); - } else { - $this->open_channel(self::CHANNEL_KEEP_ALIVE); - $this->close_channel(self::CHANNEL_KEEP_ALIVE); - } - return true; - } catch (\Exception $e) { - return false; - } - } - - /** - * Have you successfully been logged in? - * - * @return bool - */ - public function isAuthenticated() - { - return (bool) ($this->bitmap & self::MASK_LOGIN); - } - - /** - * Is the interactive shell active? - * - * @return bool - */ - public function isShellOpen() - { - return $this->isInteractiveChannelOpen(self::CHANNEL_SHELL); - } - - /** - * Is the exec pty active? - * - * @return bool - */ - public function isPTYOpen() - { - return $this->isInteractiveChannelOpen(self::CHANNEL_EXEC); - } - - /** - * Is the given interactive channel active? - * - * @param int $channel Channel id returned by self::getInteractiveChannelId() - * @return bool - */ - public function isInteractiveChannelOpen($channel) - { - return $this->isAuthenticated() && $this->is_channel_status_data($channel); - } - - /** - * Returns a channel identifier, presently of the last interactive channel opened, regardless of current status. - * Returns 0 if no interactive channel has been opened. - * - * @see self::isInteractiveChannelOpen() - * @return int - */ - public function getInteractiveChannelId() - { - return $this->channel_id_last_interactive; - } - - /** - * Pings a server connection, or tries to reconnect if the connection has gone down - * - * Inspired by http://php.net/manual/en/mysqli.ping.php - * - * @return bool - */ - public function ping() - { - if (!$this->isAuthenticated()) { - if (!empty($this->auth)) { - return $this->reconnect(); - } - return false; - } - - try { - $this->open_channel(self::CHANNEL_KEEP_ALIVE); - } catch (\RuntimeException $e) { - return $this->reconnect(); - } - - $this->close_channel(self::CHANNEL_KEEP_ALIVE); - return true; - } - - /** - * In situ reconnect method - * - * @return boolean - */ - private function reconnect() - { - $this->disconnect_helper(NET_SSH2_DISCONNECT_BY_APPLICATION); - $this->connect(); - foreach ($this->auth as $auth) { - $result = $this->login(...$auth); - } - return $result; - } - - /** - * Resets a connection for re-use - */ - protected function reset_connection() - { - if (is_resource($this->fsock) && get_resource_type($this->fsock) === 'stream') { - fclose($this->fsock); - } - $this->fsock = null; - $this->bitmap = 0; - $this->binary_packet_buffer = null; - $this->decrypt = $this->encrypt = false; - $this->decrypt_block_size = $this->encrypt_block_size = 8; - $this->hmac_check = $this->hmac_create = false; - $this->hmac_size = false; - $this->session_id = false; - $this->last_packet = null; - $this->get_seq_no = $this->send_seq_no = 0; - $this->channel_status = []; - $this->channel_id_last_interactive = 0; - $this->channel_buffers = []; - $this->channel_buffers_write = []; - } - - /** - * @return int[] second and microsecond stream timeout options based on user-requested timeout and keep-alive, or the default socket timeout by default, which mirrors PHP socket streams. - */ - private function get_stream_timeout() - { - $sec = ini_get('default_socket_timeout'); - $usec = 0; - if ($this->curTimeout > 0) { - $sec = (int) floor($this->curTimeout); - $usec = (int) (1000000 * ($this->curTimeout - $sec)); - } - if ($this->keepAlive > 0) { - $elapsed = microtime(true) - $this->last_packet; - $timeout = max($this->keepAlive - $elapsed, 0); - if (!$this->curTimeout || $timeout < $this->curTimeout) { - $sec = (int) floor($timeout); - $usec = (int) (1000000 * ($timeout - $sec)); - } - } - return [$sec, $usec]; - } - - /** - * Retrieves the next packet with added timeout and type handling - * - * @param string $message_types Message types to enforce in response, closing if not met - * @return string - * @throws ConnectionClosedException If an error has occurred preventing read of the next packet - */ - private function get_binary_packet_or_close(...$message_types) - { - try { - $packet = $this->get_binary_packet(); - if (count($message_types) > 0 && !in_array(ord($packet[0]), $message_types)) { - $this->disconnect_helper(NET_SSH2_DISCONNECT_PROTOCOL_ERROR); - throw new ConnectionClosedException('Bad message type. Expected: #' - . implode(', #', $message_types) . '. Got: #' . ord($packet[0])); - } - return $packet; - } catch (TimeoutException $e) { - $this->disconnect_helper(NET_SSH2_DISCONNECT_BY_APPLICATION); - throw new ConnectionClosedException('Connection closed due to timeout'); - } - } - - /** - * Gets Binary Packets - * - * See '6. Binary Packet Protocol' of rfc4253 for more info. - * - * @see self::_send_binary_packet() - * @return string - * @throws TimeoutException If user requested timeout was reached while waiting for next packet - * @throws ConnectionClosedException If an error has occurred preventing read of the next packet - */ - private function get_binary_packet() - { - if (!is_resource($this->fsock)) { - throw new \InvalidArgumentException('fsock is not a resource.'); - } - if (!$this->keyExchangeInProgress && count($this->kex_buffer)) { - return $this->filter(array_shift($this->kex_buffer)); - } - if ($this->binary_packet_buffer == null) { - // buffer the packet to permit continued reads across timeouts - $this->binary_packet_buffer = (object) [ - 'read_time' => 0, // the time to read the packet from the socket - 'raw' => '', // the raw payload read from the socket - 'plain' => '', // the packet in plain text, excluding packet_length header - 'packet_length' => null, // the packet_length value pulled from the payload - 'size' => $this->decrypt_block_size, // the total size of this packet to be read from the socket - // initialize to read single block until packet_length is available - ]; - } - $packet = $this->binary_packet_buffer; - while (strlen($packet->raw) < $packet->size) { - if (feof($this->fsock)) { - $this->disconnect_helper(NET_SSH2_DISCONNECT_CONNECTION_LOST); - throw new ConnectionClosedException('Connection closed by server'); - } - if ($this->curTimeout < 0) { - $this->is_timeout = true; - throw new TimeoutException('Timed out waiting for server'); - } - $this->send_keep_alive(); - - list($sec, $usec) = $this->get_stream_timeout(); - stream_set_timeout($this->fsock, $sec, $usec); - $start = microtime(true); - $raw = stream_get_contents($this->fsock, $packet->size - strlen($packet->raw)); - $elapsed = microtime(true) - $start; - $packet->read_time += $elapsed; - if ($this->curTimeout > 0) { - $this->curTimeout -= $elapsed; - } - if ($raw === false) { - $this->disconnect_helper(NET_SSH2_DISCONNECT_CONNECTION_LOST); - throw new ConnectionClosedException('Connection closed by server'); - } elseif (!strlen($raw)) { - continue; - } - $packet->raw .= $raw; - if (!$packet->packet_length) { - $this->get_binary_packet_size($packet); - } - } - - if (strlen($packet->raw) != $packet->size) { - throw new \RuntimeException('Size of packet was not expected length'); - } - // destroy buffer as packet represents the entire payload and should be processed in full - $this->binary_packet_buffer = null; - // copy the raw payload, so as not to destroy original - $raw = $packet->raw; - if ($this->hmac_check instanceof Hash) { - $hmac = Strings::pop($raw, $this->hmac_size); - } - $packet_length_header_size = 4; - if ($this->decrypt) { - switch ($this->decryptName) { - case 'aes128-gcm@openssh.com': - case 'aes256-gcm@openssh.com': - $this->decrypt->setNonce( - $this->decryptFixedPart . - $this->decryptInvocationCounter - ); - Strings::increment_str($this->decryptInvocationCounter); - $this->decrypt->setAAD(Strings::shift($raw, $packet_length_header_size)); - $this->decrypt->setTag(Strings::pop($raw, $this->decrypt_block_size)); - $packet->plain = $this->decrypt->decrypt($raw); - break; - case 'chacha20-poly1305@openssh.com': - // This should be impossible, but we are checking anyway to narrow the type for Psalm. - if (!($this->decrypt instanceof ChaCha20)) { - throw new \LogicException('$this->decrypt is not a ' . ChaCha20::class); - } - $this->decrypt->setNonce(pack('N2', 0, $this->get_seq_no)); - $this->decrypt->setCounter(0); - // this is the same approach that's implemented in Salsa20::createPoly1305Key() - // but we don't want to use the same AEAD construction that RFC8439 describes - // for ChaCha20-Poly1305 so we won't rely on it (see Salsa20::poly1305()) - $this->decrypt->setPoly1305Key( - $this->decrypt->encrypt(str_repeat("\0", 32)) - ); - $this->decrypt->setAAD(Strings::shift($raw, $packet_length_header_size)); - $this->decrypt->setCounter(1); - $this->decrypt->setTag(Strings::pop($raw, 16)); - $packet->plain = $this->decrypt->decrypt($raw); - break; - default: - if (!$this->hmac_check instanceof Hash || !$this->hmac_check_etm) { - // first block was already decrypted for contained packet_length header - Strings::shift($raw, $this->decrypt_block_size); - if (strlen($raw) > 0) { - $packet->plain .= $this->decrypt->decrypt($raw); - } - } else { - Strings::shift($raw, $packet_length_header_size); - $packet->plain = $this->decrypt->decrypt($raw); - } - break; - } - } else { - Strings::shift($raw, $packet_length_header_size); - $packet->plain = $raw; - } - if ($this->hmac_check instanceof Hash) { - $reconstructed = !$this->hmac_check_etm ? - pack('Na*', $packet->packet_length, $packet->plain) : - substr($packet->raw, 0, -$this->hmac_size); - if (($this->hmac_check->getHash() & "\xFF\xFF\xFF\xFF") == 'umac') { - $this->hmac_check->setNonce("\0\0\0\0" . pack('N', $this->get_seq_no)); - if ($hmac != $this->hmac_check->hash($reconstructed)) { - $this->disconnect_helper(NET_SSH2_DISCONNECT_MAC_ERROR); - throw new ConnectionClosedException('Invalid UMAC'); - } - } else { - if ($hmac != $this->hmac_check->hash(pack('Na*', $this->get_seq_no, $reconstructed))) { - $this->disconnect_helper(NET_SSH2_DISCONNECT_MAC_ERROR); - throw new ConnectionClosedException('Invalid HMAC'); - } - } - } - $padding_length = 0; - $payload = $packet->plain; - $padding_length = unpack('Cpadding_length', Strings::shift($payload, 1))['padding_length']; - if ($padding_length > 0) { - Strings::pop($payload, $padding_length); - } - - if (!$this->keyExchangeInProgress) { - $this->bytesTransferredSinceLastKEX += $packet->packet_length + $padding_length + 5; - } - - if (empty($payload)) { - $this->disconnect_helper(NET_SSH2_DISCONNECT_PROTOCOL_ERROR); - throw new ConnectionClosedException('Plaintext is too short'); - } - - switch ($this->decompress) { - case self::NET_SSH2_COMPRESSION_ZLIB_AT_OPENSSH: - if (!$this->isAuthenticated()) { - break; - } - // fall-through - case self::NET_SSH2_COMPRESSION_ZLIB: - if ($this->regenerate_decompression_context) { - $this->regenerate_decompression_context = false; - - $cmf = ord($payload[0]); - $cm = $cmf & 0x0F; - if ($cm != 8) { // deflate - throw new UnsupportedAlgorithmException("Only CM = 8 ('deflate') is supported ($cm)"); - } - $cinfo = ($cmf & 0xF0) >> 4; - if ($cinfo > 7) { - throw new \RuntimeException("CINFO above 7 is not allowed ($cinfo)"); - } - $windowSize = 1 << ($cinfo + 8); - - $flg = ord($payload[1]); - //$fcheck = $flg && 0x0F; - if ((($cmf << 8) | $flg) % 31) { - throw new \RuntimeException('fcheck failed'); - } - $fdict = boolval($flg & 0x20); - $flevel = ($flg & 0xC0) >> 6; - - $this->decompress_context = inflate_init(ZLIB_ENCODING_RAW, ['window' => $cinfo + 8]); - $payload = substr($payload, 2); - } - if ($this->decompress_context) { - $payload = inflate_add($this->decompress_context, $payload, ZLIB_PARTIAL_FLUSH); - } - } - - $this->get_seq_no++; - - if (defined('NET_SSH2_LOGGING')) { - $current = microtime(true); - $message_number = isset(self::$message_numbers[ord($payload[0])]) ? self::$message_numbers[ord($payload[0])] : 'UNKNOWN (' . ord($payload[0]) . ')'; - $message_number = '<- ' . $message_number . - ' (since last: ' . round($current - $this->last_packet, 4) . ', network: ' . round($packet->read_time, 4) . 's)'; - $this->append_log($message_number, $payload); - } - $this->last_packet = microtime(true); - - if ($this->bytesTransferredSinceLastKEX > $this->doKeyReexchangeAfterXBytes) { - $this->key_exchange(); - } - - return $this->filter($payload); - } - - /** - * @param object $packet The packet object being constructed, passed by reference - * The size, packet_length, and plain properties of this object may be modified in processing - * @throws InvalidPacketLengthException if the packet length header is invalid - */ - private function get_binary_packet_size(&$packet) - { - $packet_length_header_size = 4; - if (strlen($packet->raw) < $packet_length_header_size) { - return; - } - $packet_length = 0; - $added_validation_length = 0; // indicates when the packet length header is included when validating packet length against block size - if ($this->decrypt) { - switch ($this->decryptName) { - case 'aes128-gcm@openssh.com': - case 'aes256-gcm@openssh.com': - $packet_length = unpack('Npacket_length', substr($packet->raw, 0, $packet_length_header_size))['packet_length']; - $packet->size = $packet_length_header_size + $packet_length + $this->decrypt_block_size; // expect tag - break; - case 'chacha20-poly1305@openssh.com': - $this->lengthDecrypt->setNonce(pack('N2', 0, $this->get_seq_no)); - $packet_length_header = $this->lengthDecrypt->decrypt(substr($packet->raw, 0, $packet_length_header_size)); - $packet_length = unpack('Npacket_length', $packet_length_header)['packet_length']; - $packet->size = $packet_length_header_size + $packet_length + 16; // expect tag - break; - default: - if (!$this->hmac_check instanceof Hash || !$this->hmac_check_etm) { - if (strlen($packet->raw) < $this->decrypt_block_size) { - return; - } - $packet->plain = $this->decrypt->decrypt(substr($packet->raw, 0, $this->decrypt_block_size)); - $packet_length = unpack('Npacket_length', Strings::shift($packet->plain, $packet_length_header_size))['packet_length']; - $packet->size = $packet_length_header_size + $packet_length; - $added_validation_length = $packet_length_header_size; - } else { - $packet_length = unpack('Npacket_length', substr($packet->raw, 0, $packet_length_header_size))['packet_length']; - $packet->size = $packet_length_header_size + $packet_length; - } - break; - } - } else { - $packet_length = unpack('Npacket_length', substr($packet->raw, 0, $packet_length_header_size))['packet_length']; - $packet->size = $packet_length_header_size + $packet_length; - $added_validation_length = $packet_length_header_size; - } - // quoting , - // "implementations SHOULD check that the packet length is reasonable" - // PuTTY uses 0x9000 as the actual max packet size and so to shall we - if ( - $packet_length <= 0 || $packet_length > 0x9000 - || ($packet_length + $added_validation_length) % $this->decrypt_block_size != 0 - ) { - $this->disconnect_helper(NET_SSH2_DISCONNECT_PROTOCOL_ERROR); - throw new InvalidPacketLengthException('Invalid packet length'); - } - if ($this->hmac_check instanceof Hash) { - $packet->size += $this->hmac_size; - } - $packet->packet_length = $packet_length; - } - - /** - * Handle Disconnect - * - * Because some binary packets need to be ignored... - * - * @see self::filter() - * @see self::key_exchange() - * @return boolean - * @access private - */ - private function handleDisconnect($payload) - { - Strings::shift($payload, 1); - list($reason_code, $message) = Strings::unpackSSH2('Ns', $payload); - $this->errors[] = 'SSH_MSG_DISCONNECT: ' . self::$disconnect_reasons[$reason_code] . "\r\n$message"; - $this->disconnect_helper(NET_SSH2_DISCONNECT_CONNECTION_LOST); - throw new ConnectionClosedException('Connection closed by server'); - } - - /** - * Filter Binary Packets - * - * Because some binary packets need to be ignored... - * - * @see self::_get_binary_packet() - * @param string $payload - * @return string - */ - private function filter($payload) - { - if (ord($payload[0]) == NET_SSH2_MSG_DISCONNECT) { - return $this->handleDisconnect($payload); - } - - if ($this->session_id === false && $this->keyExchangeInProgress) { - return $payload; - } - - switch (ord($payload[0])) { - case NET_SSH2_MSG_IGNORE: - $payload = $this->get_binary_packet(); - break; - case NET_SSH2_MSG_DEBUG: - Strings::shift($payload, 2); // second byte is "always_display" - list($message) = Strings::unpackSSH2('s', $payload); - $this->errors[] = "SSH_MSG_DEBUG: $message"; - $payload = $this->get_binary_packet(); - break; - case NET_SSH2_MSG_UNIMPLEMENTED: - break; // return payload - case NET_SSH2_MSG_KEXINIT: - // this is here for server initiated key re-exchanges after the initial key exchange - if (!$this->keyExchangeInProgress && $this->session_id !== false) { - if (!$this->key_exchange($payload)) { - $this->disconnect_helper(NET_SSH2_DISCONNECT_KEY_EXCHANGE_FAILED); - throw new ConnectionClosedException('Key exchange failed'); - } - $payload = $this->get_binary_packet(); - } - break; - case NET_SSH2_MSG_EXT_INFO: - Strings::shift($payload, 1); - list($nr_extensions) = Strings::unpackSSH2('N', $payload); - for ($i = 0; $i < $nr_extensions; $i++) { - list($extension_name, $extension_value) = Strings::unpackSSH2('ss', $payload); - if ($extension_name == 'server-sig-algs') { - $this->supported_private_key_algorithms = explode(',', $extension_value); - } - } - $payload = $this->get_binary_packet(); - } - - /* - Once a party has sent a SSH_MSG_KEXINIT message for key exchange or - re-exchange, until it has sent a SSH_MSG_NEWKEYS message (Section - 7.3), it MUST NOT send any messages other than: - - o Transport layer generic messages (1 to 19) (but - SSH_MSG_SERVICE_REQUEST and SSH_MSG_SERVICE_ACCEPT MUST NOT be - sent); - - o Algorithm negotiation messages (20 to 29) (but further - SSH_MSG_KEXINIT messages MUST NOT be sent); - - o Specific key exchange method messages (30 to 49). - - -- https://www.rfc-editor.org/rfc/rfc4253#section-7.1 - */ - if ($this->keyExchangeInProgress) { - return $payload; - } - - // see http://tools.ietf.org/html/rfc4252#section-5.4; only called when the encryption has been activated and when we haven't already logged in - if (($this->bitmap & self::MASK_CONNECTED) && !$this->isAuthenticated() && ord($payload[0]) == NET_SSH2_MSG_USERAUTH_BANNER) { - Strings::shift($payload, 1); - list($this->banner_message) = Strings::unpackSSH2('s', $payload); - $payload = $this->get_binary_packet(); - } - - // only called when we've already logged in - if (($this->bitmap & self::MASK_CONNECTED) && $this->isAuthenticated()) { - switch (ord($payload[0])) { - case NET_SSH2_MSG_CHANNEL_REQUEST: - if (strlen($payload) == 31) { - $unpacked = unpack('cpacket_type/Nchannel/Nlength', $payload); - $packet_type = $unpacked['packet_type']; - $channel = $unpacked['channel']; - $length = $unpacked['length']; - if (substr($payload, 9, $length) == 'keepalive@openssh.com' && isset($this->server_channels[$channel])) { - if (ord(substr($payload, 9 + $length))) { // want reply - $this->send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_SUCCESS, $this->server_channels[$channel])); - } - $payload = $this->get_binary_packet(); - } - } - break; - case NET_SSH2_MSG_GLOBAL_REQUEST: // see http://tools.ietf.org/html/rfc4254#section-4 - Strings::shift($payload, 1); - list($request_name) = Strings::unpackSSH2('s', $payload); - $this->errors[] = "SSH_MSG_GLOBAL_REQUEST: $request_name"; - $this->send_binary_packet(pack('C', NET_SSH2_MSG_REQUEST_FAILURE)); - $payload = $this->get_binary_packet(); - break; - case NET_SSH2_MSG_CHANNEL_OPEN: // see http://tools.ietf.org/html/rfc4254#section-5.1 - Strings::shift($payload, 1); - list($data, $server_channel) = Strings::unpackSSH2('sN', $payload); - switch ($data) { - case 'auth-agent': - case 'auth-agent@openssh.com': - if (isset($this->agent)) { - $new_channel = self::CHANNEL_AGENT_FORWARD; - - list( - $remote_window_size, - $remote_maximum_packet_size - ) = Strings::unpackSSH2('NN', $payload); - - $this->packet_size_client_to_server[$new_channel] = $remote_window_size; - $this->window_size_server_to_client[$new_channel] = $remote_maximum_packet_size; - $this->window_size_client_to_server[$new_channel] = $this->window_size; - - $packet_size = 0x4000; - - $packet = pack( - 'CN4', - NET_SSH2_MSG_CHANNEL_OPEN_CONFIRMATION, - $server_channel, - $new_channel, - $packet_size, - $packet_size - ); - - $this->server_channels[$new_channel] = $server_channel; - $this->channel_status[$new_channel] = NET_SSH2_MSG_CHANNEL_OPEN_CONFIRMATION; - $this->send_binary_packet($packet); - } - break; - default: - $packet = Strings::packSSH2( - 'CN2ss', - NET_SSH2_MSG_CHANNEL_OPEN_FAILURE, - $server_channel, - NET_SSH2_OPEN_ADMINISTRATIVELY_PROHIBITED, - '', // description - '' // language tag - ); - $this->send_binary_packet($packet); - } - - $payload = $this->get_binary_packet(); - break; - } - } - - return $payload; - } - - /** - * Enable Quiet Mode - * - * Suppress stderr from output - * - */ - public function enableQuietMode() - { - $this->quiet_mode = true; - } - - /** - * Disable Quiet Mode - * - * Show stderr in output - * - */ - public function disableQuietMode() - { - $this->quiet_mode = false; - } - - /** - * Returns whether Quiet Mode is enabled or not - * - * @see self::enableQuietMode() - * @see self::disableQuietMode() - * @return bool - */ - public function isQuietModeEnabled() - { - return $this->quiet_mode; - } - - /** - * Enable request-pty when using exec() - * - */ - public function enablePTY() - { - $this->request_pty = true; - } - - /** - * Disable request-pty when using exec() - * - */ - public function disablePTY() - { - if ($this->isPTYOpen()) { - $this->close_channel(self::CHANNEL_EXEC); - } - $this->request_pty = false; - } - - /** - * Returns whether request-pty is enabled or not - * - * @see self::enablePTY() - * @see self::disablePTY() - * @return bool - */ - public function isPTYEnabled() - { - return $this->request_pty; - } - - /** - * Gets channel data - * - * Returns the data as a string. bool(true) is returned if: - * - * - the server closes the channel - * - if the connection times out - * - if a window adjust packet is received on the given negated client channel - * - if the channel status is CHANNEL_OPEN and the response was CHANNEL_OPEN_CONFIRMATION - * - if the channel status is CHANNEL_REQUEST and the response was CHANNEL_SUCCESS - * - if the channel status is CHANNEL_CLOSE and the response was CHANNEL_CLOSE - * - * bool(false) is returned if: - * - * - if the channel status is CHANNEL_REQUEST and the response was CHANNEL_FAILURE - * - * @param int $client_channel Specifies the channel to return data for, and data received - * on other channels is buffered. The respective negative value of a channel is - * also supported for the case that the caller is awaiting adjustment of the data - * window, and where data received on that respective channel is also buffered. - * @param bool $skip_extended - * @return mixed - * @throws \RuntimeException on connection error - */ - protected function get_channel_packet($client_channel, $skip_extended = false) - { - if (!empty($this->channel_buffers[$client_channel])) { - // in phpseclib 4.0 this should be changed to $this->channel_status[$client_channel] ?? null - switch (isset($this->channel_status[$client_channel]) ? $this->channel_status[$client_channel] : null) { - case NET_SSH2_MSG_CHANNEL_REQUEST: - foreach ($this->channel_buffers[$client_channel] as $i => $packet) { - switch (ord($packet[0])) { - case NET_SSH2_MSG_CHANNEL_SUCCESS: - case NET_SSH2_MSG_CHANNEL_FAILURE: - unset($this->channel_buffers[$client_channel][$i]); - return substr($packet, 1); - } - } - break; - default: - return substr(array_shift($this->channel_buffers[$client_channel]), 1); - } - } - - while (true) { - try { - $response = $this->get_binary_packet(); - } catch (TimeoutException $e) { - return true; - } - list($type) = Strings::unpackSSH2('C', $response); - if (strlen($response) >= 4) { - list($channel) = Strings::unpackSSH2('N', $response); - } - - // will not be setup yet on incoming channel open request - if (isset($channel) && isset($this->channel_status[$channel]) && isset($this->window_size_server_to_client[$channel])) { - $this->window_size_server_to_client[$channel] -= strlen($response); - - // resize the window, if appropriate - if ($this->window_size_server_to_client[$channel] < 0) { - // PuTTY does something more analogous to the following: - //if ($this->window_size_server_to_client[$channel] < 0x3FFFFFFF) { - $packet = pack('CNN', NET_SSH2_MSG_CHANNEL_WINDOW_ADJUST, $this->server_channels[$channel], $this->window_resize); - $this->send_binary_packet($packet); - $this->window_size_server_to_client[$channel] += $this->window_resize; - } - - switch ($type) { - case NET_SSH2_MSG_CHANNEL_WINDOW_ADJUST: - list($window_size) = Strings::unpackSSH2('N', $response); - $this->window_size_client_to_server[$channel] += $window_size; - if ($channel == -$client_channel) { - return true; - } - - continue 2; - case NET_SSH2_MSG_CHANNEL_EXTENDED_DATA: - /* - if ($client_channel == self::CHANNEL_EXEC) { - $this->send_channel_packet($client_channel, chr(0)); - } - */ - // currently, there's only one possible value for $data_type_code: NET_SSH2_EXTENDED_DATA_STDERR - list($data_type_code, $data) = Strings::unpackSSH2('Ns', $response); - $this->stdErrorLog .= $data; - if ($skip_extended || $this->quiet_mode) { - continue 2; - } - if ($client_channel == $channel && $this->channel_status[$channel] == NET_SSH2_MSG_CHANNEL_DATA) { - return $data; - } - $this->channel_buffers[$channel][] = chr($type) . $data; - - continue 2; - case NET_SSH2_MSG_CHANNEL_REQUEST: - if (!isset($this->channel_status[$channel])) { - continue 2; - } - list($value) = Strings::unpackSSH2('s', $response); - switch ($value) { - case 'exit-signal': - list( - , // FALSE - $signal_name, - , // core dumped - $error_message - ) = Strings::unpackSSH2('bsbs', $response); - - $this->errors[] = "SSH_MSG_CHANNEL_REQUEST (exit-signal): $signal_name"; - if (strlen($error_message)) { - $this->errors[count($this->errors) - 1] .= "\r\n$error_message"; - } - - if (isset($this->channel_status[$channel]) && $this->channel_status[$channel] != NET_SSH2_MSG_CHANNEL_CLOSE) { - if ($this->channel_status[$channel] != NET_SSH2_MSG_CHANNEL_EOF) { - $this->send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_EOF, $this->server_channels[$channel])); - } - $this->send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_CLOSE, $this->server_channels[$channel])); - - $this->channel_status[$channel] = NET_SSH2_MSG_CHANNEL_CLOSE; - } - - continue 3; - case 'exit-status': - list(, $this->exit_status) = Strings::unpackSSH2('CN', $response); - - // "The client MAY ignore these messages." - // -- http://tools.ietf.org/html/rfc4254#section-6.10 - - continue 3; - default: - // "Some systems may not implement signals, in which case they SHOULD ignore this message." - // -- http://tools.ietf.org/html/rfc4254#section-6.9 - continue 3; - } - } - - switch ($this->channel_status[$channel]) { - case NET_SSH2_MSG_CHANNEL_OPEN: - switch ($type) { - case NET_SSH2_MSG_CHANNEL_OPEN_CONFIRMATION: - list( - $this->server_channels[$channel], - $window_size, - $this->packet_size_client_to_server[$channel] - ) = Strings::unpackSSH2('NNN', $response); - - if ($window_size < 0) { - $window_size &= 0x7FFFFFFF; - $window_size += 0x80000000; - } - $this->window_size_client_to_server[$channel] = $window_size; - $result = $client_channel == $channel ? true : $this->get_channel_packet($client_channel, $skip_extended); - $this->on_channel_open(); - return $result; - case NET_SSH2_MSG_CHANNEL_OPEN_FAILURE: - $this->disconnect_helper(NET_SSH2_DISCONNECT_BY_APPLICATION); - throw new \RuntimeException('Unable to open channel'); - default: - if ($client_channel == $channel) { - $this->disconnect_helper(NET_SSH2_DISCONNECT_BY_APPLICATION); - throw new \RuntimeException('Unexpected response to open request'); - } - return $this->get_channel_packet($client_channel, $skip_extended); - } - break; - case NET_SSH2_MSG_CHANNEL_REQUEST: - switch ($type) { - case NET_SSH2_MSG_CHANNEL_SUCCESS: - return true; - case NET_SSH2_MSG_CHANNEL_FAILURE: - return false; - case NET_SSH2_MSG_CHANNEL_DATA: - list($data) = Strings::unpackSSH2('s', $response); - $this->channel_buffers[$channel][] = chr($type) . $data; - return $this->get_channel_packet($client_channel, $skip_extended); - default: - $this->disconnect_helper(NET_SSH2_DISCONNECT_BY_APPLICATION); - throw new \RuntimeException('Unable to fulfill channel request'); - } - case NET_SSH2_MSG_CHANNEL_CLOSE: - if ($client_channel == $channel && $type == NET_SSH2_MSG_CHANNEL_CLOSE) { - return true; - } - return $this->get_channel_packet($client_channel, $skip_extended); - } - } - - // ie. $this->channel_status[$channel] == NET_SSH2_MSG_CHANNEL_DATA - - switch ($type) { - case NET_SSH2_MSG_CHANNEL_DATA: - /* - if ($channel == self::CHANNEL_EXEC) { - // SCP requires null packets, such as this, be sent. further, in the case of the ssh.com SSH server - // this actually seems to make things twice as fast. more to the point, the message right after - // SSH_MSG_CHANNEL_DATA (usually SSH_MSG_IGNORE) won't block for as long as it would have otherwise. - // in OpenSSH it slows things down but only by a couple thousandths of a second. - $this->send_channel_packet($channel, chr(0)); - } - */ - list($data) = Strings::unpackSSH2('s', $response); - - if ($channel == self::CHANNEL_AGENT_FORWARD) { - $agent_response = $this->agent->forwardData($data); - if (!is_bool($agent_response)) { - $this->send_channel_packet($channel, $agent_response); - } - break; - } - - if ($client_channel == $channel) { - return $data; - } - $this->channel_buffers[$channel][] = chr($type) . $data; - break; - case NET_SSH2_MSG_CHANNEL_CLOSE: - $this->curTimeout = 5; - - $this->close_channel_bitmap($channel); - - if ($this->channel_status[$channel] != NET_SSH2_MSG_CHANNEL_CLOSE) { - $this->send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_CLOSE, $this->server_channels[$channel])); - } - - unset($this->channel_status[$channel]); - $this->channelCount--; - - if ($client_channel == $channel) { - return true; - } - // fall-through - case NET_SSH2_MSG_CHANNEL_EOF: - break; - default: - $this->disconnect_helper(NET_SSH2_DISCONNECT_BY_APPLICATION); - throw new \RuntimeException("Error reading channel data ($type)"); - } - } - } - - /** - * Sends Binary Packets - * - * See '6. Binary Packet Protocol' of rfc4253 for more info. - * - * @param string $data - * @param string $logged - * @see self::_get_binary_packet() - * @return void - */ - protected function send_binary_packet($data, $logged = null) - { - if (!is_resource($this->fsock) || feof($this->fsock)) { - $this->disconnect_helper(NET_SSH2_DISCONNECT_CONNECTION_LOST); - throw new ConnectionClosedException('Connection closed prematurely'); - } - - if (!isset($logged)) { - $logged = $data; - } - - switch ($this->compress) { - case self::NET_SSH2_COMPRESSION_ZLIB_AT_OPENSSH: - if (!$this->isAuthenticated()) { - break; - } - // fall-through - case self::NET_SSH2_COMPRESSION_ZLIB: - if (!$this->regenerate_compression_context) { - $header = ''; - } else { - $this->regenerate_compression_context = false; - $this->compress_context = deflate_init(ZLIB_ENCODING_RAW, ['window' => 15]); - $header = "\x78\x9C"; - } - if ($this->compress_context) { - $data = $header . deflate_add($this->compress_context, $data, ZLIB_PARTIAL_FLUSH); - } - } - - // 4 (packet length) + 1 (padding length) + 4 (minimal padding amount) == 9 - $packet_length = strlen($data) + 9; - if ($this->encrypt && $this->encrypt->usesNonce()) { - $packet_length -= 4; - } - // round up to the nearest $this->encrypt_block_size - $packet_length += (($this->encrypt_block_size - 1) * $packet_length) % $this->encrypt_block_size; - // subtracting strlen($data) is obvious - subtracting 5 is necessary because of packet_length and padding_length - $padding_length = $packet_length - strlen($data) - 5; - switch (true) { - case $this->encrypt && $this->encrypt->usesNonce(): - case $this->hmac_create instanceof Hash && $this->hmac_create_etm: - $padding_length += 4; - $packet_length += 4; - } - - $padding = Random::string($padding_length); - - // we subtract 4 from packet_length because the packet_length field isn't supposed to include itself - $packet = pack('NCa*', $packet_length - 4, $padding_length, $data . $padding); - - $hmac = ''; - if ($this->hmac_create instanceof Hash && !$this->hmac_create_etm) { - if (($this->hmac_create->getHash() & "\xFF\xFF\xFF\xFF") == 'umac') { - $this->hmac_create->setNonce("\0\0\0\0" . pack('N', $this->send_seq_no)); - $hmac = $this->hmac_create->hash($packet); - } else { - $hmac = $this->hmac_create->hash(pack('Na*', $this->send_seq_no, $packet)); - } - } - - if ($this->encrypt) { - switch ($this->encryptName) { - case 'aes128-gcm@openssh.com': - case 'aes256-gcm@openssh.com': - $this->encrypt->setNonce( - $this->encryptFixedPart . - $this->encryptInvocationCounter - ); - Strings::increment_str($this->encryptInvocationCounter); - $this->encrypt->setAAD($temp = ($packet & "\xFF\xFF\xFF\xFF")); - $packet = $temp . $this->encrypt->encrypt(substr($packet, 4)); - break; - case 'chacha20-poly1305@openssh.com': - // This should be impossible, but we are checking anyway to narrow the type for Psalm. - if (!($this->encrypt instanceof ChaCha20)) { - throw new \LogicException('$this->encrypt is not a ' . ChaCha20::class); - } - - $nonce = pack('N2', 0, $this->send_seq_no); - - $this->encrypt->setNonce($nonce); - $this->lengthEncrypt->setNonce($nonce); - - $length = $this->lengthEncrypt->encrypt($packet & "\xFF\xFF\xFF\xFF"); - - $this->encrypt->setCounter(0); - // this is the same approach that's implemented in Salsa20::createPoly1305Key() - // but we don't want to use the same AEAD construction that RFC8439 describes - // for ChaCha20-Poly1305 so we won't rely on it (see Salsa20::poly1305()) - $this->encrypt->setPoly1305Key( - $this->encrypt->encrypt(str_repeat("\0", 32)) - ); - $this->encrypt->setAAD($length); - $this->encrypt->setCounter(1); - $packet = $length . $this->encrypt->encrypt(substr($packet, 4)); - break; - default: - $packet = $this->hmac_create instanceof Hash && $this->hmac_create_etm ? - ($packet & "\xFF\xFF\xFF\xFF") . $this->encrypt->encrypt(substr($packet, 4)) : - $this->encrypt->encrypt($packet); - } - } - - if ($this->hmac_create instanceof Hash && $this->hmac_create_etm) { - if (($this->hmac_create->getHash() & "\xFF\xFF\xFF\xFF") == 'umac') { - $this->hmac_create->setNonce("\0\0\0\0" . pack('N', $this->send_seq_no)); - $hmac = $this->hmac_create->hash($packet); - } else { - $hmac = $this->hmac_create->hash(pack('Na*', $this->send_seq_no, $packet)); - } - } - - $this->send_seq_no++; - - $packet .= $this->encrypt && $this->encrypt->usesNonce() ? $this->encrypt->getTag() : $hmac; - - if (!$this->keyExchangeInProgress) { - $this->bytesTransferredSinceLastKEX += strlen($packet); - } - - $start = microtime(true); - $sent = @fputs($this->fsock, $packet); - $stop = microtime(true); - - if (defined('NET_SSH2_LOGGING')) { - $current = microtime(true); - $message_number = isset(self::$message_numbers[ord($logged[0])]) ? self::$message_numbers[ord($logged[0])] : 'UNKNOWN (' . ord($logged[0]) . ')'; - $message_number = '-> ' . $message_number . - ' (since last: ' . round($current - $this->last_packet, 4) . ', network: ' . round($stop - $start, 4) . 's)'; - $this->append_log($message_number, $logged); - } - $this->last_packet = microtime(true); - - if (strlen($packet) != $sent) { - $this->disconnect_helper(NET_SSH2_DISCONNECT_BY_APPLICATION); - $message = $sent === false ? - 'Unable to write ' . strlen($packet) . ' bytes' : - "Only $sent of " . strlen($packet) . " bytes were sent"; - throw new \RuntimeException($message); - } - - if ($this->bytesTransferredSinceLastKEX > $this->doKeyReexchangeAfterXBytes) { - $this->key_exchange(); - } - } - - /** - * Sends a keep-alive message, if keep-alive is enabled and interval is met - */ - private function send_keep_alive() - { - if ($this->bitmap & self::MASK_CONNECTED) { - $elapsed = microtime(true) - $this->last_packet; - if ($this->keepAlive > 0 && $elapsed >= $this->keepAlive) { - $this->send_binary_packet(pack('CN', NET_SSH2_MSG_IGNORE, 0)); - } - } - } - - /** - * Logs data packets - * - * Makes sure that only the last 1MB worth of packets will be logged - * - * @param string $message_number - * @param string $message - */ - private function append_log($message_number, $message) - { - $this->append_log_helper( - NET_SSH2_LOGGING, - $message_number, - $message, - $this->message_number_log, - $this->message_log, - $this->log_size, - $this->realtime_log_file, - $this->realtime_log_wrap, - $this->realtime_log_size - ); - } - - /** - * Logs data packet helper - * - * @param int $constant - * @param string $message_number - * @param string $message - * @param array &$message_number_log - * @param array &$message_log - * @param int &$log_size - * @param resource &$realtime_log_file - * @param bool &$realtime_log_wrap - * @param int &$realtime_log_size - */ - protected function append_log_helper($constant, $message_number, $message, array &$message_number_log, array &$message_log, &$log_size, &$realtime_log_file, &$realtime_log_wrap, &$realtime_log_size) - { - // remove the byte identifying the message type from all but the first two messages (ie. the identification strings) - if (!in_array(substr($message_number, 0, 4), ['<- (', '-> (']) && strlen($message_number) > 2) { - Strings::shift($message); - } - - switch ($constant) { - // useful for benchmarks - case self::LOG_SIMPLE: - $message_number_log[] = $message_number; - break; - case self::LOG_SIMPLE_REALTIME: - echo $message_number; - echo PHP_SAPI == 'cli' ? "\r\n" : '
'; - @flush(); - @ob_flush(); - break; - // the most useful log for SSH2 - case self::LOG_COMPLEX: - $message_number_log[] = $message_number; - $log_size += strlen($message); - $message_log[] = $message; - while ($log_size > self::LOG_MAX_SIZE) { - $log_size -= strlen(array_shift($message_log)); - array_shift($message_number_log); - } - break; - // dump the output out realtime; packets may be interspersed with non packets, - // passwords won't be filtered out and select other packets may not be correctly - // identified - case self::LOG_REALTIME: - switch (PHP_SAPI) { - case 'cli': - $start = $stop = "\r\n"; - break; - default: - $start = '
';
-                        $stop = '
'; - } - echo $start . $this->format_log([$message], [$message_number]) . $stop; - @flush(); - @ob_flush(); - break; - // basically the same thing as self::LOG_REALTIME with the caveat that NET_SSH2_LOG_REALTIME_FILENAME - // needs to be defined and that the resultant log file will be capped out at self::LOG_MAX_SIZE. - // the earliest part of the log file is denoted by the first <<< START >>> and is not going to necessarily - // at the beginning of the file - case self::LOG_REALTIME_FILE: - if (!isset($realtime_log_file)) { - // PHP doesn't seem to like using constants in fopen() - $filename = NET_SSH2_LOG_REALTIME_FILENAME; - $fp = fopen($filename, 'w'); - $realtime_log_file = $fp; - } - if (!is_resource($realtime_log_file)) { - break; - } - $entry = $this->format_log([$message], [$message_number]); - if ($realtime_log_wrap) { - $temp = "<<< START >>>\r\n"; - $entry .= $temp; - fseek($realtime_log_file, ftell($realtime_log_file) - strlen($temp)); - } - $realtime_log_size += strlen($entry); - if ($realtime_log_size > self::LOG_MAX_SIZE) { - fseek($realtime_log_file, 0); - $realtime_log_size = strlen($entry); - $realtime_log_wrap = true; - } - fputs($realtime_log_file, $entry); - break; - case self::LOG_REALTIME_SIMPLE: - echo $message_number; - echo PHP_SAPI == 'cli' ? "\r\n" : '
'; - } - } - - /** - * Sends channel data - * - * Spans multiple SSH_MSG_CHANNEL_DATAs if appropriate - * - * @param int $client_channel - * @param string $data - * @return void - */ - protected function send_channel_packet($client_channel, $data) - { - if ( - isset($this->channel_buffers_write[$client_channel]) - && strpos($data, $this->channel_buffers_write[$client_channel]) === 0 - ) { - // if buffer holds identical initial data content, resume send from the unmatched data portion - $data = substr($data, strlen($this->channel_buffers_write[$client_channel])); - } else { - $this->channel_buffers_write[$client_channel] = ''; - } - while (strlen($data)) { - if (!$this->window_size_client_to_server[$client_channel]) { - // using an invalid channel will let the buffers be built up for the valid channels - $this->get_channel_packet(-$client_channel); - if ($this->isTimeout()) { - throw new TimeoutException('Timed out waiting for server'); - } elseif (!$this->window_size_client_to_server[$client_channel]) { - throw new \RuntimeException('Data window was not adjusted'); - } - } - - /* The maximum amount of data allowed is determined by the maximum - packet size for the channel, and the current window size, whichever - is smaller. - -- http://tools.ietf.org/html/rfc4254#section-5.2 */ - $max_size = min( - $this->packet_size_client_to_server[$client_channel], - $this->window_size_client_to_server[$client_channel] - ); - - $temp = Strings::shift($data, $max_size); - $packet = Strings::packSSH2( - 'CNs', - NET_SSH2_MSG_CHANNEL_DATA, - $this->server_channels[$client_channel], - $temp - ); - $this->window_size_client_to_server[$client_channel] -= strlen($temp); - $this->send_binary_packet($packet); - $this->channel_buffers_write[$client_channel] .= $temp; - } - unset($this->channel_buffers_write[$client_channel]); - } - - /** - * Closes and flushes a channel - * - * \phpseclib3\Net\SSH2 doesn't properly close most channels. For exec() channels are normally closed by the server - * and for SFTP channels are presumably closed when the client disconnects. This functions is intended - * for SCP more than anything. - * - * @param int $client_channel - * @param bool $want_reply - * @return void - */ - private function close_channel($client_channel) - { - // see http://tools.ietf.org/html/rfc4254#section-5.3 - - if ($this->channel_status[$client_channel] != NET_SSH2_MSG_CHANNEL_EOF) { - $this->send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_EOF, $this->server_channels[$client_channel])); - } - $this->send_binary_packet(pack('CN', NET_SSH2_MSG_CHANNEL_CLOSE, $this->server_channels[$client_channel])); - - $this->channel_status[$client_channel] = NET_SSH2_MSG_CHANNEL_CLOSE; - - $this->channelCount--; - - $this->curTimeout = 5; - while (!is_bool($this->get_channel_packet($client_channel))) { - } - - unset($this->channel_status[$client_channel]); - - $this->close_channel_bitmap($client_channel); - } - - /** - * Maintains execution state bitmap in response to channel closure - * - * @param int $client_channel The channel number to maintain closure status of - * @return void - */ - private function close_channel_bitmap($client_channel) - { - switch ($client_channel) { - case self::CHANNEL_SHELL: - // Shell status has been maintained in the bitmap for backwards - // compatibility sake, but can be removed going forward - if ($this->bitmap & self::MASK_SHELL) { - $this->bitmap &= ~self::MASK_SHELL; - } - break; - } - } - - /** - * Disconnect - * - * @param int $reason - * @return false - */ - protected function disconnect_helper($reason) - { - if ($this->bitmap & self::MASK_DISCONNECT) { - // Disregard subsequent disconnect requests - return false; - } - $this->bitmap |= self::MASK_DISCONNECT; - if ($this->isConnected()) { - $data = Strings::packSSH2('CNss', NET_SSH2_MSG_DISCONNECT, $reason, '', ''); - try { - $this->send_binary_packet($data); - } catch (\Exception $e) { - } - } - - $this->reset_connection(); - - return false; - } - - /** - * Define Array - * - * Takes any number of arrays whose indices are integers and whose values are strings and defines a bunch of - * named constants from it, using the value as the name of the constant and the index as the value of the constant. - * If any of the constants that would be defined already exists, none of the constants will be defined. - * - * @param mixed[] ...$args - * @access protected - */ - protected static function define_array(...$args) - { - foreach ($args as $arg) { - foreach ($arg as $key => $value) { - if (!defined($value)) { - define($value, $key); - } else { - break 2; - } - } - } - } - - /** - * Returns a log of the packets that have been sent and received. - * - * Returns a string if NET_SSH2_LOGGING == self::LOG_COMPLEX, an array if NET_SSH2_LOGGING == self::LOG_SIMPLE and false if !defined('NET_SSH2_LOGGING') - * - * @return array|false|string - */ - public function getLog() - { - if (!defined('NET_SSH2_LOGGING')) { - return false; - } - - switch (NET_SSH2_LOGGING) { - case self::LOG_SIMPLE: - return $this->message_number_log; - case self::LOG_COMPLEX: - $log = $this->format_log($this->message_log, $this->message_number_log); - return PHP_SAPI == 'cli' ? $log : '
' . $log . '
'; - default: - return false; - } - } - - /** - * Formats a log for printing - * - * @param array $message_log - * @param array $message_number_log - * @return string - */ - protected function format_log(array $message_log, array $message_number_log) - { - $output = ''; - for ($i = 0; $i < count($message_log); $i++) { - $output .= $message_number_log[$i]; - $current_log = $message_log[$i]; - $j = 0; - if (strlen($current_log)) { - $output .= "\r\n"; - } - do { - if (strlen($current_log)) { - $output .= str_pad(dechex($j), 7, '0', STR_PAD_LEFT) . '0 '; - } - $fragment = Strings::shift($current_log, $this->log_short_width); - $hex = substr(preg_replace_callback('#.#s', function ($matches) { - return $this->log_boundary . str_pad(dechex(ord($matches[0])), 2, '0', STR_PAD_LEFT); - }, $fragment), strlen($this->log_boundary)); - // replace non ASCII printable characters with dots - // http://en.wikipedia.org/wiki/ASCII#ASCII_printable_characters - // also replace < with a . since < messes up the output on web browsers - $raw = preg_replace('#[^\x20-\x7E]|<#', '.', $fragment); - $output .= str_pad($hex, $this->log_long_width - $this->log_short_width, ' ') . $raw . "\r\n"; - $j++; - } while (strlen($current_log)); - $output .= "\r\n"; - } - - return $output; - } - - /** - * Helper function for agent->on_channel_open() - * - * Used when channels are created to inform agent - * of said channel opening. Must be called after - * channel open confirmation received - * - */ - private function on_channel_open() - { - if (isset($this->agent)) { - $this->agent->registerChannelOpen($this); - } - } - - /** - * Returns the first value of the intersection of two arrays or false if - * the intersection is empty. The order is defined by the first parameter. - * - * @param array $array1 - * @param array $array2 - * @return mixed False if intersection is empty, else intersected value. - */ - private static function array_intersect_first(array $array1, array $array2) - { - foreach ($array1 as $value) { - if (in_array($value, $array2)) { - return $value; - } - } - return false; - } - - /** - * Returns all errors / debug messages on the SSH layer - * - * If you are looking for messages from the SFTP layer, please see SFTP::getSFTPErrors() - * - * @return string[] - */ - public function getErrors() - { - return $this->errors; - } - - /** - * Returns the last error received on the SSH layer - * - * If you are looking for messages from the SFTP layer, please see SFTP::getLastSFTPError() - * - * @return string - */ - public function getLastError() - { - $count = count($this->errors); - - if ($count > 0) { - return $this->errors[$count - 1]; - } - } - - /** - * Return the server identification. - * - * @return string|false - */ - public function getServerIdentification() - { - $this->connect(); - - return $this->server_identifier; - } - - /** - * Returns a list of algorithms the server supports - * - * @return array - */ - public function getServerAlgorithms() - { - $this->connect(); - - return [ - 'kex' => $this->kex_algorithms, - 'hostkey' => $this->server_host_key_algorithms, - 'client_to_server' => [ - 'crypt' => $this->encryption_algorithms_client_to_server, - 'mac' => $this->mac_algorithms_client_to_server, - 'comp' => $this->compression_algorithms_client_to_server, - 'lang' => $this->languages_client_to_server - ], - 'server_to_client' => [ - 'crypt' => $this->encryption_algorithms_server_to_client, - 'mac' => $this->mac_algorithms_server_to_client, - 'comp' => $this->compression_algorithms_server_to_client, - 'lang' => $this->languages_server_to_client - ] - ]; - } - - /** - * Returns a list of KEX algorithms that phpseclib supports - * - * @return array - */ - public static function getSupportedKEXAlgorithms() - { - $kex_algorithms = [ - // Elliptic Curve Diffie-Hellman Key Agreement (ECDH) using - // Curve25519. See doc/curve25519-sha256@libssh.org.txt in the - // libssh repository for more information. - 'curve25519-sha256', - 'curve25519-sha256@libssh.org', - - 'ecdh-sha2-nistp256', // RFC 5656 - 'ecdh-sha2-nistp384', // RFC 5656 - 'ecdh-sha2-nistp521', // RFC 5656 - - 'diffie-hellman-group-exchange-sha256',// RFC 4419 - 'diffie-hellman-group-exchange-sha1', // RFC 4419 - - // Diffie-Hellman Key Agreement (DH) using integer modulo prime - // groups. - 'diffie-hellman-group14-sha256', - 'diffie-hellman-group14-sha1', // REQUIRED - 'diffie-hellman-group15-sha512', - 'diffie-hellman-group16-sha512', - 'diffie-hellman-group17-sha512', - 'diffie-hellman-group18-sha512', - - 'diffie-hellman-group1-sha1', // REQUIRED - ]; - - return $kex_algorithms; - } - - /** - * Returns a list of host key algorithms that phpseclib supports - * - * @return array - */ - public static function getSupportedHostKeyAlgorithms() - { - return [ - 'ssh-ed25519', // https://tools.ietf.org/html/draft-ietf-curdle-ssh-ed25519-02 - 'ecdsa-sha2-nistp256', // RFC 5656 - 'ecdsa-sha2-nistp384', // RFC 5656 - 'ecdsa-sha2-nistp521', // RFC 5656 - 'rsa-sha2-256', // RFC 8332 - 'rsa-sha2-512', // RFC 8332 - 'ssh-rsa', // RECOMMENDED sign Raw RSA Key - 'ssh-dss' // REQUIRED sign Raw DSS Key - ]; - } - - /** - * Returns a list of symmetric key algorithms that phpseclib supports - * - * @return array - */ - public static function getSupportedEncryptionAlgorithms() - { - $algos = [ - // from : - 'aes128-gcm@openssh.com', - 'aes256-gcm@openssh.com', - - // from : - 'arcfour256', - 'arcfour128', - - //'arcfour', // OPTIONAL the ARCFOUR stream cipher with a 128-bit key - - // CTR modes from : - 'aes128-ctr', // RECOMMENDED AES (Rijndael) in SDCTR mode, with 128-bit key - 'aes192-ctr', // RECOMMENDED AES with 192-bit key - 'aes256-ctr', // RECOMMENDED AES with 256-bit key - - // from : - // one of the big benefits of chacha20-poly1305 is speed. the problem is... - // libsodium doesn't generate the poly1305 keys in the way ssh does and openssl's PHP bindings don't even - // seem to support poly1305 currently. so even if libsodium or openssl are being used for the chacha20 - // part, pure-PHP has to be used for the poly1305 part and that's gonna cause a big slow down. - // speed-wise it winds up being faster to use AES (when openssl or mcrypt are available) and some HMAC - // (which is always gonna be super fast to compute thanks to the hash extension, which - // "is bundled and compiled into PHP by default") - 'chacha20-poly1305@openssh.com', - - 'twofish128-ctr', // OPTIONAL Twofish in SDCTR mode, with 128-bit key - 'twofish192-ctr', // OPTIONAL Twofish with 192-bit key - 'twofish256-ctr', // OPTIONAL Twofish with 256-bit key - - 'aes128-cbc', // RECOMMENDED AES with a 128-bit key - 'aes192-cbc', // OPTIONAL AES with a 192-bit key - 'aes256-cbc', // OPTIONAL AES in CBC mode, with a 256-bit key - - 'twofish128-cbc', // OPTIONAL Twofish with a 128-bit key - 'twofish192-cbc', // OPTIONAL Twofish with a 192-bit key - 'twofish256-cbc', - 'twofish-cbc', // OPTIONAL alias for "twofish256-cbc" - // (this is being retained for historical reasons) - - 'blowfish-ctr', // OPTIONAL Blowfish in SDCTR mode - - 'blowfish-cbc', // OPTIONAL Blowfish in CBC mode - - '3des-ctr', // RECOMMENDED Three-key 3DES in SDCTR mode - - '3des-cbc', // REQUIRED three-key 3DES in CBC mode - - //'none' // OPTIONAL no encryption; NOT RECOMMENDED - ]; - - if (self::$crypto_engine) { - $engines = [self::$crypto_engine]; - } else { - $engines = [ - 'libsodium', - 'OpenSSL (GCM)', - 'OpenSSL', - 'mcrypt', - 'Eval', - 'PHP' - ]; - } - - $ciphers = []; - - foreach ($engines as $engine) { - foreach ($algos as $algo) { - $obj = self::encryption_algorithm_to_crypt_instance($algo); - if ($obj instanceof Rijndael) { - $obj->setKeyLength(preg_replace('#[^\d]#', '', $algo)); - } - switch ($algo) { - // Eval engines do not exist for ChaCha20 or RC4 because they would not benefit from one. - // to benefit from an Eval engine they'd need to loop a variable amount of times, they'd - // need to do table lookups (eg. sbox subsitutions). ChaCha20 doesn't do either because - // it's a so-called ARX cipher, meaning that the only operations it does are add (A), rotate (R) - // and XOR (X). RC4 does do table lookups but being a stream cipher it works differently than - // block ciphers. with RC4 you XOR the plaintext against a keystream and the keystream changes - // as you encrypt stuff. the only table lookups are made against this keystream and thus table - // lookups are kinda unavoidable. with AES and DES, however, the table lookups that are done - // are done against substitution boxes (sboxes), which are invariant. - - // OpenSSL can't be used as an engine, either, because OpenSSL doesn't support continuous buffers - // as SSH2 uses and altho you can emulate a continuous buffer with block ciphers you can't do so - // with stream ciphers. As for ChaCha20... for the ChaCha20 part OpenSSL could prob be used but - // the big slow down isn't with ChaCha20 - it's with Poly1305. SSH constructs the key for that - // differently than how OpenSSL does it (OpenSSL does it as the RFC describes, SSH doesn't). - - // libsodium can't be used because it doesn't support RC4 and it doesn't construct the Poly1305 - // keys in the same way that SSH does - - // mcrypt could prob be used for RC4 but mcrypt hasn't been included in PHP core for yearss - case 'chacha20-poly1305@openssh.com': - case 'arcfour128': - case 'arcfour256': - if ($engine != 'PHP') { - continue 2; - } - break; - case 'aes128-gcm@openssh.com': - case 'aes256-gcm@openssh.com': - if ($engine == 'OpenSSL') { - continue 2; - } - $obj->setNonce('dummydummydu'); - } - if ($obj->isValidEngine($engine)) { - $algos = array_diff($algos, [$algo]); - $ciphers[] = $algo; - } - } - } - - return $ciphers; - } - - /** - * Returns a list of MAC algorithms that phpseclib supports - * - * @return array - */ - public static function getSupportedMACAlgorithms() - { - return [ - 'hmac-sha2-256-etm@openssh.com', - 'hmac-sha2-512-etm@openssh.com', - 'hmac-sha1-etm@openssh.com', - - // from : - 'hmac-sha2-256',// RECOMMENDED HMAC-SHA256 (digest length = key length = 32) - 'hmac-sha2-512',// OPTIONAL HMAC-SHA512 (digest length = key length = 64) - - 'hmac-sha1-96', // RECOMMENDED first 96 bits of HMAC-SHA1 (digest length = 12, key length = 20) - 'hmac-sha1', // REQUIRED HMAC-SHA1 (digest length = key length = 20) - 'hmac-md5-96', // OPTIONAL first 96 bits of HMAC-MD5 (digest length = 12, key length = 16) - 'hmac-md5', // OPTIONAL HMAC-MD5 (digest length = key length = 16) - - 'umac-64-etm@openssh.com', - 'umac-128-etm@openssh.com', - - // from : - 'umac-64@openssh.com', - 'umac-128@openssh.com', - - //'none' // OPTIONAL no MAC; NOT RECOMMENDED - ]; - } - - /** - * Returns a list of compression algorithms that phpseclib supports - * - * @return array - */ - public static function getSupportedCompressionAlgorithms() - { - $algos = ['none']; // REQUIRED no compression - if (function_exists('deflate_init')) { - $algos[] = 'zlib@openssh.com'; // https://datatracker.ietf.org/doc/html/draft-miller-secsh-compression-delayed - $algos[] = 'zlib'; - } - return $algos; - } - - /** - * Return list of negotiated algorithms - * - * Uses the same format as https://www.php.net/ssh2-methods-negotiated - * - * @return array - */ - public function getAlgorithmsNegotiated() - { - $this->connect(); - - $compression_map = [ - self::NET_SSH2_COMPRESSION_NONE => 'none', - self::NET_SSH2_COMPRESSION_ZLIB => 'zlib', - self::NET_SSH2_COMPRESSION_ZLIB_AT_OPENSSH => 'zlib@openssh.com' - ]; - - return [ - 'kex' => $this->kex_algorithm, - 'hostkey' => $this->signature_format, - 'client_to_server' => [ - 'crypt' => $this->encryptName, - 'mac' => $this->hmac_create_name, - 'comp' => $compression_map[$this->compress], - ], - 'server_to_client' => [ - 'crypt' => $this->decryptName, - 'mac' => $this->hmac_check_name, - 'comp' => $compression_map[$this->decompress], - ] - ]; - } - - /** - * Force multiple channels (even if phpseclib has decided to disable them) - */ - public function forceMultipleChannels() - { - $this->errorOnMultipleChannels = false; - } - - /** - * Allows you to set the terminal - * - * @param string $term - */ - public function setTerminal($term) - { - $this->term = $term; - } - - /** - * Accepts an associative array with up to four parameters as described at - * - * - * @param array $methods - */ - public function setPreferredAlgorithms(array $methods) - { - $keys = ['client_to_server', 'server_to_client']; - - if (isset($methods['kex']) && is_string($methods['kex'])) { - $methods['kex'] = explode(',', $methods['kex']); - } - - if (isset($methods['hostkey']) && is_string($methods['hostkey'])) { - $methods['hostkey'] = explode(',', $methods['hostkey']); - } - - foreach ($keys as $key) { - if (isset($methods[$key])) { - $a = &$methods[$key]; - if (isset($a['crypt']) && is_string($a['crypt'])) { - $a['crypt'] = explode(',', $a['crypt']); - } - if (isset($a['comp']) && is_string($a['comp'])) { - $a['comp'] = explode(',', $a['comp']); - } - if (isset($a['mac']) && is_string($a['mac'])) { - $a['mac'] = explode(',', $a['mac']); - } - } - } - - $preferred = $methods; - - if (isset($preferred['kex'])) { - $preferred['kex'] = array_intersect( - $preferred['kex'], - static::getSupportedKEXAlgorithms() - ); - } - - if (isset($preferred['hostkey'])) { - $preferred['hostkey'] = array_intersect( - $preferred['hostkey'], - static::getSupportedHostKeyAlgorithms() - ); - } - - foreach ($keys as $key) { - if (isset($preferred[$key])) { - $a = &$preferred[$key]; - if (isset($a['crypt'])) { - $a['crypt'] = array_intersect( - $a['crypt'], - static::getSupportedEncryptionAlgorithms() - ); - } - if (isset($a['comp'])) { - $a['comp'] = array_intersect( - $a['comp'], - static::getSupportedCompressionAlgorithms() - ); - } - if (isset($a['mac'])) { - $a['mac'] = array_intersect( - $a['mac'], - static::getSupportedMACAlgorithms() - ); - } - } - } - - $keys = [ - 'kex', - 'hostkey', - 'client_to_server/crypt', - 'client_to_server/comp', - 'client_to_server/mac', - 'server_to_client/crypt', - 'server_to_client/comp', - 'server_to_client/mac', - ]; - foreach ($keys as $key) { - $p = $preferred; - $m = $methods; - - $subkeys = explode('/', $key); - foreach ($subkeys as $subkey) { - if (!isset($p[$subkey])) { - continue 2; - } - $p = $p[$subkey]; - $m = $m[$subkey]; - } - - if (count($p) != count($m)) { - $diff = array_diff($m, $p); - $msg = count($diff) == 1 ? - ' is not a supported algorithm' : - ' are not supported algorithms'; - throw new UnsupportedAlgorithmException(implode(', ', $diff) . $msg); - } - } - - $this->preferred = $preferred; - } - - /** - * Returns the banner message. - * - * Quoting from the RFC, "in some jurisdictions, sending a warning message before - * authentication may be relevant for getting legal protection." - * - * @return string - */ - public function getBannerMessage() - { - return $this->banner_message; - } - - /** - * Returns the server public host key. - * - * Caching this the first time you connect to a server and checking the result on subsequent connections - * is recommended. Returns false if the server signature is not signed correctly with the public host key. - * - * @return string|false - * @throws \RuntimeException on badly formatted keys - * @throws NoSupportedAlgorithmsException when the key isn't in a supported format - */ - public function getServerPublicHostKey() - { - if (!($this->bitmap & self::MASK_CONSTRUCTOR)) { - $this->connect(); - } - - $signature = $this->signature; - $server_public_host_key = base64_encode($this->server_public_host_key); - - if ($this->signature_validated) { - return $this->bitmap ? - $this->signature_format . ' ' . $server_public_host_key : - false; - } - - $this->signature_validated = true; - - switch ($this->signature_format) { - case 'ssh-ed25519': - case 'ecdsa-sha2-nistp256': - case 'ecdsa-sha2-nistp384': - case 'ecdsa-sha2-nistp521': - $key = EC::loadFormat('OpenSSH', $server_public_host_key) - ->withSignatureFormat('SSH2'); - switch ($this->signature_format) { - case 'ssh-ed25519': - $hash = 'sha512'; - break; - case 'ecdsa-sha2-nistp256': - $hash = 'sha256'; - break; - case 'ecdsa-sha2-nistp384': - $hash = 'sha384'; - break; - case 'ecdsa-sha2-nistp521': - $hash = 'sha512'; - } - $key = $key->withHash($hash); - break; - case 'ssh-dss': - $key = DSA::loadFormat('OpenSSH', $server_public_host_key) - ->withSignatureFormat('SSH2') - ->withHash('sha1'); - break; - case 'ssh-rsa': - case 'rsa-sha2-256': - case 'rsa-sha2-512': - // could be ssh-rsa, rsa-sha2-256, rsa-sha2-512 - // we don't check here because we already checked in key_exchange - // some signatures have the type embedded within the message and some don't - list(, $signature) = Strings::unpackSSH2('ss', $signature); - - $key = RSA::loadFormat('OpenSSH', $server_public_host_key) - ->withPadding(RSA::SIGNATURE_PKCS1); - switch ($this->signature_format) { - case 'rsa-sha2-512': - $hash = 'sha512'; - break; - case 'rsa-sha2-256': - $hash = 'sha256'; - break; - //case 'ssh-rsa': - default: - $hash = 'sha1'; - } - $key = $key->withHash($hash); - break; - default: - $this->disconnect_helper(NET_SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE); - throw new NoSupportedAlgorithmsException('Unsupported signature format'); - } - - if (!$key->verify($this->exchange_hash, $signature)) { - return $this->disconnect_helper(NET_SSH2_DISCONNECT_HOST_KEY_NOT_VERIFIABLE); - }; - - return $this->signature_format . ' ' . $server_public_host_key; - } - - /** - * Returns the exit status of an SSH command or false. - * - * @return false|int - */ - public function getExitStatus() - { - if (is_null($this->exit_status)) { - return false; - } - return $this->exit_status; - } - - /** - * Returns the number of columns for the terminal window size. - * - * @return int - */ - public function getWindowColumns() - { - return $this->windowColumns; - } - - /** - * Returns the number of rows for the terminal window size. - * - * @return int - */ - public function getWindowRows() - { - return $this->windowRows; - } - - /** - * Sets the number of columns for the terminal window size. - * - * @param int $value - */ - public function setWindowColumns($value) - { - $this->windowColumns = $value; - } - - /** - * Sets the number of rows for the terminal window size. - * - * @param int $value - */ - public function setWindowRows($value) - { - $this->windowRows = $value; - } - - /** - * Sets the number of columns and rows for the terminal window size. - * - * @param int $columns - * @param int $rows - */ - public function setWindowSize($columns = 80, $rows = 24) - { - $this->windowColumns = $columns; - $this->windowRows = $rows; - } - - /** - * To String Magic Method - * - * @return string - */ - #[\ReturnTypeWillChange] - public function __toString() - { - return $this->getResourceId(); - } - - /** - * Get Resource ID - * - * We use {} because that symbols should not be in URL according to - * {@link http://tools.ietf.org/html/rfc3986#section-2 RFC}. - * It will safe us from any conflicts, because otherwise regexp will - * match all alphanumeric domains. - * - * @return string - */ - public function getResourceId() - { - return '{' . spl_object_hash($this) . '}'; - } - - /** - * Return existing connection - * - * @param string $id - * - * @return bool|SSH2 will return false if no such connection - */ - public static function getConnectionByResourceId($id) - { - if (isset(self::$connections[$id])) { - return self::$connections[$id] instanceof \WeakReference ? self::$connections[$id]->get() : self::$connections[$id]; - } - return false; - } - - /** - * Return all excising connections - * - * @return array - */ - public static function getConnections() - { - if (!class_exists('WeakReference')) { - /** @var array */ - return self::$connections; - } - $temp = []; - foreach (self::$connections as $key => $ref) { - $temp[$key] = $ref->get(); - } - return $temp; - } - - /* - * Update packet types in log history - * - * @param string $old - * @param string $new - */ - private function updateLogHistory($old, $new) - { - if (defined('NET_SSH2_LOGGING') && NET_SSH2_LOGGING == self::LOG_COMPLEX) { - $this->message_number_log[count($this->message_number_log) - 1] = str_replace( - $old, - $new, - $this->message_number_log[count($this->message_number_log) - 1] - ); - } - } - - /** - * Return the list of authentication methods that may productively continue authentication. - * - * @see https://tools.ietf.org/html/rfc4252#section-5.1 - * @return array|null - */ - public function getAuthMethodsToContinue() - { - return $this->auth_methods_to_continue; - } - - /** - * Enables "smart" multi-factor authentication (MFA) - */ - public function enableSmartMFA() - { - $this->smartMFA = true; - } - - /** - * Disables "smart" multi-factor authentication (MFA) - */ - public function disableSmartMFA() - { - $this->smartMFA = false; - } - - /** - * How many bytes until the next key re-exchange? - * - * @param int $bytes - */ - public function bytesUntilKeyReexchange($bytes) - { - $this->doKeyReexchangeAfterXBytes = $bytes; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/System/SSH/Agent.php b/composer/phpseclib/phpseclib/phpseclib/System/SSH/Agent.php deleted file mode 100644 index d25916f..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/System/SSH/Agent.php +++ /dev/null @@ -1,306 +0,0 @@ - - * login('username', $agent)) { - * exit('Login Failed'); - * } - * - * echo $ssh->exec('pwd'); - * echo $ssh->exec('ls -la'); - * ?> - * - * - * @author Jim Wigginton - * @copyright 2014 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\System\SSH; - -use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\PublicKey; -use OCA\Libresign\Vendor\phpseclib3\Crypt\PublicKeyLoader; -use OCA\Libresign\Vendor\phpseclib3\Crypt\RSA; -use OCA\Libresign\Vendor\phpseclib3\Exception\BadConfigurationException; -use OCA\Libresign\Vendor\phpseclib3\Net\SSH2; -use OCA\Libresign\Vendor\phpseclib3\System\SSH\Agent\Identity; - -/** - * Pure-PHP ssh-agent client identity factory - * - * requestIdentities() method pumps out \phpseclib3\System\SSH\Agent\Identity objects - * - * @author Jim Wigginton - */ -class Agent -{ - use Common\Traits\ReadBytes; - - // Message numbers - - // to request SSH1 keys you have to use SSH_AGENTC_REQUEST_RSA_IDENTITIES (1) - const SSH_AGENTC_REQUEST_IDENTITIES = 11; - // this is the SSH2 response; the SSH1 response is SSH_AGENT_RSA_IDENTITIES_ANSWER (2). - const SSH_AGENT_IDENTITIES_ANSWER = 12; - // the SSH1 request is SSH_AGENTC_RSA_CHALLENGE (3) - const SSH_AGENTC_SIGN_REQUEST = 13; - // the SSH1 response is SSH_AGENT_RSA_RESPONSE (4) - const SSH_AGENT_SIGN_RESPONSE = 14; - - // Agent forwarding status - - // no forwarding requested and not active - const FORWARD_NONE = 0; - // request agent forwarding when opportune - const FORWARD_REQUEST = 1; - // forwarding has been request and is active - const FORWARD_ACTIVE = 2; - - /** - * Unused - */ - const SSH_AGENT_FAILURE = 5; - - /** - * Socket Resource - * - * @var resource - */ - private $fsock; - - /** - * Agent forwarding status - * - * @var int - */ - private $forward_status = self::FORWARD_NONE; - - /** - * Buffer for accumulating forwarded authentication - * agent data arriving on SSH data channel destined - * for agent unix socket - * - * @var string - */ - private $socket_buffer = ''; - - /** - * Tracking the number of bytes we are expecting - * to arrive for the agent socket on the SSH data - * channel - * - * @var int - */ - private $expected_bytes = 0; - - /** - * Default Constructor - * - * @return Agent - * @throws BadConfigurationException if SSH_AUTH_SOCK cannot be found - * @throws \RuntimeException on connection errors - */ - public function __construct($address = null) - { - if (!$address) { - switch (true) { - case isset($_SERVER['SSH_AUTH_SOCK']): - $address = $_SERVER['SSH_AUTH_SOCK']; - break; - case isset($_ENV['SSH_AUTH_SOCK']): - $address = $_ENV['SSH_AUTH_SOCK']; - break; - default: - throw new BadConfigurationException('SSH_AUTH_SOCK not found'); - } - } - - if (in_array('unix', stream_get_transports())) { - $this->fsock = fsockopen('unix://' . $address, 0, $errno, $errstr); - if (!$this->fsock) { - throw new \RuntimeException("Unable to connect to ssh-agent (Error $errno: $errstr)"); - } - } else { - if (substr($address, 0, 9) != '\\\\.\\pipe\\' || strpos(substr($address, 9), '\\') !== false) { - throw new \RuntimeException('Address is not formatted as a named pipe should be'); - } - - $this->fsock = fopen($address, 'r+b'); - if (!$this->fsock) { - throw new \RuntimeException('Unable to open address'); - } - } - } - - /** - * Request Identities - * - * See "2.5.2 Requesting a list of protocol 2 keys" - * Returns an array containing zero or more \phpseclib3\System\SSH\Agent\Identity objects - * - * @return array - * @throws \RuntimeException on receipt of unexpected packets - */ - public function requestIdentities() - { - if (!$this->fsock) { - return []; - } - - $packet = pack('NC', 1, self::SSH_AGENTC_REQUEST_IDENTITIES); - if (strlen($packet) != fputs($this->fsock, $packet)) { - throw new \RuntimeException('Connection closed while requesting identities'); - } - - $length = current(unpack('N', $this->readBytes(4))); - $packet = $this->readBytes($length); - - list($type, $keyCount) = Strings::unpackSSH2('CN', $packet); - if ($type != self::SSH_AGENT_IDENTITIES_ANSWER) { - throw new \RuntimeException('Unable to request identities'); - } - - $identities = []; - for ($i = 0; $i < $keyCount; $i++) { - list($key_blob, $comment) = Strings::unpackSSH2('ss', $packet); - $temp = $key_blob; - list($key_type) = Strings::unpackSSH2('s', $temp); - switch ($key_type) { - case 'ssh-rsa': - case 'ssh-dss': - case 'ssh-ed25519': - case 'ecdsa-sha2-nistp256': - case 'ecdsa-sha2-nistp384': - case 'ecdsa-sha2-nistp521': - $key = PublicKeyLoader::load($key_type . ' ' . base64_encode($key_blob)); - } - // resources are passed by reference by default - if (isset($key)) { - $identity = (new Identity($this->fsock)) - ->withPublicKey($key) - ->withPublicKeyBlob($key_blob) - ->withComment($comment); - $identities[] = $identity; - unset($key); - } - } - - return $identities; - } - - /** - * Returns the SSH Agent identity matching a given public key or null if no identity is found - * - * @return ?Identity - */ - public function findIdentityByPublicKey(PublicKey $key) - { - $identities = $this->requestIdentities(); - $key = (string) $key; - foreach ($identities as $identity) { - if (((string) $identity->getPublicKey()) == $key) { - return $identity; - } - } - - return null; - } - - /** - * Signal that agent forwarding should - * be requested when a channel is opened - * - * @return void - */ - public function startSSHForwarding() - { - if ($this->forward_status == self::FORWARD_NONE) { - $this->forward_status = self::FORWARD_REQUEST; - } - } - - /** - * Request agent forwarding of remote server - * - * @param SSH2 $ssh - * @return bool - */ - private function request_forwarding(SSH2 $ssh) - { - if (!$ssh->requestAgentForwarding()) { - return false; - } - - $this->forward_status = self::FORWARD_ACTIVE; - - return true; - } - - /** - * On successful channel open - * - * This method is called upon successful channel - * open to give the SSH Agent an opportunity - * to take further action. i.e. request agent forwarding - * - * @param SSH2 $ssh - */ - public function registerChannelOpen(SSH2 $ssh) - { - if ($this->forward_status == self::FORWARD_REQUEST) { - $this->request_forwarding($ssh); - } - } - - /** - * Forward data to SSH Agent and return data reply - * - * @param string $data - * @return string Data from SSH Agent - * @throws \RuntimeException on connection errors - */ - public function forwardData($data) - { - if ($this->expected_bytes > 0) { - $this->socket_buffer .= $data; - $this->expected_bytes -= strlen($data); - } else { - $agent_data_bytes = current(unpack('N', $data)); - $current_data_bytes = strlen($data); - $this->socket_buffer = $data; - if ($current_data_bytes != $agent_data_bytes + 4) { - $this->expected_bytes = ($agent_data_bytes + 4) - $current_data_bytes; - return false; - } - } - - if (strlen($this->socket_buffer) != fwrite($this->fsock, $this->socket_buffer)) { - throw new \RuntimeException('Connection closed attempting to forward data to SSH agent'); - } - - $this->socket_buffer = ''; - $this->expected_bytes = 0; - - $agent_reply_bytes = current(unpack('N', $this->readBytes(4))); - - $agent_reply_data = $this->readBytes($agent_reply_bytes); - $agent_reply_data = current(unpack('a*', $agent_reply_data)); - - return pack('Na*', $agent_reply_bytes, $agent_reply_data); - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/System/SSH/Agent/Identity.php b/composer/phpseclib/phpseclib/phpseclib/System/SSH/Agent/Identity.php deleted file mode 100644 index b2838bb..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/System/SSH/Agent/Identity.php +++ /dev/null @@ -1,346 +0,0 @@ - - * @copyright 2009 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\System\SSH\Agent; - -use OCA\Libresign\Vendor\phpseclib3\Common\Functions\Strings; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\PrivateKey; -use OCA\Libresign\Vendor\phpseclib3\Crypt\Common\PublicKey; -use OCA\Libresign\Vendor\phpseclib3\Crypt\DSA; -use OCA\Libresign\Vendor\phpseclib3\Crypt\EC; -use OCA\Libresign\Vendor\phpseclib3\Crypt\RSA; -use OCA\Libresign\Vendor\phpseclib3\Exception\UnsupportedAlgorithmException; -use OCA\Libresign\Vendor\phpseclib3\System\SSH\Agent; -use OCA\Libresign\Vendor\phpseclib3\System\SSH\Common\Traits\ReadBytes; - -/** - * Pure-PHP ssh-agent client identity object - * - * Instantiation should only be performed by \phpseclib3\System\SSH\Agent class. - * This could be thought of as implementing an interface that phpseclib3\Crypt\RSA - * implements. ie. maybe a Net_SSH_Auth_PublicKey interface or something. - * The methods in this interface would be getPublicKey and sign since those are the - * methods phpseclib looks for to perform public key authentication. - * - * @author Jim Wigginton - * @internal - */ -class Identity implements PrivateKey -{ - use ReadBytes; - - // Signature Flags - // See https://tools.ietf.org/html/draft-miller-ssh-agent-00#section-5.3 - const SSH_AGENT_RSA2_256 = 2; - const SSH_AGENT_RSA2_512 = 4; - - /** - * Key Object - * - * @var PublicKey - * @see self::getPublicKey() - */ - private $key; - - /** - * Key Blob - * - * @var string - * @see self::sign() - */ - private $key_blob; - - /** - * Socket Resource - * - * @var resource - * @see self::sign() - */ - private $fsock; - - /** - * Signature flags - * - * @var int - * @see self::sign() - * @see self::setHash() - */ - private $flags = 0; - - /** - * Comment - * - * @var null|string - */ - private $comment; - - /** - * Curve Aliases - * - * @var array - */ - private static $curveAliases = [ - 'secp256r1' => 'nistp256', - 'secp384r1' => 'nistp384', - 'secp521r1' => 'nistp521', - 'Ed25519' => 'Ed25519' - ]; - - /** - * Default Constructor. - * - * @param resource $fsock - */ - public function __construct($fsock) - { - $this->fsock = $fsock; - } - - /** - * Set Public Key - * - * Called by \phpseclib3\System\SSH\Agent::requestIdentities() - * - * @param PublicKey $key - */ - public function withPublicKey(PublicKey $key) - { - if ($key instanceof EC) { - if (is_array($key->getCurve()) || !isset(self::$curveAliases[$key->getCurve()])) { - throw new UnsupportedAlgorithmException('The only supported curves are nistp256, nistp384, nistp512 and Ed25519'); - } - } - - $new = clone $this; - $new->key = $key; - return $new; - } - - /** - * Set Public Key - * - * Called by \phpseclib3\System\SSH\Agent::requestIdentities(). The key blob could be extracted from $this->key - * but this saves a small amount of computation. - * - * @param string $key_blob - */ - public function withPublicKeyBlob($key_blob) - { - $new = clone $this; - $new->key_blob = $key_blob; - return $new; - } - - /** - * Get Public Key - * - * Wrapper for $this->key->getPublicKey() - * - * @return mixed - */ - public function getPublicKey() - { - return $this->key; - } - - /** - * Sets the hash - * - * @param string $hash - */ - public function withHash($hash) - { - $new = clone $this; - - $hash = strtolower($hash); - - if ($this->key instanceof RSA) { - $new->flags = 0; - switch ($hash) { - case 'sha1': - break; - case 'sha256': - $new->flags = self::SSH_AGENT_RSA2_256; - break; - case 'sha512': - $new->flags = self::SSH_AGENT_RSA2_512; - break; - default: - throw new UnsupportedAlgorithmException('The only supported hashes for RSA are sha1, sha256 and sha512'); - } - } - if ($this->key instanceof EC) { - switch ($this->key->getCurve()) { - case 'secp256r1': - $expectedHash = 'sha256'; - break; - case 'secp384r1': - $expectedHash = 'sha384'; - break; - //case 'secp521r1': - //case 'Ed25519': - default: - $expectedHash = 'sha512'; - } - if ($hash != $expectedHash) { - throw new UnsupportedAlgorithmException('The only supported hash for ' . self::$curveAliases[$this->key->getCurve()] . ' is ' . $expectedHash); - } - } - if ($this->key instanceof DSA) { - if ($hash != 'sha1') { - throw new UnsupportedAlgorithmException('The only supported hash for DSA is sha1'); - } - } - return $new; - } - - /** - * Sets the padding - * - * Only PKCS1 padding is supported - * - * @param string $padding - */ - public function withPadding($padding) - { - if (!$this->key instanceof RSA) { - throw new UnsupportedAlgorithmException('Only RSA keys support padding'); - } - if ($padding != RSA::SIGNATURE_PKCS1 && $padding != RSA::SIGNATURE_RELAXED_PKCS1) { - throw new UnsupportedAlgorithmException('ssh-agent can only create PKCS1 signatures'); - } - return $this; - } - - /** - * Determines the signature padding mode - * - * Valid values are: ASN1, SSH2, Raw - * - * @param string $format - */ - public function withSignatureFormat($format) - { - if ($this->key instanceof RSA) { - throw new UnsupportedAlgorithmException('Only DSA and EC keys support signature format setting'); - } - if ($format != 'SSH2') { - throw new UnsupportedAlgorithmException('Only SSH2-formatted signatures are currently supported'); - } - - return $this; - } - - /** - * Returns the curve - * - * Returns a string if it's a named curve, an array if not - * - * @return string|array - */ - public function getCurve() - { - if (!$this->key instanceof EC) { - throw new UnsupportedAlgorithmException('Only EC keys have curves'); - } - - return $this->key->getCurve(); - } - - /** - * Create a signature - * - * See "2.6.2 Protocol 2 private key signature request" - * - * @param string $message - * @return string - * @throws \RuntimeException on connection errors - * @throws UnsupportedAlgorithmException if the algorithm is unsupported - */ - public function sign($message) - { - // the last parameter (currently 0) is for flags and ssh-agent only defines one flag (for ssh-dss): SSH_AGENT_OLD_SIGNATURE - $packet = Strings::packSSH2( - 'CssN', - Agent::SSH_AGENTC_SIGN_REQUEST, - $this->key_blob, - $message, - $this->flags - ); - $packet = Strings::packSSH2('s', $packet); - if (strlen($packet) != fputs($this->fsock, $packet)) { - throw new \RuntimeException('Connection closed during signing'); - } - - $length = current(unpack('N', $this->readBytes(4))); - $packet = $this->readBytes($length); - - list($type, $signature_blob) = Strings::unpackSSH2('Cs', $packet); - if ($type != Agent::SSH_AGENT_SIGN_RESPONSE) { - throw new \RuntimeException('Unable to retrieve signature'); - } - - if (!$this->key instanceof RSA) { - return $signature_blob; - } - - list($type, $signature_blob) = Strings::unpackSSH2('ss', $signature_blob); - - return $signature_blob; - } - - /** - * Returns the private key - * - * @param string $type - * @param array $options optional - * @return string - */ - public function toString($type, array $options = []) - { - throw new \RuntimeException('ssh-agent does not provide a mechanism to get the private key'); - } - - /** - * Sets the password - * - * @param string|bool $password - * @return never - */ - public function withPassword($password = false) - { - throw new \RuntimeException('ssh-agent does not provide a mechanism to get the private key'); - } - - /** - * Sets the comment - */ - public function withComment($comment = null) - { - $new = clone $this; - $new->comment = $comment; - return $new; - } - - /** - * Returns the comment - * - * @return null|string - */ - public function getComment() - { - return $this->comment; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/System/SSH/Common/Traits/ReadBytes.php b/composer/phpseclib/phpseclib/phpseclib/System/SSH/Common/Traits/ReadBytes.php deleted file mode 100644 index 2c9447c..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/System/SSH/Common/Traits/ReadBytes.php +++ /dev/null @@ -1,37 +0,0 @@ - - * @copyright 2015 Jim Wigginton - * @license http://www.opensource.org/licenses/mit-license.html MIT License - * @link http://phpseclib.sourceforge.net - */ - -namespace OCA\Libresign\Vendor\phpseclib3\System\SSH\Common\Traits; - -/** - * ReadBytes trait - * - * @author Jim Wigginton - */ -trait ReadBytes -{ - /** - * Read data - * - * @param int $length - * @throws \RuntimeException on connection errors - */ - public function readBytes($length) - { - $temp = fread($this->fsock, $length); - if (strlen($temp) != $length) { - throw new \RuntimeException("Expected $length bytes; got " . strlen($temp)); - } - return $temp; - } -} diff --git a/composer/phpseclib/phpseclib/phpseclib/bootstrap.php b/composer/phpseclib/phpseclib/phpseclib/bootstrap.php deleted file mode 100644 index 517106c..0000000 --- a/composer/phpseclib/phpseclib/phpseclib/bootstrap.php +++ /dev/null @@ -1,22 +0,0 @@ - $content, }; }, - // patchers for phpseclib - static function (string $filePath, string $prefix, string $content): string { - if (!str_contains($filePath, 'phpseclib/phpseclib') || !str_ends_with($filePath, '.php')) { - return $content; - } - $s_prefix = str_replace('\\', '\\\\', $prefix); - $content = str_replace("'phpseclib3\\\\", "'\\\\" . $s_prefix . '\\\\phpseclib3\\\\', $content); - $content = str_replace("'\\\\phpseclib3", "'\\\\" . $s_prefix . '\\\\phpseclib3', $content); - - // Specific patch for Crypt/RSA/Formats/Keys/PSS.php: handle saltLength being an int or an object - if (str_contains($filePath, 'Crypt/RSA/Formats/Keys/PSS.php')) { - $search = '$result[\'saltLength\'] = (int) $params[\'saltLength\']->toString();'; - $replace = <<<'PHP' -if (is_int($params['saltLength'])) { - $result['saltLength'] = $params['saltLength']; - } else { - $result['saltLength'] = (int) $params['saltLength']->toString(); - } -PHP; - if (strpos($content, $search) !== false) { - $content = str_replace($search, $replace, $content); - } else { - $content = preg_replace( - '/\$result\\[\\\'saltLength\\\']\\s*=\\s*\\(int\\)\\s*\\$params\\[\\\'saltLength\\\']\\->toString\\(\\);/m', - $replace, - $content - ); - } - } - - // Specific patch for File/X509.php: update docblock param type for $crl to string|array - if (str_contains($filePath, 'File/X509.php')) { - $content = str_replace('@param string $crl', '@param string|array $crl', $content); - } - - return $content; - }, // patchers for pdfparser static function (string $filePath, string $prefix, string $content): string { if (!str_contains($filePath, 'smalot/pdfparser') || !str_ends_with($filePath, '.php')) { From b90abe31f5a8d8a42b768a80dd692228d1cfd07c Mon Sep 17 00:00:00 2001 From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> Date: Fri, 21 Nov 2025 12:18:42 -0300 Subject: [PATCH 3/3] fix: remove dev Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com> --- composer/composer/installed.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer/composer/installed.json b/composer/composer/installed.json index d60f8bb..c2fc169 100644 --- a/composer/composer/installed.json +++ b/composer/composer/installed.json @@ -2520,6 +2520,6 @@ "install-path": "..\/wobeto\/email-blur" } ], - "dev": true, + "dev": false, "dev-package-names": [] } \ No newline at end of file