Skip to content

Commit 6ac1216

Browse files
authored
Merge pull request #6252 from oasisprotocol/peternose/trivial/tls-provider
go/consensus/cometbft/stateless/provider: Support TLS connection
2 parents 35393c2 + f28272e commit 6ac1216

4 files changed

Lines changed: 65 additions & 10 deletions

File tree

.changelog/6252.trivial.md

Whitespace-only changes.

go/consensus/cometbft/cometbft.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ func New(
4545
}
4646
return node, nil
4747
case config.ModeStatelessClient:
48-
node, err := createStatelessNode(ctx, genesis, doc, genesisDoc, p2p)
48+
node, err := createStatelessNode(ctx, identity, genesis, doc, genesisDoc, p2p)
4949
if err != nil {
5050
return nil, fmt.Errorf("failed to create stateless node: %w", err)
5151
}
@@ -97,12 +97,13 @@ func createFullNode(
9797

9898
func createStatelessNode(
9999
ctx context.Context,
100+
identity *identity.Identity,
100101
genesis genesisAPI.Provider,
101102
doc *genesisAPI.Document,
102103
genesisDoc *cmttypes.GenesisDoc,
103104
p2p p2pAPI.Service,
104105
) (consensusAPI.Service, error) {
105-
provider, err := createProvider()
106+
provider, err := createProvider(identity)
106107
if err != nil {
107108
return nil, fmt.Errorf("failed to create provider: %w", err)
108109
}
@@ -145,13 +146,13 @@ func createStatelessServices(
145146
return stateless.NewServices(provider, lightClient, cfg)
146147
}
147148

148-
func createProvider() (*consensusAPI.Client, error) {
149+
func createProvider(identity *identity.Identity) (*consensusAPI.Client, error) {
149150
addresses := config.GlobalConfig.Consensus.Providers
150151
if len(addresses) == 0 {
151152
return nil, fmt.Errorf("no providers configured")
152153
}
153154

154-
return stateless.NewProvider(addresses[0])
155+
return stateless.NewProvider(addresses[0], identity.TLSCertificate)
155156
}
156157

157158
func createLightClient(
Lines changed: 59 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,77 @@
11
package stateless
22

33
import (
4+
"crypto/tls"
5+
"fmt"
6+
"strings"
7+
48
"google.golang.org/grpc"
9+
"google.golang.org/grpc/credentials"
510
"google.golang.org/grpc/credentials/insecure"
611

12+
"github.com/oasisprotocol/oasis-core/go/common/crypto/signature"
713
cmnGrpc "github.com/oasisprotocol/oasis-core/go/common/grpc"
14+
"github.com/oasisprotocol/oasis-core/go/common/identity"
815
consensusAPI "github.com/oasisprotocol/oasis-core/go/consensus/api"
916
)
1017

1118
// NewProvider creates a new consensus provider for the stateless client.
12-
func NewProvider(address string) (*consensusAPI.Client, error) {
13-
conn, err := cmnGrpc.Dial(
14-
address,
15-
grpc.WithTransportCredentials(insecure.NewCredentials()),
19+
func NewProvider(address string, cert *tls.Certificate) (*consensusAPI.Client, error) {
20+
target, creds, err := createCredentials(address, cert)
21+
if err != nil {
22+
return nil, err
23+
}
24+
25+
opts := []grpc.DialOption{
26+
grpc.WithTransportCredentials(creds),
1627
grpc.WithDefaultCallOptions(grpc.WaitForReady(true)),
17-
)
28+
}
29+
30+
conn, err := cmnGrpc.Dial(target, opts...)
1831
if err != nil {
1932
return nil, err
2033
}
2134

2235
return consensusAPI.NewClient(conn), nil
2336
}
37+
38+
func createCredentials(address string, cert *tls.Certificate) (string, credentials.TransportCredentials, error) {
39+
switch {
40+
case cmnGrpc.IsSocketAddress(address):
41+
return address, insecure.NewCredentials(), nil
42+
case !containsPublicKey(address):
43+
return address, credentials.NewTLS(&tls.Config{}), nil
44+
default:
45+
return createClientCredentials(address, cert)
46+
}
47+
}
48+
49+
func createClientCredentials(address string, cert *tls.Certificate) (string, credentials.TransportCredentials, error) {
50+
key, target, _ := strings.Cut(address, "@")
51+
52+
var pk signature.PublicKey
53+
if err := pk.UnmarshalText([]byte(key)); err != nil {
54+
return "", nil, fmt.Errorf("malformed address: %s", address)
55+
}
56+
57+
opts := &cmnGrpc.ClientOptions{
58+
CommonName: identity.CommonName,
59+
ServerPubKeys: map[signature.PublicKey]bool{
60+
pk: true,
61+
},
62+
Certificates: []tls.Certificate{
63+
*cert,
64+
},
65+
}
66+
67+
creds, err := cmnGrpc.NewClientCreds(opts)
68+
if err != nil {
69+
return "", nil, err
70+
}
71+
72+
return target, creds, nil
73+
}
74+
75+
func containsPublicKey(address string) bool {
76+
return strings.Contains(address, "@")
77+
}

go/runtime/registry/config.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ func getConfiguredRuntimeIDs() ([]common.Namespace, error) {
7272
if len(runtimes) > 0 && !cmdFlags.DebugDontBlameOasis() {
7373
return nil, fmt.Errorf("no runtimes should be configured when in validator or seed modes")
7474
}
75-
case config.ModeCompute, config.ModeKeyManager, config.ModeStatelessClient:
75+
case config.ModeCompute, config.ModeKeyManager:
7676
// At least one runtime should be configured.
7777
if len(runtimes) == 0 && !cmdFlags.DebugDontBlameOasis() {
7878
return nil, fmt.Errorf("at least one runtime must be configured when in compute, keymanager, or client-stateless modes")

0 commit comments

Comments
 (0)