Skip to content

Commit 2e6ff3e

Browse files
authored
Merge pull request #1044 from smallstep/mariano/tpm-device
Allow the define a custom tpm device
2 parents 3df0ad1 + 7d70cea commit 2e6ff3e

File tree

2 files changed

+44
-23
lines changed

2 files changed

+44
-23
lines changed

utils/cautils/acmeutils.go

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -830,15 +830,26 @@ func (af *acmeFlow) GetCertificate() ([]*x509.Certificate, error) {
830830
// TODO: refactor this to be cleaner by passing the TPM and/or key around
831831
// instead of creating a new instance.
832832
if af.tpmSigner != nil {
833+
attestationURI := af.ctx.String("attestation-uri")
833834
tpmStorageDirectory := af.ctx.String("tpm-storage-directory")
834-
t, err := tpm.New(tpm.WithStore(tpmstorage.NewDirstore(tpmStorageDirectory)))
835+
836+
keyName, attURI, err := parseTPMAttestationURI(attestationURI)
835837
if err != nil {
836-
return nil, fmt.Errorf("failed initializing TPM: %w", err)
838+
return nil, fmt.Errorf("failed parsing --attestation-uri: %w", err)
839+
}
840+
841+
tpmOpts := []tpm.NewTPMOption{
842+
tpm.WithStore(tpmstorage.NewDirstore(tpmStorageDirectory)),
837843
}
838-
keyName, err := parseTPMAttestationURI(af.ctx.String("attestation-uri"))
844+
if device := attURI.Get("device"); device != "" {
845+
tpmOpts = append(tpmOpts, tpm.WithDeviceName(device))
846+
}
847+
848+
t, err := tpm.New(tpmOpts...)
839849
if err != nil {
840-
return nil, fmt.Errorf("failed parsing --attestation-uri: %w", err)
850+
return nil, fmt.Errorf("failed initializing TPM: %w", err)
841851
}
852+
842853
ctx := tpm.NewContext(context.Background(), t)
843854
key, err := t.GetKey(ctx, keyName)
844855
if err != nil {

utils/cautils/tpm.go

Lines changed: 29 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -37,21 +37,37 @@ import (
3737
)
3838

3939
func doTPMAttestation(clictx *cli.Context, ac *ca.ACMEClient, ch *acme.Challenge, identifier string, af *acmeFlow) error {
40+
attestationURI := clictx.String("attestation-uri")
4041
tpmStorageDirectory := clictx.String("tpm-storage-directory")
41-
t, err := tpm.New(tpm.WithStore(tpmstorage.NewDirstore(tpmStorageDirectory)))
42+
tpmAttestationCABaseURL := clictx.String("attestation-ca-url")
43+
tpmAttestationCARootFile := clictx.String("attestation-ca-root")
44+
tpmAttestationCAInsecure := clictx.Bool("attestation-ca-insecure")
45+
insecure := clictx.Bool("insecure")
46+
47+
keyName, attURI, err := parseTPMAttestationURI(attestationURI)
4248
if err != nil {
43-
return fmt.Errorf("failed initializing TPM: %w", err)
49+
return fmt.Errorf("failed parsing --attestation-uri: %w", err)
4450
}
4551

46-
tpmAttestationCABaseURL := clictx.String("attestation-ca-url")
4752
if tpmAttestationCABaseURL == "" {
48-
return errs.RequiredFlag(clictx, "attestation-ca-url")
53+
tpmAttestationCABaseURL = attURI.Get("attestation-ca-url")
54+
if tpmAttestationCABaseURL == "" {
55+
return errs.RequiredFlag(clictx, "attestation-ca-url")
56+
}
4957
}
5058

51-
tpmAttestationCARootFile := clictx.String("attestation-ca-root")
52-
tpmAttestationCAInsecure := clictx.Bool("attestation-ca-insecure")
59+
tpmOpts := []tpm.NewTPMOption{
60+
tpm.WithStore(tpmstorage.NewDirstore(tpmStorageDirectory)),
61+
}
62+
if device := attURI.Get("device"); device != "" {
63+
tpmOpts = append(tpmOpts, tpm.WithDeviceName(device))
64+
}
65+
66+
t, err := tpm.New(tpmOpts...)
67+
if err != nil {
68+
return fmt.Errorf("failed initializing TPM: %w", err)
69+
}
5370

54-
insecure := clictx.Bool("insecure")
5571
kty, crv, size, err := utils.GetKeyDetailsFromCLI(clictx, insecure, "kty", "curve", "size")
5672
if err != nil {
5773
return fmt.Errorf("failed getting key details: %w", err)
@@ -78,12 +94,6 @@ func doTPMAttestation(clictx *cli.Context, ac *ca.ACMEClient, ch *acme.Challenge
7894
return fmt.Errorf("unsupported key type: %q", kty)
7995
}
8096

81-
attestationURI := clictx.String("attestation-uri")
82-
keyName, err := parseTPMAttestationURI(attestationURI)
83-
if err != nil {
84-
return fmt.Errorf("failed parsing --attestation-uri: %w", err)
85-
}
86-
8797
ctx := tpm.NewContext(context.Background(), t)
8898
info, err := t.Info(ctx)
8999
if err != nil {
@@ -185,23 +195,23 @@ func doTPMAttestation(clictx *cli.Context, ac *ca.ACMEClient, ch *acme.Challenge
185195
}
186196

187197
// parseTPMAttestationURI parses attestation URIs for `tpmkms`.
188-
func parseTPMAttestationURI(attestationURI string) (string, error) {
198+
func parseTPMAttestationURI(attestationURI string) (string, *uri.URI, error) {
189199
if attestationURI == "" {
190-
return "", errors.New("attestation URI cannot be empty")
200+
return "", nil, errors.New("attestation URI cannot be empty")
191201
}
192202
if !strings.HasPrefix(attestationURI, "tpmkms:") {
193-
return "", fmt.Errorf("%q does not start with tpmkms", attestationURI)
203+
return "", nil, fmt.Errorf("%q does not start with tpmkms", attestationURI)
194204
}
195205
u, err := uri.Parse(attestationURI)
196206
if err != nil {
197-
return "", fmt.Errorf("failed parsing %q: %w", attestationURI, err)
207+
return "", nil, fmt.Errorf("failed parsing %q: %w", attestationURI, err)
198208
}
199209
var name string
200210
if name = u.Get("name"); name == "" {
201-
return "", fmt.Errorf("failed parsing %q: name is missing", attestationURI)
211+
return "", nil, fmt.Errorf("failed parsing %q: name is missing", attestationURI)
202212
}
203213
// TODO(hs): more properties for objects created/attested in TPM
204-
return name, nil
214+
return name, u, nil
205215
}
206216

207217
// getAK returns an AK suitable for attesting the identifier that is requested. The

0 commit comments

Comments
 (0)