Skip to content

Commit 0fb131c

Browse files
committed
attestedtls: libapi refactoring
Signed-off-by: Simon Ott <simon.ott@aisec.fraunhofer.de>
1 parent dbab2e7 commit 0fb131c

File tree

7 files changed

+99
-80
lines changed

7 files changed

+99
-80
lines changed

attestedhttp/client.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -57,15 +57,15 @@ type Transport struct {
5757
// as we enforce aTLS as the underlying transport protocol
5858

5959
// Additional aTLS parameters
60-
Attest atls.AttestSelect
61-
MutualTls bool
62-
CmcAddr string
63-
CmcApi string
64-
ApiSerializer ar.Serializer
65-
Cmc *cmc.Cmc
66-
CmcPolicies []byte
67-
ReadTimeout time.Duration
68-
ResultCb func(result *ar.VerificationResult)
60+
Attest atls.AttestSelect
61+
MutualTls bool
62+
CmcAddr string
63+
CmcApi string
64+
ApiSerializer ar.Serializer
65+
LibApiCmcConfig *cmc.Config
66+
CmcPolicies []byte
67+
ReadTimeout time.Duration
68+
ResultCb func(result *ar.VerificationResult)
6969
}
7070

7171
// Wrapper for net/http Client
@@ -191,7 +191,7 @@ func prepareClient(c *Client) error {
191191
conn, err := atls.Dial("tcp", addr, c.Transport.TLSClientConfig,
192192
atls.WithApiSerializer(c.Transport.ApiSerializer),
193193
atls.WithAttest(c.Transport.Attest),
194-
atls.WithLibApiCmc(c.Transport.Cmc),
194+
atls.WithLibApiCmcConfig(c.Transport.LibApiCmcConfig),
195195
atls.WithCmcAddr(c.Transport.CmcAddr),
196196
atls.WithCmcApi(c.Transport.CmcApi),
197197
atls.WithCmcPolicies(c.Transport.CmcPolicies),

attestedhttp/server.go

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,14 @@ type Server struct {
3030
*http.Server
3131

3232
// Additional aTLS parameters
33-
Attest atls.AttestSelect
34-
MutualTls bool
35-
CmcAddr string
36-
CmcApi string
37-
ApiSerializer ar.Serializer
38-
Cmc *cmc.Cmc
39-
CmcPolicies []byte
40-
ResultCb func(result *ar.VerificationResult)
33+
Attest atls.AttestSelect
34+
MutualTls bool
35+
CmcAddr string
36+
CmcApi string
37+
ApiSerializer ar.Serializer
38+
LibApiCmcConfig *cmc.Config
39+
CmcPolicies []byte
40+
ResultCb func(result *ar.VerificationResult)
4141
}
4242

4343
func (s *Server) ListenAndServe() error {
@@ -55,7 +55,7 @@ func (s *Server) ListenAndServe() error {
5555
atls.WithMtls(s.MutualTls),
5656
atls.WithAttest(s.Attest),
5757
atls.WithResultCb(s.ResultCb),
58-
atls.WithLibApiCmc(s.Cmc))
58+
atls.WithLibApiCmcConfig(s.LibApiCmcConfig))
5959
if err != nil {
6060
log.Fatalf("Failed to listen for connections: %v", err)
6161
}

attestedtls/config.go

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -47,8 +47,7 @@ const (
4747
timeoutSec = 10
4848
)
4949

50-
// Struct that holds information on cmc address and port
51-
// to be used by Listener and DialConfig
50+
// CmcConfig holds the relevant parameters to interact with the cmcd
5251
type CmcConfig struct {
5352
CmcAddr string
5453
CmcApi CmcApi
@@ -58,7 +57,7 @@ type CmcConfig struct {
5857
Mtls bool
5958
Attest AttestSelect
6059
ResultCb func(result *ar.VerificationResult)
61-
Cmc *cmc.Cmc
60+
LibApiConfig *cmc.Config
6261
}
6362

6463
type CmcApi interface {
@@ -164,9 +163,9 @@ func WithResultCb(cb func(result *ar.VerificationResult)) ConnectionOption[CmcCo
164163

165164
// WithLibApiCmc takes a CMC object. This is only required for the Lib API, where
166165
// the CMC is integrated directly into binary (instead of using the cmcd)
167-
func WithLibApiCmc(cmc *cmc.Cmc) ConnectionOption[CmcConfig] {
166+
func WithLibApiCmcConfig(config *cmc.Config) ConnectionOption[CmcConfig] {
168167
return func(c *CmcConfig) error {
169-
c.Cmc = cmc
168+
c.LibApiConfig = config
170169
return nil
171170
}
172171
}

attestedtls/libapi.go

Lines changed: 56 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ import (
3232
"github.com/Fraunhofer-AISEC/cmc/internal"
3333
)
3434

35-
type LibApi struct{}
35+
type LibApi struct {
36+
cmc *cmc.Cmc
37+
}
3638

3739
func init() {
3840
CmcApis["libapi"] = LibApi{}
@@ -41,17 +43,25 @@ func init() {
4143
// Obtains attestation report from CMCd
4244
func (a LibApi) obtainAR(cc *CmcConfig, chbindings []byte, cached []string) ([]byte, map[string][]byte, []string, error) {
4345

44-
if cc == nil || cc.Cmc == nil {
46+
if cc == nil {
4547
return nil, nil, nil, errors.New("internal error: cmc is nil")
4648
}
4749

48-
if len(cc.Cmc.Drivers) == 0 {
50+
if a.cmc == nil {
51+
cmc, err := cmc.NewCmc(cc.LibApiConfig)
52+
if err != nil {
53+
return nil, nil, nil, fmt.Errorf("failed to initialize CMC: %v", err)
54+
}
55+
a.cmc = cmc
56+
}
57+
58+
if len(a.cmc.Drivers) == 0 {
4959
return nil, nil, nil, errors.New("no drivers configured")
5060
}
5161

5262
log.Debug("Prover: Generating Attestation Report with nonce: ", hex.EncodeToString(chbindings))
5363

54-
report, metadata, cacheMisses, err := cmc.Generate(chbindings, cached, cc.Cmc)
64+
report, metadata, cacheMisses, err := cmc.Generate(chbindings, cached, a.cmc)
5565
if err != nil {
5666
return nil, nil, nil, fmt.Errorf("failed to generate attestation report: %w", err)
5767
}
@@ -74,10 +84,18 @@ func (a LibApi) verifyAR(
7484
metadata map[string][]byte,
7585
) error {
7686

77-
if cc == nil || cc.Cmc == nil {
87+
if cc == nil {
7888
return errors.New("internal error: cmc is nil")
7989
}
8090

91+
if a.cmc == nil {
92+
cmc, err := cmc.NewCmc(cc.LibApiConfig)
93+
if err != nil {
94+
return fmt.Errorf("failed to initialize CMC: %v", err)
95+
}
96+
a.cmc = cmc
97+
}
98+
8199
req := &api.VerificationRequest{
82100
Nonce: nonce,
83101
Report: report,
@@ -89,7 +107,7 @@ func (a LibApi) verifyAR(
89107

90108
log.Debug("Verifier: verifying attestation report")
91109
result, err := cmc.Verify(req.Report, req.Nonce, req.Policies,
92-
req.Peer, req.CacheMisses, req.Metadata, cc.Cmc)
110+
req.Peer, req.CacheMisses, req.Metadata, a.cmc)
93111
if err != nil {
94112
return fmt.Errorf("failed to verify: %w", err)
95113
}
@@ -113,14 +131,22 @@ func (a LibApi) verifyAR(
113131

114132
func (a LibApi) fetchSignature(cc *CmcConfig, digest []byte, opts crypto.SignerOpts) ([]byte, error) {
115133

116-
if cc == nil || cc.Cmc == nil {
134+
if cc == nil {
117135
return nil, errors.New("internal error: cmc is nil")
118136
}
119137

120-
if len(cc.Cmc.Drivers) == 0 {
138+
if a.cmc == nil {
139+
cmc, err := cmc.NewCmc(cc.LibApiConfig)
140+
if err != nil {
141+
return nil, fmt.Errorf("failed to initialize CMC: %v", err)
142+
}
143+
a.cmc = cmc
144+
}
145+
146+
if len(a.cmc.Drivers) == 0 {
121147
return nil, errors.New("no drivers configured")
122148
}
123-
d := cc.Cmc.Drivers[0]
149+
d := a.cmc.Drivers[0]
124150

125151
// Get key handle from (hardware) interface
126152
tlsKeyPriv, _, err := d.GetKeyHandles(ar.IK)
@@ -140,14 +166,22 @@ func (a LibApi) fetchSignature(cc *CmcConfig, digest []byte, opts crypto.SignerO
140166

141167
func (a LibApi) fetchCerts(cc *CmcConfig) ([][]byte, error) {
142168

143-
if cc == nil || cc.Cmc == nil {
169+
if cc == nil {
144170
return nil, errors.New("internal error: cmc is nil")
145171
}
146172

147-
if len(cc.Cmc.Drivers) == 0 {
173+
if a.cmc == nil {
174+
cmc, err := cmc.NewCmc(cc.LibApiConfig)
175+
if err != nil {
176+
return nil, fmt.Errorf("failed to initialize CMC: %v", err)
177+
}
178+
a.cmc = cmc
179+
}
180+
181+
if len(a.cmc.Drivers) == 0 {
148182
return nil, errors.New("no drivers configured")
149183
}
150-
d := cc.Cmc.Drivers[0]
184+
d := a.cmc.Drivers[0]
151185

152186
certChain, err := d.GetCertChain(ar.IK)
153187
if err != nil {
@@ -162,13 +196,21 @@ func (a LibApi) fetchCerts(cc *CmcConfig) ([][]byte, error) {
162196
// Fetches the peer cache from the cmcd
163197
func (a LibApi) fetchPeerCache(cc *CmcConfig, fingerprint string) ([]string, error) {
164198

165-
if cc == nil || cc.Cmc == nil {
199+
if cc == nil {
166200
return nil, errors.New("internal error: cmc is nil")
167201
}
168202

203+
if a.cmc == nil {
204+
cmc, err := cmc.NewCmc(cc.LibApiConfig)
205+
if err != nil {
206+
return nil, fmt.Errorf("failed to initialize CMC: %v", err)
207+
}
208+
a.cmc = cmc
209+
}
210+
169211
log.Debugf("Fetching peer cache for peer: %v", fingerprint)
170212

171-
c, ok := cc.Cmc.CachedPeerMetadata[fingerprint]
213+
c, ok := a.cmc.CachedPeerMetadata[fingerprint]
172214
if !ok {
173215
log.Tracef("No data cached for peer %v", fingerprint)
174216
return nil, nil

cmcctl/http.go

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ func request(c *config) error {
6868
atls.WithCmcAddr(c.CmcAddr),
6969
atls.WithCmcApi(c.Api),
7070
atls.WithApiSerializer(c.apiSerializer),
71-
atls.WithLibApiCmc(getLibApiCmcObj(c)))
71+
atls.WithLibApiCmcConfig(&c.Config))
7272
if err != nil {
7373
return fmt.Errorf("failed to get TLS Certificate: %v", err)
7474
}
@@ -93,13 +93,13 @@ func request(c *config) error {
9393
IdleConnTimeout: 60 * time.Second,
9494
TLSClientConfig: tlsConfig,
9595

96-
Attest: c.attest,
97-
MutualTls: c.Mtls,
98-
CmcAddr: c.CmcAddr,
99-
CmcApi: c.Api,
100-
ApiSerializer: c.apiSerializer,
101-
Cmc: getLibApiCmcObj(c),
102-
CmcPolicies: c.policies,
96+
Attest: c.attest,
97+
MutualTls: c.Mtls,
98+
CmcAddr: c.CmcAddr,
99+
CmcApi: c.Api,
100+
ApiSerializer: c.apiSerializer,
101+
LibApiCmcConfig: &c.Config,
102+
CmcPolicies: c.policies,
103103
ResultCb: func(result *ar.VerificationResult) {
104104
// Publish the attestation result asynchronously if publishing address was specified and
105105
// and attestation was performed
@@ -174,7 +174,7 @@ func serve(c *config) error {
174174
atls.WithCmcAddr(c.CmcAddr),
175175
atls.WithCmcApi(c.Api),
176176
atls.WithApiSerializer(c.apiSerializer),
177-
atls.WithLibApiCmc(getLibApiCmcObj(c)))
177+
atls.WithLibApiCmcConfig(&c.Config))
178178
if err != nil {
179179
return fmt.Errorf("failed to get TLS Certificate: %v", err)
180180
}
@@ -206,13 +206,13 @@ func serve(c *config) error {
206206
Addr: c.Addr,
207207
TLSConfig: tlsConfig,
208208
},
209-
Attest: c.attest,
210-
MutualTls: c.Mtls,
211-
CmcAddr: c.CmcAddr,
212-
CmcApi: c.Api,
213-
ApiSerializer: c.apiSerializer,
214-
Cmc: getLibApiCmcObj(c),
215-
CmcPolicies: c.policies,
209+
Attest: c.attest,
210+
MutualTls: c.Mtls,
211+
CmcAddr: c.CmcAddr,
212+
CmcApi: c.Api,
213+
ApiSerializer: c.apiSerializer,
214+
LibApiCmcConfig: &c.Config,
215+
CmcPolicies: c.policies,
216216
ResultCb: func(result *ar.VerificationResult) {
217217
if c.attest == atls.Attest_Mutual || c.attest == atls.Attest_Client {
218218
// Publish the attestation result if publishing address was specified

cmcctl/libapi.go

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import (
2323

2424
"crypto/rand"
2525
"fmt"
26-
"strings"
2726

2827
"github.com/Fraunhofer-AISEC/cmc/api"
2928
"github.com/Fraunhofer-AISEC/cmc/cmc"
@@ -155,24 +154,3 @@ func (a LibApi) updateMetadata(c *config) error {
155154

156155
return nil
157156
}
158-
159-
func getLibApiCmcObj(c *config) *cmc.Cmc {
160-
if !strings.EqualFold(c.Api, "libapi") {
161-
return nil
162-
}
163-
164-
api, ok := apis["libapi"].(LibApi)
165-
if !ok {
166-
log.Fatalf("internal error: failed to retrieve libapi")
167-
}
168-
169-
if api.cmc == nil {
170-
cmc, err := cmc.NewCmc(&c.Config)
171-
if err != nil {
172-
log.Fatalf("failed to initialize CMC: %v", err)
173-
}
174-
api.cmc = cmc
175-
}
176-
177-
return api.cmc
178-
}

cmcctl/tls.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ func dial(c *config) error {
4949
atls.WithCmcAddr(c.CmcAddr),
5050
atls.WithCmcApi(c.Api),
5151
atls.WithApiSerializer(c.apiSerializer),
52-
atls.WithLibApiCmc(getLibApiCmcObj(c)))
52+
atls.WithLibApiCmcConfig(&c.Config))
5353
if err != nil {
5454
return fmt.Errorf("failed to get TLS Certificate: %w", err)
5555
}
@@ -85,7 +85,7 @@ func dial(c *config) error {
8585
go pub.PublishResultAsync(c.Publish, c.publishToken, c.ResultFile, result, wg)
8686
}
8787
}),
88-
atls.WithLibApiCmc(getLibApiCmcObj(c)))
88+
atls.WithLibApiCmcConfig(&c.Config))
8989
if err != nil {
9090
return fmt.Errorf("failed to dial server: %v", err)
9191
}
@@ -128,7 +128,7 @@ func listen(c *config) error {
128128
atls.WithCmcAddr(c.CmcAddr),
129129
atls.WithCmcApi(c.Api),
130130
atls.WithApiSerializer(c.apiSerializer),
131-
atls.WithLibApiCmc(getLibApiCmcObj(c)))
131+
atls.WithLibApiCmcConfig(&c.Config))
132132
if err != nil {
133133
return fmt.Errorf("failed to get TLS Certificate: %w", err)
134134
}
@@ -167,7 +167,7 @@ func listen(c *config) error {
167167
go pub.PublishResult(c.Publish, c.publishToken, c.ResultFile, result)
168168
}
169169
}),
170-
atls.WithLibApiCmc(getLibApiCmcObj(c)))
170+
atls.WithLibApiCmcConfig(&c.Config))
171171
if err != nil {
172172
return fmt.Errorf("failed to listen for connections: %w", err)
173173
}

0 commit comments

Comments
 (0)