versia-go/internal/service/svc_impls/request_signer_impl.go

63 lines
1.4 KiB
Go
Raw Normal View History

2024-08-20 22:43:26 +02:00
package svc_impls
import (
"crypto/rand"
"encoding/base64"
"encoding/json"
"git.devminer.xyz/devminer/unitel"
"github.com/go-logr/logr"
"github.com/gofiber/fiber/v2"
"github.com/lysand-org/versia-go/internal/service"
2024-08-22 23:03:38 +02:00
versiacrypto "github.com/lysand-org/versia-go/pkg/versia/crypto"
2024-08-20 22:43:26 +02:00
"net/url"
)
var _ service.RequestSigner = (*RequestSignerImpl)(nil)
type RequestSignerImpl struct {
telemetry *unitel.Telemetry
log logr.Logger
}
func NewRequestSignerImpl(telemetry *unitel.Telemetry, log logr.Logger) *RequestSignerImpl {
return &RequestSignerImpl{
telemetry: telemetry,
log: log,
}
}
2024-08-22 23:03:38 +02:00
func (i *RequestSignerImpl) Sign(c *fiber.Ctx, signer versiacrypto.Signer, body any) error {
2024-08-20 22:43:26 +02:00
s := i.telemetry.StartSpan(c.UserContext(), "function", "svc_impls/RequestSignerImpl.Sign")
defer s.End()
j, err := json.Marshal(body)
if err != nil {
return err
}
rawNonce := make([]byte, 64)
if _, err := rand.Read(rawNonce); err != nil {
return err
}
nonce := base64.StdEncoding.EncodeToString(rawNonce)
uri, err := url.ParseRequestURI(string(c.Request().RequestURI()))
if err != nil {
return err
}
digest := versiacrypto.SHA256(j)
2024-08-22 23:03:38 +02:00
d := versiacrypto.NewSignatureData(c.Method(), nonce, uri, digest)
2024-08-20 22:43:26 +02:00
signed := signer.Sign(*d)
for k, v := range signed.Headers() {
c.Set(k, v)
}
i.log.V(2).Info("signed response", "digest", base64.StdEncoding.EncodeToString(digest), "nonce", nonce)
return c.Send(j)
}