GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Passed
Branch php72 (57c34e)
by Joni
05:01
created

Flags   A

Complexity

Total Complexity 14

Size/Duplication

Total Lines 140
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 2

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
wmc 14
lcom 1
cbo 2
dl 0
loc 140
ccs 48
cts 48
cp 1
rs 10
c 0
b 0
f 0

6 Methods

Rating   Name   Duplication   Size   Complexity  
A fromBitString() 0 9 2
A __construct() 0 25 4
A test() 0 13 2
A intNumber() 0 4 1
A string() 0 3 1
A number() 0 7 2
1
<?php
2
3
declare(strict_types = 1);
4
5
namespace Sop\ASN1\Util;
6
7
use Sop\ASN1\Type\Primitive\BitString;
8
9
/**
10
 * Class to handle a bit string as a field of flags.
11
 */
12
class Flags
13
{
14
    /**
15
     * Flag octets.
16
     *
17
     * @var string
18
     */
19
    protected $_flags;
20
21
    /**
22
     * Number of flags.
23
     *
24
     * @var int
25
     */
26
    protected $_width;
27
28
    /**
29
     * Constructor.
30
     *
31
     * @param int|string $flags Flags
32
     * @param int        $width The number of flags. If width is larger than
33
     *                          number of bits in $flags, zeroes are prepended
34
     *                          to flag field.
35
     */
36 62
    public function __construct($flags, int $width)
37
    {
38 62
        if (!$width) {
39 2
            $this->_flags = '';
40
        } else {
41
            // calculate number of unused bits in last octet
42 60
            $last_octet_bits = $width % 8;
43 60
            $unused_bits = $last_octet_bits ? 8 - $last_octet_bits : 0;
44 60
            $num = gmp_init($flags);
45
            // mask bits outside bitfield width
46 60
            $mask = gmp_sub(gmp_init(1) << $width, 1);
47 60
            $num &= $mask;
48
            // shift towards MSB if needed
49 60
            $data = gmp_export($num << $unused_bits, 1,
1 ignored issue
show
Bug introduced by
$num << $unused_bits of type integer is incompatible with the type GMP expected by parameter $gmpnumber of gmp_export(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

49
            $data = gmp_export(/** @scrutinizer ignore-type */ $num << $unused_bits, 1,
Loading history...
50 60
                GMP_MSW_FIRST | GMP_BIG_ENDIAN);
51 60
            $octets = unpack('C*', $data);
52 60
            $bits = count($octets) * 8;
0 ignored issues
show
Bug introduced by
It seems like $octets can also be of type false; however, parameter $var of count() does only seem to accept Countable|array, maybe add an additional type check? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

52
            $bits = count(/** @scrutinizer ignore-type */ $octets) * 8;
Loading history...
53
            // pad with zeroes
54 60
            while ($bits < $width) {
55 20
                array_unshift($octets, 0);
56 20
                $bits += 8;
57
            }
58 60
            $this->_flags = pack('C*', ...$octets);
59
        }
60 62
        $this->_width = $width;
61 62
    }
62
63
    /**
64
     * Initialize from BitString.
65
     *
66
     * @param BitString $bs
67
     * @param int       $width
68
     *
69
     * @return self
70
     */
71 8
    public static function fromBitString(BitString $bs, int $width): self
72
    {
73 8
        $num_bits = $bs->numBits();
74 8
        $num = gmp_import($bs->string(), 1, GMP_MSW_FIRST | GMP_BIG_ENDIAN);
75 8
        $num >>= $bs->unusedBits();
76 8
        if ($num_bits < $width) {
77 5
            $num <<= ($width - $num_bits);
78
        }
79 8
        return new self(gmp_strval($num, 10), $width);
80
    }
81
82
    /**
83
     * Check whether a bit at given index is set.
84
     *
85
     * Index 0 is the leftmost bit.
86
     *
87
     * @param int $idx
88
     *
89
     * @throws \OutOfBoundsException
90
     *
91
     * @return bool
92
     */
93 15
    public function test(int $idx): bool
94
    {
95 15
        if ($idx >= $this->_width) {
96 1
            throw new \OutOfBoundsException('Index is out of bounds.');
97
        }
98
        // octet index
99 14
        $oi = (int) floor($idx / 8);
100 14
        $byte = $this->_flags[$oi];
101
        // bit index
102 14
        $bi = $idx % 8;
103
        // index 0 is the most significant bit in byte
104 14
        $mask = 0x01 << (7 - $bi);
105 14
        return (ord($byte) & $mask) > 0;
106
    }
107
108
    /**
109
     * Get flags as an octet string.
110
     *
111
     * Zeroes are appended to the last octet if width is not divisible by 8.
112
     *
113
     * @return string
114
     */
115 23
    public function string(): string
116
    {
117 23
        return $this->_flags;
118
    }
119
120
    /**
121
     * Get flags as a base 10 integer.
122
     *
123
     * @return string Integer as a string
124
     */
125 15
    public function number(): string
126
    {
127 15
        $num = gmp_import($this->_flags, 1, GMP_MSW_FIRST | GMP_BIG_ENDIAN);
128 15
        $last_octet_bits = $this->_width % 8;
129 15
        $unused_bits = $last_octet_bits ? 8 - $last_octet_bits : 0;
130 15
        $num >>= $unused_bits;
131 15
        return gmp_strval($num, 10);
132
    }
133
134
    /**
135
     * Get flags as an integer.
136
     *
137
     * @return int
138
     */
139 1
    public function intNumber(): int
140
    {
141 1
        $num = new BigInt($this->number());
142 1
        return $num->intVal();
143
    }
144
145
    /**
146
     * Get flags as a BitString.
147
     *
148
     * Unused bits are set accordingly. Trailing zeroes are not stripped.
149
     *
150
     * @return BitString
151
     */
152 9
    public function bitString(): BitString
153
    {
154 9
        $last_octet_bits = $this->_width % 8;
155 9
        $unused_bits = $last_octet_bits ? 8 - $last_octet_bits : 0;
156 9
        return new BitString($this->_flags, $unused_bits);
157
    }
158
}
159