github.com/hyperledger/burrow@v0.34.5-0.20220512172541-77f09336001d/integration/keys/keys_server_test.go (about)

     1  package keys
     2  
     3  import (
     4  	"context"
     5  	"net"
     6  	"testing"
     7  	"time"
     8  
     9  	"github.com/hyperledger/burrow/encoding"
    10  	"github.com/hyperledger/burrow/testutil"
    11  
    12  	"github.com/hyperledger/burrow/crypto"
    13  
    14  	"github.com/hyperledger/burrow/keys"
    15  	"github.com/stretchr/testify/assert"
    16  	"github.com/stretchr/testify/require"
    17  )
    18  
    19  type hashInfo struct {
    20  	data     string
    21  	expected string
    22  }
    23  
    24  func TestKeysServer(t *testing.T) {
    25  	testDir, cleanup := testutil.EnterTestDirectory()
    26  	defer cleanup()
    27  	failedCh := make(chan error)
    28  	server := keys.StandAloneServer(testDir, false)
    29  	listener, err := net.Listen("tcp", "localhost:0")
    30  	require.NoError(t, err)
    31  	address := listener.Addr().String()
    32  	go func() {
    33  		failedCh <- server.Serve(listener)
    34  	}()
    35  	hashData := map[string]hashInfo{
    36  		"sha256":    {"hi", "8F434346648F6B96DF89DDA901C5176B10A6D83961DD3C1AC88B59B2DC327AA4"},
    37  		"ripemd160": {"hi", "242485AB6BFD3502BCB3442EA2E211687B8E4D89"},
    38  	}
    39  	conn, err := encoding.GRPCDial(address)
    40  	require.NoError(t, err)
    41  	cli := keys.NewKeysClient(conn)
    42  
    43  	t.Run("Group", func(t *testing.T) {
    44  		for _, typ := range []string{"ed25519", "secp256k1"} {
    45  			t.Run("KeygenAndPub", func(t *testing.T) {
    46  				t.Parallel()
    47  				ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
    48  				defer cancel()
    49  
    50  				genresp, err := cli.GenerateKey(ctx, &keys.GenRequest{CurveType: typ})
    51  				require.NoError(t, err)
    52  
    53  				addr := genresp.Address
    54  				resp, err := cli.PublicKey(ctx, &keys.PubRequest{Address: addr})
    55  				require.NoError(t, err)
    56  
    57  				addrB, err := crypto.AddressFromHexString(addr)
    58  				require.NoError(t, err)
    59  
    60  				curveType, err := crypto.CurveTypeFromString(typ)
    61  				require.NoError(t, err)
    62  
    63  				publicKey, err := crypto.PublicKeyFromBytes(resp.GetPublicKey(), curveType)
    64  				require.NoError(t, err)
    65  				assert.Equal(t, addrB, publicKey.GetAddress())
    66  			})
    67  
    68  			t.Run("SignAndVerify", func(t *testing.T) {
    69  				t.Parallel()
    70  				ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
    71  				defer cancel()
    72  				genresp, err := cli.GenerateKey(ctx, &keys.GenRequest{CurveType: typ})
    73  				require.NoError(t, err)
    74  
    75  				addr := genresp.Address
    76  				resp, err := cli.PublicKey(ctx, &keys.PubRequest{Address: addr})
    77  				require.NoError(t, err)
    78  
    79  				msg := []byte("the hash of something!")
    80  				hash := crypto.Keccak256(msg)
    81  
    82  				sig, err := cli.Sign(ctx, &keys.SignRequest{Address: addr, Message: hash})
    83  				require.NoError(t, err)
    84  
    85  				_, err = cli.Verify(ctx, &keys.VerifyRequest{
    86  					Signature: sig.GetSignature(),
    87  					PublicKey: resp.GetPublicKey(),
    88  					Message:   hash,
    89  				})
    90  				require.NoError(t, err)
    91  			})
    92  
    93  		}
    94  		for _, typ := range []string{"sha256", "ripemd160"} {
    95  			t.Run("Hash", func(t *testing.T) {
    96  				t.Parallel()
    97  				hData := hashData[typ]
    98  				data, expected := hData.data, hData.expected
    99  
   100  				ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
   101  				defer cancel()
   102  				resp, err := cli.Hash(ctx, &keys.HashRequest{Hashtype: typ, Message: []byte(data)})
   103  				require.NoError(t, err)
   104  
   105  				require.Equal(t, expected, resp.GetHash())
   106  			})
   107  		}
   108  	})
   109  	select {
   110  	case err := <-failedCh:
   111  		require.NoError(t, err)
   112  	default:
   113  	}
   114  }