| // Copyright 2020 The Chromium OS Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| package hwsec |
| |
| import ( |
| "context" |
| "encoding/base64" |
| "io/ioutil" |
| "os" |
| |
| "chromiumos/tast/errors" |
| "chromiumos/tast/local/testexec" |
| ) |
| |
| // LocalVA implements the VA functionality by hwsec-test-va binary. |
| type LocalVA struct{} |
| |
| // NewLocalVA creates a new instance of LocalVA. |
| func NewLocalVA() *LocalVA { |
| return &LocalVA{} |
| } |
| |
| // GetDecodedVAChallenge get the VA challenge generated by hwsec-test-va. |
| func (rc *LocalVA) GetDecodedVAChallenge(ctx context.Context) ([]byte, error) { |
| out, err := testexec.CommandContext(ctx, "hwsec-test-va", "generate").Output() |
| if err != nil { |
| return nil, errors.Wrap(err, "failed to create challenge") |
| } |
| dec, err := base64.StdEncoding.DecodeString(string(out)) |
| if err != nil { |
| return nil, errors.Wrap(err, "failed to decode challenge") |
| } |
| return dec, err |
| } |
| |
| // VerifyEncodedVAChallenge asks hwsec-test-va to verify the challenge response. |
| func (rc *LocalVA) VerifyEncodedVAChallenge(ctx context.Context, signedChallenge string) error { |
| fd, err := ioutil.TempFile("", "tast-hwsec-test-va-challenge-response") |
| if err != nil { |
| return errors.Wrap(err, "error creating temp file") |
| } |
| defer os.Remove(fd.Name()) |
| defer fd.Close() |
| |
| if _, err := fd.WriteString(signedChallenge); err != nil { |
| return errors.Wrap(err, "failed to write challenge response") |
| } |
| |
| if _, err := testexec.CommandContext(ctx, "hwsec-test-va", "verify", "--input="+fd.Name()).CombinedOutput(); err != nil { |
| return errors.Wrap(err, "verification failed") |
| } |
| return err |
| } |