1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
|
package plugin
import (
"crypto/ecdh"
"io"
"sync"
"github.com/google/go-tpm/tpm2"
"github.com/google/go-tpm/tpm2/transport"
"github.com/google/go-tpm/tpm2/transport/linuxtpm"
"github.com/google/go-tpm/tpmutil"
)
var (
once sync.Once
s transport.TPMCloser
)
// TPM represents a connection to a TPM simulator.
type TPMCloser struct {
transport io.ReadWriteCloser
}
// Send implements the TPM interface.
func (t *TPMCloser) Send(input []byte) ([]byte, error) {
return tpmutil.RunCommandRaw(t.transport, input)
}
// Close implements the TPM interface.
func (t *TPMCloser) Close() error {
return t.transport.Close()
}
// Setup a NewTPMDevice
func NewTPM(tpmPath string) (transport.TPMCloser, error) {
// If we don't pass a path to OpenTPM then we have the tpmrm0 and tpm0 fallbacks
if tpmPath != "" {
return linuxtpm.Open(tpmPath)
}
return linuxtpm.Open("/dev/tpmrm0")
}
// shadow the unexported interface from go-tpm
type handle interface {
HandleValue() uint32
KnownName() *tpm2.TPM2BName
}
// Helper to flush handles
func FlushHandle(tpm transport.TPM, h handle) {
flushSrk := tpm2.FlushContext{FlushHandle: h}
flushSrk.Execute(tpm)
}
func PublicToECDH(b tpm2.TPM2BPublic) (*ecdh.PublicKey, error) {
pub, err := b.Contents()
if err != nil {
return nil, err
}
parameters, err := pub.Parameters.ECCDetail()
if err != nil {
return nil, err
}
eccdeets, err := pub.Unique.ECC()
if err != nil {
return nil, err
}
return tpm2.ECDHPub(parameters, eccdeets)
}
|