| // Copyright 2021 The Fuchsia 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 e2etest |
| |
| import ( |
| "fmt" |
| "os" |
| "os/exec" |
| "path/filepath" |
| ) |
| |
| // CreateSSHKeyPairFiles creates a private-public and authorized_key files. The files are written to the following locations: |
| // |
| // {base}/.fx-ssh-path |
| // {base}/.ssh/fuchsia_ed25519 |
| // {base}/.ssh/fuchsia_ed25519.pub |
| // {base}/.ssh/fuchsia_authorized_keys |
| // |
| // This simulates in-tree ssh setup. |
| func CreateSSHKeyPairFiles(base string) error { |
| sshBase := filepath.Join(base, ".ssh") |
| if err := os.Mkdir(sshBase, 0o755); err != nil && !os.IsExist(err) { |
| return err |
| } |
| // Create private key |
| privateKey := filepath.Join(sshBase, "fuchsia_ed25519") |
| if err := removeIfExists(privateKey); err != nil { |
| return err |
| } |
| cmd := exec.Command("ssh-keygen", "-N", "", |
| "-t", "ed25519", |
| "-f", privateKey, |
| "-C", "Generated by Fuchsia automated testing") |
| if err := cmd.Run(); err != nil { |
| return fmt.Errorf("ssh-keygen for private_key failed: %w", err) |
| } |
| |
| // Create public key |
| cmd = exec.Command("ssh-keygen", "-y", "-f", privateKey) |
| output, err := cmd.Output() |
| if err != nil { |
| return fmt.Errorf("ssh-keygen for public key failed: %w", err) |
| } |
| |
| // Create fuchsia_authorized_keys |
| authKey := filepath.Join(sshBase, "fuchsia_authorized_keys") |
| if err := removeIfExists(authKey); err != nil { |
| return err |
| } |
| if err := os.WriteFile(authKey, []byte(output), 0o644); err != nil { |
| return err |
| } |
| |
| // Create .fx-ssh-path file |
| data := []byte(fmt.Sprintf("%s\n%s\n", privateKey, authKey)) |
| if err := os.WriteFile(filepath.Join(base, ".fx-ssh-path"), data, 0o644); err != nil { |
| return err |
| } |
| fmt.Printf("[test info] wrote file %s\n with content\n%s\n", filepath.Join(base, ".fx-ssh-path"), data) |
| return nil |
| } |
| |
| func removeIfExists(f string) error { |
| if err := os.Remove(f); err != nil && !os.IsNotExist(err) { |
| return err |
| } |
| return nil |
| } |