...
1 package keyfunc
2
3 import (
4 "crypto/ecdsa"
5 "crypto/elliptic"
6 "fmt"
7 "math/big"
8 )
9
10 const (
11
12 ktyEC = "EC"
13
14
15 p256 = "P-256"
16
17
18 p384 = "P-384"
19
20
21 p521 = "P-521"
22 )
23
24
25 func (j *jsonWebKey) ECDSA() (publicKey *ecdsa.PublicKey, err error) {
26 if j.X == "" || j.Y == "" || j.Curve == "" {
27 return nil, fmt.Errorf("%w: %s", ErrMissingAssets, ktyEC)
28 }
29
30
31
32
33
34 xCoordinate, err := base64urlTrailingPadding(j.X)
35 if err != nil {
36 return nil, err
37 }
38 yCoordinate, err := base64urlTrailingPadding(j.Y)
39 if err != nil {
40 return nil, err
41 }
42
43 publicKey = &ecdsa.PublicKey{}
44 switch j.Curve {
45 case p256:
46 publicKey.Curve = elliptic.P256()
47 case p384:
48 publicKey.Curve = elliptic.P384()
49 case p521:
50 publicKey.Curve = elliptic.P521()
51 }
52
53
54
55
56
57 publicKey.X = big.NewInt(0).SetBytes(xCoordinate)
58 publicKey.Y = big.NewInt(0).SetBytes(yCoordinate)
59
60 return publicKey, nil
61 }
62
View as plain text