* * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace douyin; use app\common\exception\Exception; use douyin\AES; /** * Class Encryptor. * * @author mingyoung */ class Encryptor { /** * Decrypt data. * * @param string $sessionKey * @param string $iv * @param string $encrypted * * @return array */ public function decryptData(string $sessionKey, string $iv, string $encrypted): array { $decrypted = AES::decrypt( base64_decode($encrypted, false), base64_decode($sessionKey, false), base64_decode($iv, false) ); $decrypted = json_decode($this->pkcs7Unpad($decrypted), true); if (!$decrypted) { throw new Exception('The given payload is invalid.'); } return $decrypted; } const ERROR_INVALID_SIGNATURE = -40001; // Signature verification failed const ERROR_CALC_SIGNATURE = -40003; // Calculating the signature failed const ERROR_INVALID_AES_KEY = -40004; // Invalid AESKey const ERROR_INVALID_APP_ID = -40005; // Check AppID failed const ERROR_ENCRYPT_AES = -40006; // AES EncryptionInterface failed const ERROR_DECRYPT_AES = -40007; // AES decryption failed const ERROR_BASE64_ENCODE = -40009; // Base64 encoding failed const ERROR_BASE64_DECODE = -40010; // Base64 decoding failed const ILLEGAL_BUFFER = -41003; // Illegal buffer /** * @var string */ protected $aesKey; /** * Block size. * * @var int */ protected $blockSize = 32; /** * Constructor. * * @param string $appId * @param string|null $token * @param string|null $aesKey */ public function __construct(string $aesKey = null) { $this->aesKey = base64_decode($aesKey.'=', true); } /** * Get SHA1. * * @return string * * @throws self */ public function signature(): string { $array = func_get_args(); sort($array, SORT_STRING); return sha1(implode($array)); } /** * PKCS#7 pad. * * @param string $text * @param int $blockSize * * @return string * */ public function pkcs7Pad($text, $blockSize) { if ($blockSize > 256) { throw new Exception('$blockSize may not be more than 256'); } $padding = $blockSize - (strlen($text) % $blockSize); $pattern = chr($padding); return $text.str_repeat($pattern, $padding); } /** * PKCS#7 unpad. * * @param string $text * * @return string */ public function pkcs7Unpad($text) { $pad = ord(substr($text, -1)); if ($pad < 1 || $pad > $this->blockSize) { $pad = 0; } return substr($text, 0, (strlen($text) - $pad)); } }