Failed Conditions
Push — master ( ed09c2...f0d0a7 )
by Florent
01:53
created

JWELoader::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 6
Code Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 6
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 4
nc 1
nop 3
1
<?php
2
3
declare(strict_types=1);
4
5
/*
6
 * The MIT License (MIT)
7
 *
8
 * Copyright (c) 2014-2017 Spomky-Labs
9
 *
10
 * This software may be modified and distributed under the terms
11
 * of the MIT license.  See the LICENSE file for details.
12
 */
13
14
namespace Jose\Component\Encryption;
15
16
use Jose\Component\Checker\HeaderCheckerManager;
17
use Jose\Component\Core\JWK;
18
use Jose\Component\Core\JWKSet;
19
use Jose\Component\Encryption\Serializer\JWESerializerManager;
20
21
final class JWELoader
22
{
23
    /**
24
     * @var JWEDecrypter
25
     */
26
    private $jweDecrypter;
27
28
    /**
29
     * @var HeaderCheckerManager
30
     */
31
    private $headerCheckerManager;
32
33
    /**
34
     * @var JWESerializerManager
35
     */
36
    private $serializerManager;
37
38
    /**
39
     * JWELoader constructor.
40
     *
41
     * @param JWESerializerManager $serializerManager
42
     * @param JWEDecrypter $jweDecrypter
43
     * @param HeaderCheckerManager $headerCheckerManager
44
     */
45
    public function __construct(JWESerializerManager $serializerManager, JWEDecrypter $jweDecrypter, HeaderCheckerManager $headerCheckerManager)
46
    {
47
        $this->serializerManager = $serializerManager;
48
        $this->jweDecrypter = $jweDecrypter;
49
        $this->headerCheckerManager = $headerCheckerManager;
50
    }
51
52
    /**
53
     * @param string $token
54
     * @param JWK $key
55
     * @param int $recipient
56
     *
57
     * @return JWE
58
     */
59
    public function loadAndDecryptWithKey(string $token, JWK $key, int &$recipient): JWE
60
    {
61
        $keyset = JWKSet::createFromKeys([$key]);
62
63
        return $this->loadAndDecryptWithKeySet($token, $keyset, $recipient);
64
    }
65
66
    /**
67
     * @param string $token
68
     * @param JWKSet $keyset
69
     * @param int $recipient
70
     * @return JWE
71
     *
72
     * @throws \Exception
73
     */
74
    public function loadAndDecryptWithKeySet(string $token, JWKSet $keyset, int &$recipient): JWE
75
    {
76
        try {
77
            $jwe = $this->serializerManager->unserialize($token);
78
            $nbRecipients = $jwe->countRecipients();
79
            for ($i = 0; $i < $nbRecipients; $i++) {
80
                if ($this->processRecipient($jwe, $keyset, $i)) {
81
                    $recipient = $i;
82
83
                    return $jwe;
84
                }
85
            }
86
        } catch (\Exception $e) {
87
            // Nothing to do. Exception thrown just after
88
        }
89
        throw new \Exception('Unable to load the token.');
90
    }
91
92
    /**
93
     * @param JWE $jwe
94
     * @param JWKSet $keyset
95
     * @param int $recipient
96
     *
97
     * @return bool
98
     */
99
    private function processRecipient(JWE &$jwe, JWKSet $keyset, int $recipient): bool
100
    {
101
        try {
102
            $this->headerCheckerManager->check($jwe, $recipient);
103
104
            return $this->jweDecrypter->decryptUsingKeySet($jwe, $keyset, $recipient);
105
        } catch (\Exception $e) {
106
            return false;
107
        }
108
    }
109
}
110