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  }