Skip to content

Commit 02d5961

Browse files
committed
bugfix: defer TPM close
1 parent 70caa28 commit 02d5961

File tree

8 files changed

+40
-6
lines changed

8 files changed

+40
-6
lines changed

cmd/h132/envelope/edit.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ var editCommand = &cli.Command{
7878
if err != nil {
7979
return err
8080
}
81+
defer ak.Close()
8182

8283
if err := lws.Edit(l, ak, envelopePath, envelopeBs, plaintextPath); err != nil {
8384
return err

cmd/h132/envelope/seal.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ var sealCommand = &cli.Command{
6767
if err != nil {
6868
return err
6969
}
70+
defer ak.Close()
7071

7172
if err := lws.Seal(l, ak, fileName, contents); err != nil {
7273
return err

cmd/h132/envelope/unseal.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ var unsealCommand = &cli.Command{
7070
if err != nil {
7171
return err
7272
}
73+
defer ak.Close()
7374

7475
if err := lws.Unseal(ak, envelopeFileName, bs); err != nil {
7576
return fmt.Errorf("failed to unseal file %q: %w", envelopeFileName, err)

cmd/h132/keys/access/access.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,11 @@ func AccessKey(lwsName string, k *pb.KeyImpl) (envelope.AssymmetricKey, error) {
3838
if err != nil {
3939
return nil, fmt.Errorf("failed to get TPM: %w", err)
4040
}
41-
defer tpm.Close()
41+
defer func() {
42+
if tpm != nil {
43+
tpm.Close()
44+
}
45+
}()
4246

4347
wwt := ki.WebauthnWrappedTpm
4448

@@ -73,6 +77,8 @@ func AccessKey(lwsName string, k *pb.KeyImpl) (envelope.AssymmetricKey, error) {
7377
if err != nil {
7478
return nil, err
7579
}
80+
// `bk` has taken over ownership of tpm. Don't close it here.
81+
tpm = nil
7682

7783
return bk, nil
7884

cmd/h132/keys/testcmd.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ var testCommand = &cli.Command{
4242
if err != nil {
4343
return err
4444
}
45+
defer ak.Close()
4546

4647
testSha256 := sha256.Sum256([]byte("test"))
4748
if _, err := ak.Sign(testSha256[:]); err != nil {

envelope/key.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ type AssymmetricKey interface {
1111
Public() *ecdsa.PublicKey
1212
Sign(s256digest []byte) ([]byte, error)
1313
ECDH(pub *ecdsa.PublicKey) ([]byte, error)
14+
io.Closer
1415
}
1516

1617
type LocalPrivateKey struct {
@@ -49,3 +50,7 @@ func (k *LocalPrivateKey) ECDH(pub *ecdsa.PublicKey) ([]byte, error) {
4950

5051
return privDH.ECDH(pubDH)
5152
}
53+
54+
func (k *LocalPrivateKey) Close() error {
55+
return nil
56+
}

keys/webauthnwrappedtpm/key.go

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,14 +105,29 @@ func derivePassword(prf, salt []byte, tpmKeyHandle tpm2.TPMHandle) []byte {
105105
return tpmPassword
106106
}
107107

108+
func nopCloser(tpm transport.TPM) transport.TPMCloser {
109+
return nopCloserT{tpm}
110+
}
111+
112+
type nopCloserT struct {
113+
transport.TPM
114+
}
115+
116+
func (nopCloserT) Close() error { return nil }
117+
118+
func (t nopCloserT) Send(input []byte) ([]byte, error) {
119+
return t.TPM.Send(input)
120+
}
121+
108122
func (wk *WebAuthnWrappedTPMKey) Provision(tpm transport.TPM, prf []byte) error {
109123
tpmPassword := derivePassword(prf, wk.HkdfSalt, wk.TpmKeyHandle)
110124

111125
cfg := h132_tpm2.BackedP256KeyConfig{
112126
KeyHandle: wk.TpmKeyHandle,
113127
Password: tpmPassword,
114128
}
115-
bk, err := h132_tpm2.ProvisionBackedP256Key(cfg, tpm)
129+
130+
bk, err := h132_tpm2.ProvisionBackedP256Key(cfg, nopCloser(tpm))
116131
if err != nil {
117132
return fmt.Errorf("failed to provision backed key: %w", err)
118133
}
@@ -172,7 +187,7 @@ func (wk *WebAuthnWrappedTPMKey) SetImplProto(p *pb.KeyImpl) error {
172187
return nil
173188
}
174189

175-
func (wk *WebAuthnWrappedTPMKey) Unwrap(tpm transport.TPM, prf []byte) (*h132_tpm2.BackedP256Key, error) {
190+
func (wk *WebAuthnWrappedTPMKey) Unwrap(tpm transport.TPMCloser, prf []byte) (*h132_tpm2.BackedP256Key, error) {
176191
tpmPassword := derivePassword(prf, wk.HkdfSalt, wk.TpmKeyHandle)
177192
cfg := h132_tpm2.BackedP256KeyConfig{
178193
KeyHandle: wk.TpmKeyHandle,

tpm2/backedkey.go

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,13 @@ type BackedP256KeyConfig struct {
2020

2121
type BackedP256Key struct {
2222
cfg BackedP256KeyConfig
23-
t transport.TPM
23+
t transport.TPMCloser
2424

2525
name tpm2.TPM2BName
2626
public *ecdsa.PublicKey
2727
}
2828

29-
func ProvisionBackedP256Key(cfg BackedP256KeyConfig, t transport.TPM) (*BackedP256Key, error) {
29+
func ProvisionBackedP256Key(cfg BackedP256KeyConfig, t transport.TPMCloser) (*BackedP256Key, error) {
3030
k := &BackedP256Key{
3131
cfg: cfg,
3232
t: t,
@@ -106,7 +106,7 @@ func ProvisionBackedP256Key(cfg BackedP256KeyConfig, t transport.TPM) (*BackedP2
106106
return k, nil
107107
}
108108

109-
func LoadBackedP256Key(cfg BackedP256KeyConfig, t transport.TPM) (*BackedP256Key, error) {
109+
func LoadBackedP256Key(cfg BackedP256KeyConfig, t transport.TPMCloser) (*BackedP256Key, error) {
110110
k := &BackedP256Key{
111111
cfg: cfg,
112112
t: t,
@@ -281,3 +281,7 @@ func (k *BackedP256Key) smokeTest() error {
281281

282282
return nil
283283
}
284+
285+
func (k *BackedP256Key) Close() error {
286+
return k.t.Close()
287+
}

0 commit comments

Comments
 (0)