Path: blob/main/components/public-api-server/pkg/jws/hs256.go
2506 views
// Copyright (c) 2023 Gitpod GmbH. All rights reserved.1// Licensed under the GNU Affero General Public License (AGPL).2// See License.AGPL.txt in the project root for license information.34package jws56import (7"crypto/x509"8"encoding/pem"9"errors"10"fmt"1112"github.com/golang-jwt/jwt/v5"13)1415func NewHS256FromKeySet(keyset KeySet) *HS256 {16// We treat the signing private key as our symmetric key, to do that, we first have to convert it to bytes17// For bytes conversion, we encode it as PKCS1 PK, pem format18raw := x509.MarshalPKCS1PrivateKey(keyset.Signing.Private)19key := pem.EncodeToMemory(&pem.Block{20Type: "",21Bytes: raw,22})2324return NewHS256(key)25}2627func NewHS256(symmetricKey []byte) *HS256 {28return &HS256{29key: symmetricKey,30}31}3233type HS256 struct {34key []byte35}3637func (s *HS256) Sign(token *jwt.Token) (string, error) {38if token.Method != jwt.SigningMethodHS256 {39return "", errors.New("invalid signing method, token must use HS256")40}4142signed, err := token.SignedString(s.key)43if err != nil {44return "", fmt.Errorf("failed to sign jwt: %w", err)45}4647return signed, nil48}4950func (v *HS256) Verify(token string, claims jwt.Claims, opts ...jwt.ParserOption) (*jwt.Token, error) {51parsed, err := jwt.ParseWithClaims(token, claims, jwt.Keyfunc(func(t *jwt.Token) (interface{}, error) {52return v.key, nil53}), opts...)5455if err != nil {56return nil, fmt.Errorf("failed to parse jwt: %w", err)57}5859return parsed, nil60}616263