Completed
Push — v2.0.x ( 11273c...f488cd )
by Florent
04:53 queued 01:28
created

HMACSignatureTest   A

Complexity

Total Complexity 4

Size/Duplication

Total Lines 136
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 5

Importance

Changes 3
Bugs 0 Features 0
Metric Value
wmc 4
c 3
b 0
f 0
lcom 1
cbo 5
dl 0
loc 136
rs 10
1
<?php
2
3
/*
4
 * The MIT License (MIT)
5
 *
6
 * Copyright (c) 2014-2016 Spomky-Labs
7
 *
8
 * This software may be modified and distributed under the terms
9
 * of the MIT license.  See the LICENSE file for details.
10
 */
11
12
namespace Jose\Test\RFC7520;
13
14
use Base64Url\Base64Url;
15
use Jose\Algorithm\Signature\HS256;
16
use Jose\Loader;
17
use Jose\Object\JWK;
18
19
/**
20
 * @see https://tools.ietf.org/html/rfc7520#section-4.4
21
 *
22
 * @group HMAC
23
 */
24
class HMACSignatureTest extends \PHPUnit_Framework_TestCase
25
{
26
    /**
27
     *
28
     */
29
    public function testES512Verify()
30
    {
31
        /*
32
         * Symmetric Key
33
         * @see https://tools.ietf.org/html/rfc7520#section-3.5
34
         */
35
        $key = new JWK([
36
            'kty' => 'oct',
37
            'kid' => '018c0ae5-4d9b-471b-bfd6-eef314bc7037',
38
            'use' => 'sig',
39
            'alg' => 'HS256',
40
            'k'   => 'hJtXIZ2uSN5kbQfbtTNWbpdmhkV8FJG-Onbc6mxCcYg',
41
        ]);
42
43
        $header = 'eyJhbGciOiJIUzI1NiIsImtpZCI6IjAxOGMwYWU1LTRkOWItNDcxYi1iZmQ2LWVlZjMxNGJjNzAzNyJ9';
44
        $payload = 'SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4';
45
        $expected_signature = 's0h6KThzkfBBBkLspW1h84VsJZFTsPPqMDA7g1Md7p0';
46
47
        $hs256 = new HS256();
48
        $this->assertEquals($expected_signature, Base64Url::encode($hs256->sign($key, $header.'.'.$payload)));
49
        $this->assertTrue($hs256->verify($key, $header.'.'.$payload, Base64Url::decode($expected_signature)));
50
    }
51
52
    /**
53
     *
54
     */
55
    public function testES512VerifyWithDetachedPayload()
56
    {
57
        /*
58
         * Symmetric Key
59
         * @see https://tools.ietf.org/html/rfc7520#section-3.5
60
         */
61
        $key = new JWK([
62
            'kty' => 'oct',
63
            'kid' => '018c0ae5-4d9b-471b-bfd6-eef314bc7037',
64
            'use' => 'sig',
65
            'alg' => 'HS256',
66
            'k'   => 'hJtXIZ2uSN5kbQfbtTNWbpdmhkV8FJG-Onbc6mxCcYg',
67
        ]);
68
69
        $header = 'eyJhbGciOiJIUzI1NiIsImtpZCI6IjAxOGMwYWU1LTRkOWItNDcxYi1iZmQ2LWVlZjMxNGJjNzAzNyJ9';
70
        $payload = 'SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4';
71
        $expected_signature = 's0h6KThzkfBBBkLspW1h84VsJZFTsPPqMDA7g1Md7p0';
72
73
        $hs256 = new HS256();
74
        $this->assertEquals($expected_signature, Base64Url::encode($hs256->sign($key, $header.'.'.$payload)));
75
        $this->assertTrue($hs256->verify($key, $header.'.'.$payload, Base64Url::decode($expected_signature)));
76
    }
77
78
    /**
79
     * @see https://tools.ietf.org/html/rfc7520#section-4.4.3
80
     */
81
    public function testConversion()
82
    {
83
        $header = 'eyJhbGciOiJIUzI1NiIsImtpZCI6IjAxOGMwYWU1LTRkOWItNDcxYi1iZmQ2LWVlZjMxNGJjNzAzNyJ9';
84
        $payload = 'SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4';
85
        $signature = 's0h6KThzkfBBBkLspW1h84VsJZFTsPPqMDA7g1Md7p0';
86
87
        /*
88
         * Figure 35
89
         */
90
        $compact_serialization = $header.'.'.$payload.'.'.$signature;
91
92
        /*
93
         * Figure 35
94
         */
95
        $expected_general_serialization = [
96
            'payload'    => 'SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4',
97
            'signatures' => [
98
               [
99
                   'signature' => 's0h6KThzkfBBBkLspW1h84VsJZFTsPPqMDA7g1Md7p0',
100
                   'protected'  => 'eyJhbGciOiJIUzI1NiIsImtpZCI6IjAxOGMwYWU1LTRkOWItNDcxYi1iZmQ2LWVlZjMxNGJjNzAzNyJ9',
101
               ],
102
            ],
103
        ];
104
        $jws = Loader::load(json_encode($expected_general_serialization));
105
106
        /*
107
         * Figure 36
108
         */
109
        $expected_flattened_serialization = [
110
            'payload'   => 'SXTigJlzIGEgZGFuZ2Vyb3VzIGJ1c2luZXNzLCBGcm9kbywgZ29pbmcgb3V0IHlvdXIgZG9vci4gWW91IHN0ZXAgb250byB0aGUgcm9hZCwgYW5kIGlmIHlvdSBkb24ndCBrZWVwIHlvdXIgZmVldCwgdGhlcmXigJlzIG5vIGtub3dpbmcgd2hlcmUgeW91IG1pZ2h0IGJlIHN3ZXB0IG9mZiB0by4',
111
            'signature' => 's0h6KThzkfBBBkLspW1h84VsJZFTsPPqMDA7g1Md7p0',
112
            'protected' => 'eyJhbGciOiJIUzI1NiIsImtpZCI6IjAxOGMwYWU1LTRkOWItNDcxYi1iZmQ2LWVlZjMxNGJjNzAzNyJ9',
113
        ];
114
115
        $this->assertEquals($expected_general_serialization, json_decode($jws->toJSON(), true));
116
        $this->assertEquals($expected_flattened_serialization, json_decode($jws->toFlattenedJSON(0), true));
117
        $this->assertEquals($compact_serialization, $jws->toCompactJSON(0));
118
    }
119
120
    /**
121
     * @see https://tools.ietf.org/html/rfc7520#section-4.5.3
122
     */
123
    public function testConversionWithDetachedPayload()
124
    {
125
        $header = 'eyJhbGciOiJIUzI1NiIsImtpZCI6IjAxOGMwYWU1LTRkOWItNDcxYi1iZmQ2LWVlZjMxNGJjNzAzNyJ9';
126
        $payload = '';
127
        $signature = 's0h6KThzkfBBBkLspW1h84VsJZFTsPPqMDA7g1Md7p0';
128
129
        /*
130
         * Figure 35
131
         */
132
        $compact_serialization = $header.'.'.$payload.'.'.$signature;
133
134
        /*
135
         * Figure 35
136
         */
137
        $expected_general_serialization = [
138
            'signatures' => [
139
               [
140
                   'signature' => 's0h6KThzkfBBBkLspW1h84VsJZFTsPPqMDA7g1Md7p0',
141
                   'protected'  => 'eyJhbGciOiJIUzI1NiIsImtpZCI6IjAxOGMwYWU1LTRkOWItNDcxYi1iZmQ2LWVlZjMxNGJjNzAzNyJ9',
142
               ],
143
            ],
144
        ];
145
        $jws = Loader::load(json_encode($expected_general_serialization));
146
147
        /*
148
         * Figure 36
149
         */
150
        $expected_flattened_serialization = [
151
            'signature' => 's0h6KThzkfBBBkLspW1h84VsJZFTsPPqMDA7g1Md7p0',
152
            'protected' => 'eyJhbGciOiJIUzI1NiIsImtpZCI6IjAxOGMwYWU1LTRkOWItNDcxYi1iZmQ2LWVlZjMxNGJjNzAzNyJ9',
153
        ];
154
155
        $this->assertEquals($expected_general_serialization, json_decode($jws->toJSON(), true));
156
        $this->assertEquals($expected_flattened_serialization, json_decode($jws->toFlattenedJSON(0), true));
157
        $this->assertEquals($compact_serialization, $jws->toCompactJSON(0));
158
    }
159
}
160