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 }