mirror of
https://github.com/google/go-attestation.git
synced 2025-01-20 11:18:48 +00:00
Implement self-test mode into attest-tool. (#137)
This commit is contained in:
parent
ecf3f3087d
commit
fb4487ace5
@ -51,6 +51,86 @@ func main() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func selftestCredentialActivation(tpm *attest.TPM, ak *attest.AK) error {
|
||||||
|
eks, err := tpm.EKs()
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("EKs() failed: %v", err)
|
||||||
|
}
|
||||||
|
if len(eks) == 0 {
|
||||||
|
return errors.New("no EK present")
|
||||||
|
}
|
||||||
|
ek := eks[0].Public
|
||||||
|
|
||||||
|
// Test credential activation.
|
||||||
|
ap := attest.ActivationParameters{
|
||||||
|
TPMVersion: tpm.Version(),
|
||||||
|
EK: ek,
|
||||||
|
AK: ak.AttestationParameters(),
|
||||||
|
}
|
||||||
|
secret, ec, err := ap.Generate()
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to generate activation challenge: %v", err)
|
||||||
|
}
|
||||||
|
decryptedSecret, err := ak.ActivateCredential(tpm, *ec)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to generate activate credential: %v", err)
|
||||||
|
}
|
||||||
|
if !bytes.Equal(secret, decryptedSecret) {
|
||||||
|
return errors.New("credential activation produced incorrect secret")
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func selftestAttest(tpm *attest.TPM, ak *attest.AK) error {
|
||||||
|
// This nonce is used in generating the quote. As this is a selftest,
|
||||||
|
// its set to an arbitrary value.
|
||||||
|
nonce := []byte{1, 2, 3, 4, 5, 6, 7, 8, 1, 2, 3, 4, 5, 6, 7, 8}
|
||||||
|
|
||||||
|
pub, err := attest.ParseAKPublic(tpm.Version(), ak.AttestationParameters().Public)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to parse ak public: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := tpm.MeasurementLog(); err != nil {
|
||||||
|
return fmt.Errorf("no event log available: %v", err)
|
||||||
|
}
|
||||||
|
attestation, err := tpm.AttestPlatform(ak, nonce, nil)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to attest: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
for i, quote := range attestation.Quotes {
|
||||||
|
if err := pub.Verify(quote, attestation.PCRs, nonce); err != nil {
|
||||||
|
return fmt.Errorf("failed to verify quote[%d]: %v", i, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
el, err := attest.ParseEventLog(attestation.EventLog)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("failed to parse event log: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := el.Verify(attestation.PCRs); err != nil {
|
||||||
|
return fmt.Errorf("event log failed to verify: %v", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func selftest(tpm *attest.TPM) error {
|
||||||
|
ak, err := tpm.NewAK(nil)
|
||||||
|
if err != nil {
|
||||||
|
return fmt.Errorf("NewAK() failed: %v", err)
|
||||||
|
}
|
||||||
|
defer ak.Close(tpm)
|
||||||
|
if err := selftestCredentialActivation(tpm, ak); err != nil {
|
||||||
|
return fmt.Errorf("credential activation failed: %v", err)
|
||||||
|
}
|
||||||
|
if err := selftestAttest(tpm, ak); err != nil {
|
||||||
|
return fmt.Errorf("state attestation failed: %v", err)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
func runCommand(tpm *attest.TPM) error {
|
func runCommand(tpm *attest.TPM) error {
|
||||||
switch flag.Arg(0) {
|
switch flag.Arg(0) {
|
||||||
case "info":
|
case "info":
|
||||||
@ -142,6 +222,15 @@ func runCommand(tpm *attest.TPM) error {
|
|||||||
}
|
}
|
||||||
return json.NewEncoder(os.Stdout).Encode(dumpData)
|
return json.NewEncoder(os.Stdout).Encode(dumpData)
|
||||||
|
|
||||||
|
case "self-test":
|
||||||
|
err := selftest(tpm)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("FAIL")
|
||||||
|
return err
|
||||||
|
} else {
|
||||||
|
fmt.Println("PASS")
|
||||||
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf("no such command %q", flag.Arg(0))
|
return fmt.Errorf("no such command %q", flag.Arg(0))
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user