diff options
author | Morris Jobke <hey@morrisjobke.de> | 2021-04-22 13:23:39 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-22 13:23:39 +0200 |
commit | 393309b98fed803bad575c71b3af3b51c469fc53 (patch) | |
tree | 8a0e5f95a453013ffce02c6275945f76a9b55d44 /lib/private/Security | |
parent | 634b6b8b57800bf9999f039a3d3282ba3321d2e4 (diff) | |
parent | 16652ac6c6635cc4d5ecc5c1523018e27ac30189 (diff) | |
download | nextcloud-server-393309b98fed803bad575c71b3af3b51c469fc53.tar.gz nextcloud-server-393309b98fed803bad575c71b3af3b51c469fc53.zip |
Merge pull request #25714 from nextcloud/fix/23197/explicitly_check_hex2bin_input
Explicitly check hex2bin input
Diffstat (limited to 'lib/private/Security')
-rw-r--r-- | lib/private/Security/Crypto.php | 22 |
1 files changed, 19 insertions, 3 deletions
diff --git a/lib/private/Security/Crypto.php b/lib/private/Security/Crypto.php index 7b1e1a49b19..85591eb62f3 100644 --- a/lib/private/Security/Crypto.php +++ b/lib/private/Security/Crypto.php @@ -124,14 +124,14 @@ class Crypto implements ICrypto { throw new \Exception('Authenticated ciphertext could not be decoded.'); } - $ciphertext = hex2bin($parts[0]); + $ciphertext = $this->hex2bin($parts[0]); $iv = $parts[1]; - $hmac = hex2bin($parts[2]); + $hmac = $this->hex2bin($parts[2]); if ($partCount === 4) { $version = $parts[3]; if ($version >= '2') { - $iv = hex2bin($iv); + $iv = $this->hex2bin($iv); } if ($version === '3') { @@ -154,4 +154,20 @@ class Crypto implements ICrypto { return $result; } + + private function hex2bin(string $hex): string { + if (!ctype_xdigit($hex)) { + throw new \RuntimeException('String contains non hex chars: ' . $hex); + } + if (strlen($hex) % 2 !== 0) { + throw new \RuntimeException('Hex string is not of even length: ' . $hex); + } + $result = hex2bin($hex); + + if ($result === false) { + throw new \RuntimeException('Hex to bin conversion failed: ' . $hex); + } + + return $result; + } } |