aboutsummaryrefslogtreecommitdiffstats
path: root/lib/private/Security
diff options
context:
space:
mode:
authorMorris Jobke <hey@morrisjobke.de>2021-04-22 13:23:39 +0200
committerGitHub <noreply@github.com>2021-04-22 13:23:39 +0200
commit393309b98fed803bad575c71b3af3b51c469fc53 (patch)
tree8a0e5f95a453013ffce02c6275945f76a9b55d44 /lib/private/Security
parent634b6b8b57800bf9999f039a3d3282ba3321d2e4 (diff)
parent16652ac6c6635cc4d5ecc5c1523018e27ac30189 (diff)
downloadnextcloud-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.php22
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;
+ }
}