aboutsummaryrefslogtreecommitdiffstats
path: root/kube2msb/src/kube2msb/vendor/github.com/coreos/go-oidc/jose/sig_hmac.go
blob: b3ca3ef3d491a8a5f8e09ac3c879fef8b0560e15 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package jose

import (
	"bytes"
	"crypto"
	"crypto/hmac"
	_ "crypto/sha256"
	"errors"
	"fmt"
)

type VerifierHMAC struct {
	KeyID  string
	Hash   crypto.Hash
	Secret []byte
}

type SignerHMAC struct {
	VerifierHMAC
}

func NewVerifierHMAC(jwk JWK) (*VerifierHMAC, error) {
	if jwk.Alg != "" && jwk.Alg != "HS256" {
		return nil, fmt.Errorf("unsupported key algorithm %q", jwk.Alg)
	}

	v := VerifierHMAC{
		KeyID:  jwk.ID,
		Secret: jwk.Secret,
		Hash:   crypto.SHA256,
	}

	return &v, nil
}

func (v *VerifierHMAC) ID() string {
	return v.KeyID
}

func (v *VerifierHMAC) Alg() string {
	return "HS256"
}

func (v *VerifierHMAC) Verify(sig []byte, data []byte) error {
	h := hmac.New(v.Hash.New, v.Secret)
	h.Write(data)
	if !bytes.Equal(sig, h.Sum(nil)) {
		return errors.New("invalid hmac signature")
	}
	return nil
}

func NewSignerHMAC(kid string, secret []byte) *SignerHMAC {
	return &SignerHMAC{
		VerifierHMAC: VerifierHMAC{
			KeyID:  kid,
			Secret: secret,
			Hash:   crypto.SHA256,
		},
	}
}

func (s *SignerHMAC) Sign(data []byte) ([]byte, error) {
	h := hmac.New(s.Hash.New, s.Secret)
	h.Write(data)
	return h.Sum(nil), nil
}