• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

famoser / elliptic / 16185239565

10 Jul 2025 03:12AM UTC coverage: 90.874% (-0.2%) from 91.111%
16185239565

Pull #13

github

web-flow
Merge 40ad72c72 into 77cf3b987
Pull Request #13: Test timing

0 of 2 new or added lines in 1 file covered. (0.0%)

697 of 767 relevant lines covered (90.87%)

33.61 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

90.48
/src/Curves/CurveRepository.php
1
<?php
2

3
namespace Famoser\Elliptic\Curves;
4

5
use Famoser\Elliptic\Primitives\Curve;
6

7
/**
8
 * Resolves to all known curves, guaranteeing a single instance per curve.
9
 */
10
class CurveRepository
11
{
12
    /**
13
     * @var array<string, string>
14
     */
15
    private array $oidAlias = [
16
        /* source: https://www.secg.org/sec2-v2.pdf A.2.1 */
17
        '1.3.132.0.31' => 'secp192k1',
18
        '1.2.840.10045.3.1.1' => 'secp192r1',
19
        '1.3.132.0.32' => 'secp224k1',
20
        '1.3.132.0.33' => 'secp224r1',
21
        '1.3.132.0.10' => 'secp256k1',
22
        '1.2.840.10045.3.1.7' => 'secp256r1',
23
        '1.3.132.0.34' => 'secp384r1',
24
        '1.3.132.0.35' => 'secp521r1',
25

26
        /* source: https://datatracker.ietf.org/doc/html/rfc5639 */
27
        '1.3.36.3.3.2.8.1.1.1' => 'brainpoolP160r1',
28
        '1.3.36.3.3.2.8.1.1.2' => 'brainpoolP160t1',
29
        '1.3.36.3.3.2.8.1.1.3' => 'brainpoolP192r1',
30
        '1.3.36.3.3.2.8.1.1.4' => 'brainpoolP192t1',
31
        '1.3.36.3.3.2.8.1.1.5' => 'brainpoolP224r1',
32
        '1.3.36.3.3.2.8.1.1.6' => 'brainpoolP224t1',
33
        '1.3.36.3.3.2.8.1.1.7' => 'brainpoolP256r1',
34
        '1.3.36.3.3.2.8.1.1.8' => 'brainpoolP256t1',
35
        '1.3.36.3.3.2.8.1.1.9' => 'brainpoolP320r1',
36
        '1.3.36.3.3.2.8.1.1.10' => 'brainpoolP320t1',
37
        '1.3.36.3.3.2.8.1.1.11' => 'brainpoolP384r1',
38
        '1.3.36.3.3.2.8.1.1.12' => 'brainpoolP384t1',
39
        '1.3.36.3.3.2.8.1.1.13' => 'brainpoolP512r1',
40
        '1.3.36.3.3.2.8.1.1.14' => 'brainpoolP512t1',
41
    ];
42

43
    /**
44
     * @var array<string, string>
45
     */
46
    private array $nameAlias = [
47
        /* source: https://www.secg.org/sec2-v2.pdf A.2.1 */
48
        'prime192v1' => 'secp192r1',
49
        'prime256v1' => 'secp256r1',
50

51
        /* source: https://www.gnupg.org/documentation/manuals/gcrypt/ECC-key-parameters.html */
52
        'NIST P-192' => 'secp192r1',
53
        'nistp192' => 'secp192r1',
54
        'NIST P-224' => 'secp224r1',
55
        'nistp224' => 'secp224r1',
56
        'NIST P-256' => 'secp256r1',
57
        'nistp256' => 'secp256r1',
58
        'NIST P-384' => 'secp384r1',
59
        'nistp384' => 'secp384r1',
60
        'NIST P-521' => 'secp521r1',
61
        'nistp521' => 'secp521r1',
62
    ];
63

64
    /**
65
     * @var array<string, callable():Curve>
66
     */
67
    private array $canonicalNameCurveConstructors = [
68
        'secp192k1' => [SEC2CurveFactory::class, 'secp192k1'],
69
        'secp192r1' => [SEC2CurveFactory::class, 'secp192r1'],
70
        'secp224k1' => [SEC2CurveFactory::class, 'secp224k1'],
71
        'secp224r1' => [SEC2CurveFactory::class, 'secp224r1'],
72
        'secp256k1' => [SEC2CurveFactory::class, 'secp256k1'],
73
        'secp256r1' => [SEC2CurveFactory::class, 'secp256r1'],
74
        'secp384r1' => [SEC2CurveFactory::class, 'secp384r1'],
75
        'secp521r1' => [SEC2CurveFactory::class, 'secp521r1'],
76

77
        'brainpoolP160r1' => [BrainpoolCurveFactory::class, 'p160r1'],
78
        'brainpoolP160t1' => [BrainpoolCurveFactory::class, 'p160t1'],
79
        'brainpoolP192r1' => [BrainpoolCurveFactory::class, 'p192r1'],
80
        'brainpoolP192t1' => [BrainpoolCurveFactory::class, 'p192t1'],
81
        'brainpoolP224r1' => [BrainpoolCurveFactory::class, 'p224r1'],
82
        'brainpoolP224t1' => [BrainpoolCurveFactory::class, 'p224t1'],
83
        'brainpoolP256r1' => [BrainpoolCurveFactory::class, 'p256r1'],
84
        'brainpoolP256t1' => [BrainpoolCurveFactory::class, 'p256t1'],
85
        'brainpoolP320r1' => [BrainpoolCurveFactory::class, 'p320r1'],
86
        'brainpoolP320t1' => [BrainpoolCurveFactory::class, 'p320t1'],
87
        'brainpoolP384r1' => [BrainpoolCurveFactory::class, 'p384r1'],
88
        'brainpoolP384t1' => [BrainpoolCurveFactory::class, 'p384t1'],
89
        'brainpoolP512r1' => [BrainpoolCurveFactory::class, 'p512r1'],
90
        'brainpoolP512t1' => [BrainpoolCurveFactory::class, 'p512t1'],
91
    ];
92

93
    /**
94
     * @var array<string, Curve>
95
     */
96
    private array $curveCache = [];
97

98
    /**
99
     * @return string[]
100
     */
101
    public function getKnownNames(): array
1✔
102
    {
103
        return array_merge(array_keys($this->canonicalNameCurveConstructors), array_keys($this->nameAlias));
1✔
104
    }
105

106
    /**
107
     * @return string[]
108
     */
109
    public function getKnownCurveOIDs(): array
2✔
110
    {
111
        return array_keys($this->oidAlias);
2✔
112
    }
113

114
    public function findByOID(string $oid): ?Curve
3✔
115
    {
116
        if (!array_key_exists($oid, $this->oidAlias)) {
3✔
117
            return null;
1✔
118
        }
119

120
        $canonicalName = $this->oidAlias[$oid];
2✔
121
        return $this->findByCanonicalName($canonicalName);
2✔
122
    }
123

124
    public function findByName(string $name): ?Curve
2✔
125
    {
126
        $canonicalName = array_key_exists($name, $this->nameAlias) ? $this->nameAlias[$name] : $name;
2✔
127

128
        return $this->findByCanonicalName($canonicalName);
2✔
129
    }
130

NEW
131
    public function getCanonicalName(Curve $curve): ?string
×
132
    {
NEW
133
        return array_search($curve, $this->curveCache, true);
×
134
    }
135

136
    private function findByCanonicalName(string $canonicalName): ?Curve
4✔
137
    {
138
        if (!array_key_exists($canonicalName, $this->canonicalNameCurveConstructors)) {
4✔
139
            return null;
1✔
140
        }
141

142
        if (!array_key_exists($canonicalName, $this->curveCache)) {
3✔
143
            $curveConstructor = $this->canonicalNameCurveConstructors[$canonicalName];
3✔
144
            $this->curveCache[$canonicalName] = $curveConstructor();
3✔
145
        }
146

147
        return $this->curveCache[$canonicalName];
3✔
148
    }
149
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc