github.com/choria-io/go-choria@v0.28.1-0.20240416190746-b3bf9c7d5a45/providers/signers/aaasvc_rpc.go (about) 1 // Copyright (c) 2021, R.I. Pienaar and the Choria Project contributors 2 // 3 // SPDX-License-Identifier: Apache-2.0 4 5 package signers 6 7 import ( 8 "context" 9 "encoding/hex" 10 "fmt" 11 12 aaac "github.com/choria-io/go-choria/client/aaa_signerclient" 13 "github.com/choria-io/go-choria/inter" 14 iu "github.com/choria-io/go-choria/internal/util" 15 ) 16 17 // NewAAAServiceRPCSigner creates an AAA Signer that uses Choria RPC requests to the AAA Service 18 func NewAAAServiceRPCSigner(fw inter.Framework) *aaaServiceRPC { 19 return &aaaServiceRPC{fw: fw} 20 } 21 22 type aaaServiceRPC struct { 23 fw inter.Framework 24 } 25 26 func (s *aaaServiceRPC) Kind() string { return "AAA Service RPC" } 27 28 func (s *aaaServiceRPC) Sign(ctx context.Context, request []byte, cfg inter.RequestSignerConfig) ([]byte, error) { 29 signer, err := aaac.New(s.fw) 30 if err != nil { 31 return nil, err 32 } 33 34 token, err := cfg.RemoteSignerToken() 35 if err != nil { 36 return nil, err 37 } 38 39 sf, err := cfg.RemoteSignerSeedFile() 40 if err != nil { 41 return nil, err 42 } 43 44 sigb, err := iu.Ed25519SignWithSeedFile(sf, request) 45 if err != nil { 46 return nil, err 47 } 48 49 res, err := signer.OptionWorkers(1).Sign(string(request), hex.EncodeToString(sigb), string(token)).Do(ctx) 50 if err != nil { 51 return nil, err 52 } 53 54 if res.Stats().ResponsesCount() != 1 { 55 return nil, fmt.Errorf("expected 1 response received %d", res.Stats().ResponsesCount()) 56 } 57 58 var signed []byte 59 60 res.EachOutput(func(r *aaac.SignOutput) { 61 if !r.ResultDetails().OK() { 62 err = fmt.Errorf("signing failed: %s", r.ResultDetails().StatusMessage()) 63 } 64 65 signed = []byte(r.SecureRequest()) 66 }) 67 68 return signed, err 69 }