mirror of
https://github.com/optim-enterprises-bv/vault.git
synced 2025-11-02 19:47:54 +00:00
Multi value test seal (#2281)
This commit is contained in:
@@ -58,7 +58,7 @@ Developing Vault
|
|||||||
|
|
||||||
If you wish to work on Vault itself or any of its built-in systems,
|
If you wish to work on Vault itself or any of its built-in systems,
|
||||||
you'll first need [Go](https://www.golang.org) installed on your
|
you'll first need [Go](https://www.golang.org) installed on your
|
||||||
machine (version 1.7+ is *required*).
|
machine (version 1.8+ is *required*).
|
||||||
|
|
||||||
For local dev first make sure Go is properly installed, including setting up a
|
For local dev first make sure Go is properly installed, including setting up a
|
||||||
[GOPATH](https://golang.org/doc/code.html#GOPATH). Next, clone this repository
|
[GOPATH](https://golang.org/doc/code.html#GOPATH). Next, clone this repository
|
||||||
|
|||||||
@@ -18,13 +18,12 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func TestGenerateRoot_Cancel(t *testing.T) {
|
func TestGenerateRoot_Cancel(t *testing.T) {
|
||||||
core, key, _ := vault.TestCoreUnsealed(t)
|
core, _, _ := vault.TestCoreUnsealed(t)
|
||||||
ln, addr := http.TestServer(t, core)
|
ln, addr := http.TestServer(t, core)
|
||||||
defer ln.Close()
|
defer ln.Close()
|
||||||
|
|
||||||
ui := new(cli.MockUi)
|
ui := new(cli.MockUi)
|
||||||
c := &GenerateRootCommand{
|
c := &GenerateRootCommand{
|
||||||
Key: hex.EncodeToString(key),
|
|
||||||
Meta: meta.Meta{
|
Meta: meta.Meta{
|
||||||
Ui: ui,
|
Ui: ui,
|
||||||
},
|
},
|
||||||
@@ -56,13 +55,12 @@ func TestGenerateRoot_Cancel(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestGenerateRoot_status(t *testing.T) {
|
func TestGenerateRoot_status(t *testing.T) {
|
||||||
core, key, _ := vault.TestCoreUnsealed(t)
|
core, _, _ := vault.TestCoreUnsealed(t)
|
||||||
ln, addr := http.TestServer(t, core)
|
ln, addr := http.TestServer(t, core)
|
||||||
defer ln.Close()
|
defer ln.Close()
|
||||||
|
|
||||||
ui := new(cli.MockUi)
|
ui := new(cli.MockUi)
|
||||||
c := &GenerateRootCommand{
|
c := &GenerateRootCommand{
|
||||||
Key: hex.EncodeToString(key),
|
|
||||||
Meta: meta.Meta{
|
Meta: meta.Meta{
|
||||||
Ui: ui,
|
Ui: ui,
|
||||||
},
|
},
|
||||||
@@ -90,13 +88,12 @@ func TestGenerateRoot_status(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestGenerateRoot_OTP(t *testing.T) {
|
func TestGenerateRoot_OTP(t *testing.T) {
|
||||||
core, ts, key, _ := vault.TestCoreWithTokenStore(t)
|
core, ts, keys, _ := vault.TestCoreWithTokenStore(t)
|
||||||
ln, addr := http.TestServer(t, core)
|
ln, addr := http.TestServer(t, core)
|
||||||
defer ln.Close()
|
defer ln.Close()
|
||||||
|
|
||||||
ui := new(cli.MockUi)
|
ui := new(cli.MockUi)
|
||||||
c := &GenerateRootCommand{
|
c := &GenerateRootCommand{
|
||||||
Key: hex.EncodeToString(key),
|
|
||||||
Meta: meta.Meta{
|
Meta: meta.Meta{
|
||||||
Ui: ui,
|
Ui: ui,
|
||||||
},
|
},
|
||||||
@@ -124,14 +121,24 @@ func TestGenerateRoot_OTP(t *testing.T) {
|
|||||||
t.Fatalf("err: %v", err)
|
t.Fatalf("err: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
c.Nonce = config.Nonce
|
for _, key := range keys {
|
||||||
|
ui = new(cli.MockUi)
|
||||||
|
c = &GenerateRootCommand{
|
||||||
|
Key: hex.EncodeToString(key),
|
||||||
|
Meta: meta.Meta{
|
||||||
|
Ui: ui,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
// Provide the key
|
c.Nonce = config.Nonce
|
||||||
args = []string{
|
|
||||||
"-address", addr,
|
// Provide the key
|
||||||
}
|
args = []string{
|
||||||
if code := c.Run(args); code != 0 {
|
"-address", addr,
|
||||||
t.Fatalf("bad: %d\n\n%s", code, ui.ErrorWriter.String())
|
}
|
||||||
|
if code := c.Run(args); code != 0 {
|
||||||
|
t.Fatalf("bad: %d\n\n%s", code, ui.ErrorWriter.String())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
beforeNAfter := strings.Split(ui.OutputWriter.String(), "Encoded root token: ")
|
beforeNAfter := strings.Split(ui.OutputWriter.String(), "Encoded root token: ")
|
||||||
@@ -195,13 +202,12 @@ func TestGenerateRoot_OTP(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestGenerateRoot_PGP(t *testing.T) {
|
func TestGenerateRoot_PGP(t *testing.T) {
|
||||||
core, ts, key, _ := vault.TestCoreWithTokenStore(t)
|
core, ts, keys, _ := vault.TestCoreWithTokenStore(t)
|
||||||
ln, addr := http.TestServer(t, core)
|
ln, addr := http.TestServer(t, core)
|
||||||
defer ln.Close()
|
defer ln.Close()
|
||||||
|
|
||||||
ui := new(cli.MockUi)
|
ui := new(cli.MockUi)
|
||||||
c := &GenerateRootCommand{
|
c := &GenerateRootCommand{
|
||||||
Key: hex.EncodeToString(key),
|
|
||||||
Meta: meta.Meta{
|
Meta: meta.Meta{
|
||||||
Ui: ui,
|
Ui: ui,
|
||||||
},
|
},
|
||||||
@@ -228,14 +234,23 @@ func TestGenerateRoot_PGP(t *testing.T) {
|
|||||||
t.Fatalf("err: %v", err)
|
t.Fatalf("err: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
c.Nonce = config.Nonce
|
for _, key := range keys {
|
||||||
|
c = &GenerateRootCommand{
|
||||||
|
Key: hex.EncodeToString(key),
|
||||||
|
Meta: meta.Meta{
|
||||||
|
Ui: ui,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
// Provide the key
|
c.Nonce = config.Nonce
|
||||||
args = []string{
|
|
||||||
"-address", addr,
|
// Provide the key
|
||||||
}
|
args = []string{
|
||||||
if code := c.Run(args); code != 0 {
|
"-address", addr,
|
||||||
t.Fatalf("bad: %d\n\n%s", code, ui.ErrorWriter.String())
|
}
|
||||||
|
if code := c.Run(args); code != 0 {
|
||||||
|
t.Fatalf("bad: %d\n\n%s", code, ui.ErrorWriter.String())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
beforeNAfter := strings.Split(ui.OutputWriter.String(), "Encoded root token: ")
|
beforeNAfter := strings.Split(ui.OutputWriter.String(), "Encoded root token: ")
|
||||||
|
|||||||
@@ -16,22 +16,33 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func TestRekey(t *testing.T) {
|
func TestRekey(t *testing.T) {
|
||||||
core, key, _ := vault.TestCoreUnsealed(t)
|
core, keys, _ := vault.TestCoreUnsealed(t)
|
||||||
ln, addr := http.TestServer(t, core)
|
ln, addr := http.TestServer(t, core)
|
||||||
defer ln.Close()
|
defer ln.Close()
|
||||||
|
|
||||||
ui := new(cli.MockUi)
|
ui := new(cli.MockUi)
|
||||||
c := &RekeyCommand{
|
|
||||||
Key: hex.EncodeToString(key),
|
|
||||||
RecoveryKey: false,
|
|
||||||
Meta: meta.Meta{
|
|
||||||
Ui: ui,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
args := []string{"-address", addr}
|
for i, key := range keys {
|
||||||
if code := c.Run(args); code != 0 {
|
c := &RekeyCommand{
|
||||||
t.Fatalf("bad: %d\n\n%s", code, ui.ErrorWriter.String())
|
Key: hex.EncodeToString(key),
|
||||||
|
RecoveryKey: false,
|
||||||
|
Meta: meta.Meta{
|
||||||
|
Ui: ui,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
if i > 0 {
|
||||||
|
conf, err := core.RekeyConfig(false)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
c.Nonce = conf.Nonce
|
||||||
|
}
|
||||||
|
|
||||||
|
args := []string{"-address", addr}
|
||||||
|
if code := c.Run(args); code != 0 {
|
||||||
|
t.Fatalf("bad: %d\n\n%s", code, ui.ErrorWriter.String())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
config, err := core.SealAccess().BarrierConfig()
|
config, err := core.SealAccess().BarrierConfig()
|
||||||
@@ -44,21 +55,32 @@ func TestRekey(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestRekey_arg(t *testing.T) {
|
func TestRekey_arg(t *testing.T) {
|
||||||
core, key, _ := vault.TestCoreUnsealed(t)
|
core, keys, _ := vault.TestCoreUnsealed(t)
|
||||||
ln, addr := http.TestServer(t, core)
|
ln, addr := http.TestServer(t, core)
|
||||||
defer ln.Close()
|
defer ln.Close()
|
||||||
|
|
||||||
ui := new(cli.MockUi)
|
ui := new(cli.MockUi)
|
||||||
c := &RekeyCommand{
|
|
||||||
RecoveryKey: false,
|
|
||||||
Meta: meta.Meta{
|
|
||||||
Ui: ui,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
args := []string{"-address", addr, hex.EncodeToString(key)}
|
for i, key := range keys {
|
||||||
if code := c.Run(args); code != 0 {
|
c := &RekeyCommand{
|
||||||
t.Fatalf("bad: %d\n\n%s", code, ui.ErrorWriter.String())
|
RecoveryKey: false,
|
||||||
|
Meta: meta.Meta{
|
||||||
|
Ui: ui,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
if i > 0 {
|
||||||
|
conf, err := core.RekeyConfig(false)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
c.Nonce = conf.Nonce
|
||||||
|
}
|
||||||
|
|
||||||
|
args := []string{"-address", addr, hex.EncodeToString(key)}
|
||||||
|
if code := c.Run(args); code != 0 {
|
||||||
|
t.Fatalf("bad: %d\n\n%s", code, ui.ErrorWriter.String())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
config, err := core.SealAccess().BarrierConfig()
|
config, err := core.SealAccess().BarrierConfig()
|
||||||
@@ -71,13 +93,13 @@ func TestRekey_arg(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestRekey_init(t *testing.T) {
|
func TestRekey_init(t *testing.T) {
|
||||||
core, key, _ := vault.TestCoreUnsealed(t)
|
core, _, _ := vault.TestCoreUnsealed(t)
|
||||||
ln, addr := http.TestServer(t, core)
|
ln, addr := http.TestServer(t, core)
|
||||||
defer ln.Close()
|
defer ln.Close()
|
||||||
|
|
||||||
ui := new(cli.MockUi)
|
ui := new(cli.MockUi)
|
||||||
|
|
||||||
c := &RekeyCommand{
|
c := &RekeyCommand{
|
||||||
Key: hex.EncodeToString(key),
|
|
||||||
Meta: meta.Meta{
|
Meta: meta.Meta{
|
||||||
Ui: ui,
|
Ui: ui,
|
||||||
},
|
},
|
||||||
@@ -106,13 +128,13 @@ func TestRekey_init(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestRekey_cancel(t *testing.T) {
|
func TestRekey_cancel(t *testing.T) {
|
||||||
core, key, _ := vault.TestCoreUnsealed(t)
|
core, keys, _ := vault.TestCoreUnsealed(t)
|
||||||
ln, addr := http.TestServer(t, core)
|
ln, addr := http.TestServer(t, core)
|
||||||
defer ln.Close()
|
defer ln.Close()
|
||||||
|
|
||||||
ui := new(cli.MockUi)
|
ui := new(cli.MockUi)
|
||||||
c := &RekeyCommand{
|
c := &RekeyCommand{
|
||||||
Key: hex.EncodeToString(key),
|
Key: hex.EncodeToString(keys[0]),
|
||||||
Meta: meta.Meta{
|
Meta: meta.Meta{
|
||||||
Ui: ui,
|
Ui: ui,
|
||||||
},
|
},
|
||||||
@@ -138,13 +160,13 @@ func TestRekey_cancel(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestRekey_status(t *testing.T) {
|
func TestRekey_status(t *testing.T) {
|
||||||
core, key, _ := vault.TestCoreUnsealed(t)
|
core, keys, _ := vault.TestCoreUnsealed(t)
|
||||||
ln, addr := http.TestServer(t, core)
|
ln, addr := http.TestServer(t, core)
|
||||||
defer ln.Close()
|
defer ln.Close()
|
||||||
|
|
||||||
ui := new(cli.MockUi)
|
ui := new(cli.MockUi)
|
||||||
c := &RekeyCommand{
|
c := &RekeyCommand{
|
||||||
Key: hex.EncodeToString(key),
|
Key: hex.EncodeToString(keys[0]),
|
||||||
Meta: meta.Meta{
|
Meta: meta.Meta{
|
||||||
Ui: ui,
|
Ui: ui,
|
||||||
},
|
},
|
||||||
@@ -166,7 +188,7 @@ func TestRekey_status(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestRekey_init_pgp(t *testing.T) {
|
func TestRekey_init_pgp(t *testing.T) {
|
||||||
core, key, token := vault.TestCoreUnsealed(t)
|
core, keys, token := vault.TestCoreUnsealed(t)
|
||||||
ln, addr := http.TestServer(t, core)
|
ln, addr := http.TestServer(t, core)
|
||||||
defer ln.Close()
|
defer ln.Close()
|
||||||
|
|
||||||
@@ -184,7 +206,6 @@ func TestRekey_init_pgp(t *testing.T) {
|
|||||||
|
|
||||||
ui := new(cli.MockUi)
|
ui := new(cli.MockUi)
|
||||||
c := &RekeyCommand{
|
c := &RekeyCommand{
|
||||||
Key: hex.EncodeToString(key),
|
|
||||||
Meta: meta.Meta{
|
Meta: meta.Meta{
|
||||||
Ui: ui,
|
Ui: ui,
|
||||||
},
|
},
|
||||||
@@ -220,13 +241,22 @@ func TestRekey_init_pgp(t *testing.T) {
|
|||||||
t.Fatal("should rekey")
|
t.Fatal("should rekey")
|
||||||
}
|
}
|
||||||
|
|
||||||
c.Nonce = config.Nonce
|
for _, key := range keys {
|
||||||
|
c = &RekeyCommand{
|
||||||
|
Key: hex.EncodeToString(key),
|
||||||
|
Meta: meta.Meta{
|
||||||
|
Ui: ui,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
args = []string{
|
c.Nonce = config.Nonce
|
||||||
"-address", addr,
|
|
||||||
}
|
args = []string{
|
||||||
if code := c.Run(args); code != 0 {
|
"-address", addr,
|
||||||
t.Fatalf("bad: %d\n\n%s", code, ui.ErrorWriter.String())
|
}
|
||||||
|
if code := c.Run(args); code != 0 {
|
||||||
|
t.Fatalf("bad: %d\n\n%s", code, ui.ErrorWriter.String())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
type backupStruct struct {
|
type backupStruct struct {
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ func TestStatus(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
core := vault.TestCore(t)
|
core := vault.TestCore(t)
|
||||||
key, _ := vault.TestCoreInit(t, core)
|
keys, _ := vault.TestCoreInit(t, core)
|
||||||
ln, addr := http.TestServer(t, core)
|
ln, addr := http.TestServer(t, core)
|
||||||
defer ln.Close()
|
defer ln.Close()
|
||||||
|
|
||||||
@@ -27,8 +27,10 @@ func TestStatus(t *testing.T) {
|
|||||||
t.Fatalf("bad: %d\n\n%s", code, ui.ErrorWriter.String())
|
t.Fatalf("bad: %d\n\n%s", code, ui.ErrorWriter.String())
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err := core.Unseal(key); err != nil {
|
for _, key := range keys {
|
||||||
t.Fatalf("err: %s", err)
|
if _, err := core.Unseal(key); err != nil {
|
||||||
|
t.Fatalf("err: %s", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if code := c.Run(args); code != 0 {
|
if code := c.Run(args); code != 0 {
|
||||||
|
|||||||
@@ -12,21 +12,24 @@ import (
|
|||||||
|
|
||||||
func TestUnseal(t *testing.T) {
|
func TestUnseal(t *testing.T) {
|
||||||
core := vault.TestCore(t)
|
core := vault.TestCore(t)
|
||||||
key, _ := vault.TestCoreInit(t, core)
|
keys, _ := vault.TestCoreInit(t, core)
|
||||||
ln, addr := http.TestServer(t, core)
|
ln, addr := http.TestServer(t, core)
|
||||||
defer ln.Close()
|
defer ln.Close()
|
||||||
|
|
||||||
ui := new(cli.MockUi)
|
ui := new(cli.MockUi)
|
||||||
c := &UnsealCommand{
|
|
||||||
Key: hex.EncodeToString(key),
|
|
||||||
Meta: meta.Meta{
|
|
||||||
Ui: ui,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
args := []string{"-address", addr}
|
for _, key := range keys {
|
||||||
if code := c.Run(args); code != 0 {
|
c := &UnsealCommand{
|
||||||
t.Fatalf("bad: %d\n\n%s", code, ui.ErrorWriter.String())
|
Key: hex.EncodeToString(key),
|
||||||
|
Meta: meta.Meta{
|
||||||
|
Ui: ui,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
args := []string{"-address", addr}
|
||||||
|
if code := c.Run(args); code != 0 {
|
||||||
|
t.Fatalf("bad: %d\n\n%s", code, ui.ErrorWriter.String())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sealed, err := core.Sealed()
|
sealed, err := core.Sealed()
|
||||||
@@ -40,20 +43,23 @@ func TestUnseal(t *testing.T) {
|
|||||||
|
|
||||||
func TestUnseal_arg(t *testing.T) {
|
func TestUnseal_arg(t *testing.T) {
|
||||||
core := vault.TestCore(t)
|
core := vault.TestCore(t)
|
||||||
key, _ := vault.TestCoreInit(t, core)
|
keys, _ := vault.TestCoreInit(t, core)
|
||||||
ln, addr := http.TestServer(t, core)
|
ln, addr := http.TestServer(t, core)
|
||||||
defer ln.Close()
|
defer ln.Close()
|
||||||
|
|
||||||
ui := new(cli.MockUi)
|
ui := new(cli.MockUi)
|
||||||
c := &UnsealCommand{
|
|
||||||
Meta: meta.Meta{
|
|
||||||
Ui: ui,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
args := []string{"-address", addr, hex.EncodeToString(key)}
|
for _, key := range keys {
|
||||||
if code := c.Run(args); code != 0 {
|
c := &UnsealCommand{
|
||||||
t.Fatalf("bad: %d\n\n%s", code, ui.ErrorWriter.String())
|
Meta: meta.Meta{
|
||||||
|
Ui: ui,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
args := []string{"-address", addr, hex.EncodeToString(key)}
|
||||||
|
if code := c.Run(args); code != 0 {
|
||||||
|
t.Fatalf("bad: %d\n\n%s", code, ui.ErrorWriter.String())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sealed, err := core.Sealed()
|
sealed, err := core.Sealed()
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@@ -15,22 +16,32 @@ import (
|
|||||||
|
|
||||||
func testHttpGet(t *testing.T, token string, addr string) *http.Response {
|
func testHttpGet(t *testing.T, token string, addr string) *http.Response {
|
||||||
t.Logf("Token is %s", token)
|
t.Logf("Token is %s", token)
|
||||||
return testHttpData(t, "GET", token, addr, nil)
|
return testHttpData(t, "GET", token, addr, nil, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
func testHttpDelete(t *testing.T, token string, addr string) *http.Response {
|
func testHttpDelete(t *testing.T, token string, addr string) *http.Response {
|
||||||
return testHttpData(t, "DELETE", token, addr, nil)
|
return testHttpData(t, "DELETE", token, addr, nil, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Go 1.8+ clients redirect automatically which breaks our 307 standby testing
|
||||||
|
func testHttpDeleteDisableRedirect(t *testing.T, token string, addr string) *http.Response {
|
||||||
|
return testHttpData(t, "DELETE", token, addr, nil, true)
|
||||||
}
|
}
|
||||||
|
|
||||||
func testHttpPost(t *testing.T, token string, addr string, body interface{}) *http.Response {
|
func testHttpPost(t *testing.T, token string, addr string, body interface{}) *http.Response {
|
||||||
return testHttpData(t, "POST", token, addr, body)
|
return testHttpData(t, "POST", token, addr, body, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
func testHttpPut(t *testing.T, token string, addr string, body interface{}) *http.Response {
|
func testHttpPut(t *testing.T, token string, addr string, body interface{}) *http.Response {
|
||||||
return testHttpData(t, "PUT", token, addr, body)
|
return testHttpData(t, "PUT", token, addr, body, false)
|
||||||
}
|
}
|
||||||
|
|
||||||
func testHttpData(t *testing.T, method string, token string, addr string, body interface{}) *http.Response {
|
// Go 1.8+ clients redirect automatically which breaks our 307 standby testing
|
||||||
|
func testHttpPutDisableRedirect(t *testing.T, token string, addr string, body interface{}) *http.Response {
|
||||||
|
return testHttpData(t, "PUT", token, addr, body, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testHttpData(t *testing.T, method string, token string, addr string, body interface{}, disableRedirect bool) *http.Response {
|
||||||
bodyReader := new(bytes.Buffer)
|
bodyReader := new(bytes.Buffer)
|
||||||
if body != nil {
|
if body != nil {
|
||||||
enc := json.NewEncoder(bodyReader)
|
enc := json.NewEncoder(bodyReader)
|
||||||
@@ -57,6 +68,9 @@ func testHttpData(t *testing.T, method string, token string, addr string, body i
|
|||||||
defaultRedirectLimit := 30
|
defaultRedirectLimit := 30
|
||||||
|
|
||||||
client.CheckRedirect = func(req *http.Request, via []*http.Request) error {
|
client.CheckRedirect = func(req *http.Request, via []*http.Request) error {
|
||||||
|
if disableRedirect {
|
||||||
|
return fmt.Errorf("checkRedirect disabled for test")
|
||||||
|
}
|
||||||
if len(via) > defaultRedirectLimit {
|
if len(via) > defaultRedirectLimit {
|
||||||
return fmt.Errorf("%d consecutive requests(redirects)", len(via))
|
return fmt.Errorf("%d consecutive requests(redirects)", len(via))
|
||||||
}
|
}
|
||||||
@@ -72,7 +86,7 @@ func testHttpData(t *testing.T, method string, token string, addr string, body i
|
|||||||
}
|
}
|
||||||
|
|
||||||
resp, err := client.Do(req)
|
resp, err := client.Do(req)
|
||||||
if err != nil {
|
if err != nil && !strings.Contains(err.Error(), "checkRedirect disabled for test") {
|
||||||
t.Fatalf("err: %s", err)
|
t.Fatalf("err: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -92,9 +92,11 @@ func TestLogical_StandbyRedirect(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("err: %v", err)
|
t.Fatalf("err: %v", err)
|
||||||
}
|
}
|
||||||
key, root := vault.TestCoreInit(t, core1)
|
keys, root := vault.TestCoreInit(t, core1)
|
||||||
if _, err := core1.Unseal(vault.TestKeyCopy(key)); err != nil {
|
for _, key := range keys {
|
||||||
t.Fatalf("unseal err: %s", err)
|
if _, err := core1.Unseal(vault.TestKeyCopy(key)); err != nil {
|
||||||
|
t.Fatalf("unseal err: %s", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Attempt to fix raciness in this test by giving the first core a chance
|
// Attempt to fix raciness in this test by giving the first core a chance
|
||||||
@@ -112,8 +114,10 @@ func TestLogical_StandbyRedirect(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("err: %v", err)
|
t.Fatalf("err: %v", err)
|
||||||
}
|
}
|
||||||
if _, err := core2.Unseal(vault.TestKeyCopy(key)); err != nil {
|
for _, key := range keys {
|
||||||
t.Fatalf("unseal err: %s", err)
|
if _, err := core2.Unseal(vault.TestKeyCopy(key)); err != nil {
|
||||||
|
t.Fatalf("unseal err: %s", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TestServerWithListener(t, ln1, addr1, core1)
|
TestServerWithListener(t, ln1, addr1, core1)
|
||||||
@@ -121,10 +125,12 @@ func TestLogical_StandbyRedirect(t *testing.T) {
|
|||||||
TestServerAuth(t, addr1, root)
|
TestServerAuth(t, addr1, root)
|
||||||
|
|
||||||
// WRITE to STANDBY
|
// WRITE to STANDBY
|
||||||
resp := testHttpPut(t, root, addr2+"/v1/secret/foo", map[string]interface{}{
|
resp := testHttpPutDisableRedirect(t, root, addr2+"/v1/secret/foo", map[string]interface{}{
|
||||||
"data": "bar",
|
"data": "bar",
|
||||||
})
|
})
|
||||||
|
logger.Trace("307 test one starting")
|
||||||
testResponseStatus(t, resp, 307)
|
testResponseStatus(t, resp, 307)
|
||||||
|
logger.Trace("307 test one stopping")
|
||||||
|
|
||||||
//// READ to standby
|
//// READ to standby
|
||||||
resp = testHttpGet(t, root, addr2+"/v1/auth/token/lookup-self")
|
resp = testHttpGet(t, root, addr2+"/v1/auth/token/lookup-self")
|
||||||
@@ -163,8 +169,10 @@ func TestLogical_StandbyRedirect(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//// DELETE to standby
|
//// DELETE to standby
|
||||||
resp = testHttpDelete(t, root, addr2+"/v1/secret/foo")
|
resp = testHttpDeleteDisableRedirect(t, root, addr2+"/v1/secret/foo")
|
||||||
|
logger.Trace("307 test two starting")
|
||||||
testResponseStatus(t, resp, 307)
|
testResponseStatus(t, resp, 307)
|
||||||
|
logger.Trace("307 test two stopping")
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestLogical_CreateToken(t *testing.T) {
|
func TestLogical_CreateToken(t *testing.T) {
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import (
|
|||||||
"encoding/base64"
|
"encoding/base64"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"reflect"
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
@@ -29,7 +30,7 @@ func TestSysGenerateRootAttempt_Status(t *testing.T) {
|
|||||||
expected := map[string]interface{}{
|
expected := map[string]interface{}{
|
||||||
"started": false,
|
"started": false,
|
||||||
"progress": json.Number("0"),
|
"progress": json.Number("0"),
|
||||||
"required": json.Number("1"),
|
"required": json.Number("3"),
|
||||||
"complete": false,
|
"complete": false,
|
||||||
"encoded_root_token": "",
|
"encoded_root_token": "",
|
||||||
"pgp_fingerprint": "",
|
"pgp_fingerprint": "",
|
||||||
@@ -63,7 +64,7 @@ func TestSysGenerateRootAttempt_Setup_OTP(t *testing.T) {
|
|||||||
expected := map[string]interface{}{
|
expected := map[string]interface{}{
|
||||||
"started": true,
|
"started": true,
|
||||||
"progress": json.Number("0"),
|
"progress": json.Number("0"),
|
||||||
"required": json.Number("1"),
|
"required": json.Number("3"),
|
||||||
"complete": false,
|
"complete": false,
|
||||||
"encoded_root_token": "",
|
"encoded_root_token": "",
|
||||||
"pgp_fingerprint": "",
|
"pgp_fingerprint": "",
|
||||||
@@ -84,7 +85,7 @@ func TestSysGenerateRootAttempt_Setup_OTP(t *testing.T) {
|
|||||||
expected = map[string]interface{}{
|
expected = map[string]interface{}{
|
||||||
"started": true,
|
"started": true,
|
||||||
"progress": json.Number("0"),
|
"progress": json.Number("0"),
|
||||||
"required": json.Number("1"),
|
"required": json.Number("3"),
|
||||||
"complete": false,
|
"complete": false,
|
||||||
"encoded_root_token": "",
|
"encoded_root_token": "",
|
||||||
"pgp_fingerprint": "",
|
"pgp_fingerprint": "",
|
||||||
@@ -117,7 +118,7 @@ func TestSysGenerateRootAttempt_Setup_PGP(t *testing.T) {
|
|||||||
expected := map[string]interface{}{
|
expected := map[string]interface{}{
|
||||||
"started": true,
|
"started": true,
|
||||||
"progress": json.Number("0"),
|
"progress": json.Number("0"),
|
||||||
"required": json.Number("1"),
|
"required": json.Number("3"),
|
||||||
"complete": false,
|
"complete": false,
|
||||||
"encoded_root_token": "",
|
"encoded_root_token": "",
|
||||||
"pgp_fingerprint": "816938b8a29146fbe245dd29e7cbaf8e011db793",
|
"pgp_fingerprint": "816938b8a29146fbe245dd29e7cbaf8e011db793",
|
||||||
@@ -153,7 +154,7 @@ func TestSysGenerateRootAttempt_Cancel(t *testing.T) {
|
|||||||
expected := map[string]interface{}{
|
expected := map[string]interface{}{
|
||||||
"started": true,
|
"started": true,
|
||||||
"progress": json.Number("0"),
|
"progress": json.Number("0"),
|
||||||
"required": json.Number("1"),
|
"required": json.Number("3"),
|
||||||
"complete": false,
|
"complete": false,
|
||||||
"encoded_root_token": "",
|
"encoded_root_token": "",
|
||||||
"pgp_fingerprint": "",
|
"pgp_fingerprint": "",
|
||||||
@@ -180,7 +181,7 @@ func TestSysGenerateRootAttempt_Cancel(t *testing.T) {
|
|||||||
expected = map[string]interface{}{
|
expected = map[string]interface{}{
|
||||||
"started": false,
|
"started": false,
|
||||||
"progress": json.Number("0"),
|
"progress": json.Number("0"),
|
||||||
"required": json.Number("1"),
|
"required": json.Number("3"),
|
||||||
"complete": false,
|
"complete": false,
|
||||||
"encoded_root_token": "",
|
"encoded_root_token": "",
|
||||||
"pgp_fingerprint": "",
|
"pgp_fingerprint": "",
|
||||||
@@ -239,7 +240,7 @@ func TestSysGenerateRoot_ReAttemptUpdate(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestSysGenerateRoot_Update_OTP(t *testing.T) {
|
func TestSysGenerateRoot_Update_OTP(t *testing.T) {
|
||||||
core, master, token := vault.TestCoreUnsealed(t)
|
core, keys, token := vault.TestCoreUnsealed(t)
|
||||||
ln, addr := TestServer(t, core)
|
ln, addr := TestServer(t, core)
|
||||||
defer ln.Close()
|
defer ln.Close()
|
||||||
TestServerAuth(t, addr, token)
|
TestServerAuth(t, addr, token)
|
||||||
@@ -257,22 +258,29 @@ func TestSysGenerateRoot_Update_OTP(t *testing.T) {
|
|||||||
testResponseStatus(t, resp, 200)
|
testResponseStatus(t, resp, 200)
|
||||||
testResponseBody(t, resp, &rootGenerationStatus)
|
testResponseBody(t, resp, &rootGenerationStatus)
|
||||||
|
|
||||||
resp = testHttpPut(t, token, addr+"/v1/sys/generate-root/update", map[string]interface{}{
|
|
||||||
"nonce": rootGenerationStatus["nonce"].(string),
|
|
||||||
"key": hex.EncodeToString(master),
|
|
||||||
})
|
|
||||||
|
|
||||||
var actual map[string]interface{}
|
var actual map[string]interface{}
|
||||||
expected := map[string]interface{}{
|
var expected map[string]interface{}
|
||||||
"complete": true,
|
for i, key := range keys {
|
||||||
"nonce": rootGenerationStatus["nonce"].(string),
|
resp = testHttpPut(t, token, addr+"/v1/sys/generate-root/update", map[string]interface{}{
|
||||||
"progress": json.Number("1"),
|
"nonce": rootGenerationStatus["nonce"].(string),
|
||||||
"required": json.Number("1"),
|
"key": hex.EncodeToString(key),
|
||||||
"started": true,
|
})
|
||||||
"pgp_fingerprint": "",
|
|
||||||
|
actual = map[string]interface{}{}
|
||||||
|
expected = map[string]interface{}{
|
||||||
|
"complete": false,
|
||||||
|
"nonce": rootGenerationStatus["nonce"].(string),
|
||||||
|
"progress": json.Number(fmt.Sprintf("%d", i+1)),
|
||||||
|
"required": json.Number(fmt.Sprintf("%d", len(keys))),
|
||||||
|
"started": true,
|
||||||
|
"pgp_fingerprint": "",
|
||||||
|
}
|
||||||
|
if i+1 == len(keys) {
|
||||||
|
expected["complete"] = true
|
||||||
|
}
|
||||||
|
testResponseStatus(t, resp, 200)
|
||||||
|
testResponseBody(t, resp, &actual)
|
||||||
}
|
}
|
||||||
testResponseStatus(t, resp, 200)
|
|
||||||
testResponseBody(t, resp, &actual)
|
|
||||||
|
|
||||||
if actual["encoded_root_token"] == nil {
|
if actual["encoded_root_token"] == nil {
|
||||||
t.Fatalf("no encoded root token found in response")
|
t.Fatalf("no encoded root token found in response")
|
||||||
@@ -319,7 +327,7 @@ func TestSysGenerateRoot_Update_OTP(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestSysGenerateRoot_Update_PGP(t *testing.T) {
|
func TestSysGenerateRoot_Update_PGP(t *testing.T) {
|
||||||
core, master, token := vault.TestCoreUnsealed(t)
|
core, keys, token := vault.TestCoreUnsealed(t)
|
||||||
ln, addr := TestServer(t, core)
|
ln, addr := TestServer(t, core)
|
||||||
defer ln.Close()
|
defer ln.Close()
|
||||||
TestServerAuth(t, addr, token)
|
TestServerAuth(t, addr, token)
|
||||||
@@ -338,22 +346,29 @@ func TestSysGenerateRoot_Update_PGP(t *testing.T) {
|
|||||||
testResponseStatus(t, resp, 200)
|
testResponseStatus(t, resp, 200)
|
||||||
testResponseBody(t, resp, &rootGenerationStatus)
|
testResponseBody(t, resp, &rootGenerationStatus)
|
||||||
|
|
||||||
resp = testHttpPut(t, token, addr+"/v1/sys/generate-root/update", map[string]interface{}{
|
|
||||||
"nonce": rootGenerationStatus["nonce"].(string),
|
|
||||||
"key": hex.EncodeToString(master),
|
|
||||||
})
|
|
||||||
|
|
||||||
var actual map[string]interface{}
|
var actual map[string]interface{}
|
||||||
expected := map[string]interface{}{
|
var expected map[string]interface{}
|
||||||
"complete": true,
|
for i, key := range keys {
|
||||||
"nonce": rootGenerationStatus["nonce"].(string),
|
resp = testHttpPut(t, token, addr+"/v1/sys/generate-root/update", map[string]interface{}{
|
||||||
"progress": json.Number("1"),
|
"nonce": rootGenerationStatus["nonce"].(string),
|
||||||
"required": json.Number("1"),
|
"key": hex.EncodeToString(key),
|
||||||
"started": true,
|
})
|
||||||
"pgp_fingerprint": "816938b8a29146fbe245dd29e7cbaf8e011db793",
|
|
||||||
|
actual = map[string]interface{}{}
|
||||||
|
expected = map[string]interface{}{
|
||||||
|
"complete": false,
|
||||||
|
"nonce": rootGenerationStatus["nonce"].(string),
|
||||||
|
"progress": json.Number(fmt.Sprintf("%d", i+1)),
|
||||||
|
"required": json.Number(fmt.Sprintf("%d", len(keys))),
|
||||||
|
"started": true,
|
||||||
|
"pgp_fingerprint": "816938b8a29146fbe245dd29e7cbaf8e011db793",
|
||||||
|
}
|
||||||
|
if i+1 == len(keys) {
|
||||||
|
expected["complete"] = true
|
||||||
|
}
|
||||||
|
testResponseStatus(t, resp, 200)
|
||||||
|
testResponseBody(t, resp, &actual)
|
||||||
}
|
}
|
||||||
testResponseStatus(t, resp, 200)
|
|
||||||
testResponseBody(t, resp, &actual)
|
|
||||||
|
|
||||||
if actual["encoded_root_token"] == nil {
|
if actual["encoded_root_token"] == nil {
|
||||||
t.Fatalf("no encoded root token found in response")
|
t.Fatalf("no encoded root token found in response")
|
||||||
|
|||||||
@@ -45,7 +45,7 @@ func TestSysHealth_get(t *testing.T) {
|
|||||||
t.Fatalf("bad: expected:%#v\nactual:%#v", expected, actual)
|
t.Fatalf("bad: expected:%#v\nactual:%#v", expected, actual)
|
||||||
}
|
}
|
||||||
|
|
||||||
key, _ := vault.TestCoreInit(t, core)
|
keys, _ := vault.TestCoreInit(t, core)
|
||||||
resp, err = http.Get(addr + "/v1/sys/health")
|
resp, err = http.Get(addr + "/v1/sys/health")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("err: %s", err)
|
t.Fatalf("err: %s", err)
|
||||||
@@ -75,8 +75,10 @@ func TestSysHealth_get(t *testing.T) {
|
|||||||
t.Fatalf("bad: expected:%#v\nactual:%#v", expected, actual)
|
t.Fatalf("bad: expected:%#v\nactual:%#v", expected, actual)
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err := vault.TestCoreUnseal(core, vault.TestKeyCopy(key)); err != nil {
|
for _, key := range keys {
|
||||||
t.Fatalf("unseal err: %s", err)
|
if _, err := vault.TestCoreUnseal(core, vault.TestKeyCopy(key)); err != nil {
|
||||||
|
t.Fatalf("unseal err: %s", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
resp, err = http.Get(addr + "/v1/sys/health")
|
resp, err = http.Get(addr + "/v1/sys/health")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -148,7 +150,7 @@ func TestSysHealth_customcodes(t *testing.T) {
|
|||||||
t.Fatalf("bad: expected:%#v\nactual:%#v", expected, actual)
|
t.Fatalf("bad: expected:%#v\nactual:%#v", expected, actual)
|
||||||
}
|
}
|
||||||
|
|
||||||
key, _ := vault.TestCoreInit(t, core)
|
keys, _ := vault.TestCoreInit(t, core)
|
||||||
resp, err = http.Get(queryurl.String())
|
resp, err = http.Get(queryurl.String())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("err: %s", err)
|
t.Fatalf("err: %s", err)
|
||||||
@@ -179,8 +181,10 @@ func TestSysHealth_customcodes(t *testing.T) {
|
|||||||
t.Fatalf("bad: expected:%#v\nactual:%#v", expected, actual)
|
t.Fatalf("bad: expected:%#v\nactual:%#v", expected, actual)
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err := vault.TestCoreUnseal(core, vault.TestKeyCopy(key)); err != nil {
|
for _, key := range keys {
|
||||||
t.Fatalf("unseal err: %s", err)
|
if _, err := vault.TestCoreUnseal(core, vault.TestKeyCopy(key)); err != nil {
|
||||||
|
t.Fatalf("unseal err: %s", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
resp, err = http.Get(queryurl.String())
|
resp, err = http.Get(queryurl.String())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -204,8 +204,10 @@ func handleSysRekeyUpdate(core *vault.Core, recovery bool) http.Handler {
|
|||||||
}
|
}
|
||||||
resp.Keys = keys
|
resp.Keys = keys
|
||||||
resp.KeysB64 = keysB64
|
resp.KeysB64 = keysB64
|
||||||
|
respondOk(w, resp)
|
||||||
|
} else {
|
||||||
|
handleSysRekeyInitGet(core, recovery, w, r)
|
||||||
}
|
}
|
||||||
respondOk(w, resp)
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package http
|
|||||||
import (
|
import (
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"reflect"
|
"reflect"
|
||||||
"testing"
|
"testing"
|
||||||
@@ -43,7 +44,7 @@ func TestSysRekeyInit_Status(t *testing.T) {
|
|||||||
"t": json.Number("0"),
|
"t": json.Number("0"),
|
||||||
"n": json.Number("0"),
|
"n": json.Number("0"),
|
||||||
"progress": json.Number("0"),
|
"progress": json.Number("0"),
|
||||||
"required": json.Number("1"),
|
"required": json.Number("3"),
|
||||||
"pgp_fingerprints": interface{}(nil),
|
"pgp_fingerprints": interface{}(nil),
|
||||||
"backup": false,
|
"backup": false,
|
||||||
"nonce": "",
|
"nonce": "",
|
||||||
@@ -73,7 +74,7 @@ func TestSysRekeyInit_Setup(t *testing.T) {
|
|||||||
"t": json.Number("3"),
|
"t": json.Number("3"),
|
||||||
"n": json.Number("5"),
|
"n": json.Number("5"),
|
||||||
"progress": json.Number("0"),
|
"progress": json.Number("0"),
|
||||||
"required": json.Number("1"),
|
"required": json.Number("3"),
|
||||||
"pgp_fingerprints": interface{}(nil),
|
"pgp_fingerprints": interface{}(nil),
|
||||||
"backup": false,
|
"backup": false,
|
||||||
}
|
}
|
||||||
@@ -95,7 +96,7 @@ func TestSysRekeyInit_Setup(t *testing.T) {
|
|||||||
"t": json.Number("3"),
|
"t": json.Number("3"),
|
||||||
"n": json.Number("5"),
|
"n": json.Number("5"),
|
||||||
"progress": json.Number("0"),
|
"progress": json.Number("0"),
|
||||||
"required": json.Number("1"),
|
"required": json.Number("3"),
|
||||||
"pgp_fingerprints": interface{}(nil),
|
"pgp_fingerprints": interface{}(nil),
|
||||||
"backup": false,
|
"backup": false,
|
||||||
}
|
}
|
||||||
@@ -139,7 +140,7 @@ func TestSysRekeyInit_Cancel(t *testing.T) {
|
|||||||
"t": json.Number("0"),
|
"t": json.Number("0"),
|
||||||
"n": json.Number("0"),
|
"n": json.Number("0"),
|
||||||
"progress": json.Number("0"),
|
"progress": json.Number("0"),
|
||||||
"required": json.Number("1"),
|
"required": json.Number("3"),
|
||||||
"pgp_fingerprints": interface{}(nil),
|
"pgp_fingerprints": interface{}(nil),
|
||||||
"backup": false,
|
"backup": false,
|
||||||
"nonce": "",
|
"nonce": "",
|
||||||
@@ -164,7 +165,7 @@ func TestSysRekey_badKey(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestSysRekey_Update(t *testing.T) {
|
func TestSysRekey_Update(t *testing.T) {
|
||||||
core, master, token := vault.TestCoreUnsealed(t)
|
core, keys, token := vault.TestCoreUnsealed(t)
|
||||||
ln, addr := TestServer(t, core)
|
ln, addr := TestServer(t, core)
|
||||||
defer ln.Close()
|
defer ln.Close()
|
||||||
TestServerAuth(t, addr, token)
|
TestServerAuth(t, addr, token)
|
||||||
@@ -177,39 +178,61 @@ func TestSysRekey_Update(t *testing.T) {
|
|||||||
testResponseStatus(t, resp, 200)
|
testResponseStatus(t, resp, 200)
|
||||||
testResponseBody(t, resp, &rekeyStatus)
|
testResponseBody(t, resp, &rekeyStatus)
|
||||||
|
|
||||||
resp = testHttpPut(t, token, addr+"/v1/sys/rekey/update", map[string]interface{}{
|
|
||||||
"nonce": rekeyStatus["nonce"].(string),
|
|
||||||
"key": hex.EncodeToString(master),
|
|
||||||
})
|
|
||||||
|
|
||||||
var actual map[string]interface{}
|
var actual map[string]interface{}
|
||||||
expected := map[string]interface{}{
|
var expected map[string]interface{}
|
||||||
"complete": true,
|
|
||||||
"nonce": rekeyStatus["nonce"].(string),
|
|
||||||
"backup": false,
|
|
||||||
"pgp_fingerprints": interface{}(nil),
|
|
||||||
}
|
|
||||||
testResponseStatus(t, resp, 200)
|
|
||||||
testResponseBody(t, resp, &actual)
|
|
||||||
|
|
||||||
keys := actual["keys"].([]interface{})
|
for i, key := range keys {
|
||||||
if len(keys) != 5 {
|
resp = testHttpPut(t, token, addr+"/v1/sys/rekey/update", map[string]interface{}{
|
||||||
t.Fatalf("bad: %#v", keys)
|
"nonce": rekeyStatus["nonce"].(string),
|
||||||
|
"key": hex.EncodeToString(key),
|
||||||
|
})
|
||||||
|
|
||||||
|
actual = map[string]interface{}{}
|
||||||
|
expected = map[string]interface{}{
|
||||||
|
"started": true,
|
||||||
|
"nonce": rekeyStatus["nonce"].(string),
|
||||||
|
"backup": false,
|
||||||
|
"pgp_fingerprints": interface{}(nil),
|
||||||
|
"required": json.Number("3"),
|
||||||
|
"t": json.Number("3"),
|
||||||
|
"n": json.Number("5"),
|
||||||
|
"progress": json.Number(fmt.Sprintf("%d", i+1)),
|
||||||
|
}
|
||||||
|
testResponseStatus(t, resp, 200)
|
||||||
|
testResponseBody(t, resp, &actual)
|
||||||
|
|
||||||
|
if i+1 == len(keys) {
|
||||||
|
delete(expected, "started")
|
||||||
|
delete(expected, "required")
|
||||||
|
delete(expected, "t")
|
||||||
|
delete(expected, "n")
|
||||||
|
delete(expected, "progress")
|
||||||
|
expected["complete"] = true
|
||||||
|
expected["keys"] = actual["keys"]
|
||||||
|
expected["keys_base64"] = actual["keys_base64"]
|
||||||
|
}
|
||||||
|
|
||||||
|
if i+1 < len(keys) && (actual["nonce"] == nil || actual["nonce"].(string) == "") {
|
||||||
|
t.Fatalf("expected a nonce, i is %d, actual is %#v", i, actual)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !reflect.DeepEqual(actual, expected) {
|
||||||
|
t.Fatalf("\nexpected: \n%#v\nactual: \n%#v", expected, actual)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
retKeys := actual["keys"].([]interface{})
|
||||||
|
if len(retKeys) != 5 {
|
||||||
|
t.Fatalf("bad: %#v", retKeys)
|
||||||
}
|
}
|
||||||
keysB64 := actual["keys_base64"].([]interface{})
|
keysB64 := actual["keys_base64"].([]interface{})
|
||||||
if len(keysB64) != 5 {
|
if len(keysB64) != 5 {
|
||||||
t.Fatalf("bad: %#v", keysB64)
|
t.Fatalf("bad: %#v", keysB64)
|
||||||
}
|
}
|
||||||
|
|
||||||
delete(actual, "keys")
|
|
||||||
delete(actual, "keys_base64")
|
|
||||||
if !reflect.DeepEqual(actual, expected) {
|
|
||||||
t.Fatalf("\nexpected: %#v\nactual: %#v", expected, actual)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestSysRekey_ReInitUpdate(t *testing.T) {
|
func TestSysRekey_ReInitUpdate(t *testing.T) {
|
||||||
core, master, token := vault.TestCoreUnsealed(t)
|
core, keys, token := vault.TestCoreUnsealed(t)
|
||||||
ln, addr := TestServer(t, core)
|
ln, addr := TestServer(t, core)
|
||||||
defer ln.Close()
|
defer ln.Close()
|
||||||
TestServerAuth(t, addr, token)
|
TestServerAuth(t, addr, token)
|
||||||
@@ -230,7 +253,7 @@ func TestSysRekey_ReInitUpdate(t *testing.T) {
|
|||||||
testResponseStatus(t, resp, 200)
|
testResponseStatus(t, resp, 200)
|
||||||
|
|
||||||
resp = testHttpPut(t, token, addr+"/v1/sys/rekey/update", map[string]interface{}{
|
resp = testHttpPut(t, token, addr+"/v1/sys/rekey/update", map[string]interface{}{
|
||||||
"key": hex.EncodeToString(master),
|
"key": hex.EncodeToString(keys[0]),
|
||||||
})
|
})
|
||||||
|
|
||||||
testResponseStatus(t, resp, 400)
|
testResponseStatus(t, resp, 400)
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package http
|
|||||||
import (
|
import (
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strconv"
|
"strconv"
|
||||||
@@ -26,8 +27,8 @@ func TestSysSealStatus(t *testing.T) {
|
|||||||
var actual map[string]interface{}
|
var actual map[string]interface{}
|
||||||
expected := map[string]interface{}{
|
expected := map[string]interface{}{
|
||||||
"sealed": true,
|
"sealed": true,
|
||||||
"t": json.Number("1"),
|
"t": json.Number("3"),
|
||||||
"n": json.Number("1"),
|
"n": json.Number("3"),
|
||||||
"progress": json.Number("0"),
|
"progress": json.Number("0"),
|
||||||
"nonce": "",
|
"nonce": "",
|
||||||
}
|
}
|
||||||
@@ -102,40 +103,51 @@ func TestSysSeal_unsealed(t *testing.T) {
|
|||||||
|
|
||||||
func TestSysUnseal(t *testing.T) {
|
func TestSysUnseal(t *testing.T) {
|
||||||
core := vault.TestCore(t)
|
core := vault.TestCore(t)
|
||||||
key, _ := vault.TestCoreInit(t, core)
|
keys, _ := vault.TestCoreInit(t, core)
|
||||||
ln, addr := TestServer(t, core)
|
ln, addr := TestServer(t, core)
|
||||||
defer ln.Close()
|
defer ln.Close()
|
||||||
|
|
||||||
resp := testHttpPut(t, "", addr+"/v1/sys/unseal", map[string]interface{}{
|
for i, key := range keys {
|
||||||
"key": hex.EncodeToString(key),
|
resp := testHttpPut(t, "", addr+"/v1/sys/unseal", map[string]interface{}{
|
||||||
})
|
"key": hex.EncodeToString(key),
|
||||||
|
})
|
||||||
|
|
||||||
var actual map[string]interface{}
|
var actual map[string]interface{}
|
||||||
expected := map[string]interface{}{
|
expected := map[string]interface{}{
|
||||||
"sealed": false,
|
"sealed": true,
|
||||||
"t": json.Number("1"),
|
"t": json.Number("3"),
|
||||||
"n": json.Number("1"),
|
"n": json.Number("3"),
|
||||||
"progress": json.Number("0"),
|
"progress": json.Number(fmt.Sprintf("%d", i+1)),
|
||||||
"nonce": "",
|
"nonce": "",
|
||||||
}
|
}
|
||||||
testResponseStatus(t, resp, 200)
|
if i == len(keys)-1 {
|
||||||
testResponseBody(t, resp, &actual)
|
expected["sealed"] = false
|
||||||
if actual["version"] == nil {
|
expected["progress"] = json.Number("0")
|
||||||
t.Fatalf("expected version information")
|
}
|
||||||
}
|
testResponseStatus(t, resp, 200)
|
||||||
expected["version"] = actual["version"]
|
testResponseBody(t, resp, &actual)
|
||||||
if actual["cluster_name"] == nil {
|
if i < len(keys)-1 && (actual["nonce"] == nil || actual["nonce"].(string) == "") {
|
||||||
delete(expected, "cluster_name")
|
t.Fatalf("got nil nonce, actual is %#v", actual)
|
||||||
} else {
|
} else {
|
||||||
expected["cluster_name"] = actual["cluster_name"]
|
expected["nonce"] = actual["nonce"]
|
||||||
}
|
}
|
||||||
if actual["cluster_id"] == nil {
|
if actual["version"] == nil {
|
||||||
delete(expected, "cluster_id")
|
t.Fatalf("expected version information")
|
||||||
} else {
|
}
|
||||||
expected["cluster_id"] = actual["cluster_id"]
|
expected["version"] = actual["version"]
|
||||||
}
|
if actual["cluster_name"] == nil {
|
||||||
if !reflect.DeepEqual(actual, expected) {
|
delete(expected, "cluster_name")
|
||||||
t.Fatalf("bad: expected: %#v\nactual: %#v", expected, actual)
|
} else {
|
||||||
|
expected["cluster_name"] = actual["cluster_name"]
|
||||||
|
}
|
||||||
|
if actual["cluster_id"] == nil {
|
||||||
|
delete(expected, "cluster_id")
|
||||||
|
} else {
|
||||||
|
expected["cluster_id"] = actual["cluster_id"]
|
||||||
|
}
|
||||||
|
if !reflect.DeepEqual(actual, expected) {
|
||||||
|
t.Fatalf("bad: expected: \n%#v\nactual: \n%#v", expected, actual)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ func (n *NoopAudit) Reload() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestCore_EnableAudit(t *testing.T) {
|
func TestCore_EnableAudit(t *testing.T) {
|
||||||
c, key, _ := TestCoreUnsealed(t)
|
c, keys, _ := TestCoreUnsealed(t)
|
||||||
c.auditBackends["noop"] = func(config *audit.BackendConfig) (audit.Backend, error) {
|
c.auditBackends["noop"] = func(config *audit.BackendConfig) (audit.Backend, error) {
|
||||||
return &NoopAudit{
|
return &NoopAudit{
|
||||||
Config: config,
|
Config: config,
|
||||||
@@ -89,12 +89,14 @@ func TestCore_EnableAudit(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("err: %v", err)
|
t.Fatalf("err: %v", err)
|
||||||
}
|
}
|
||||||
unseal, err := TestCoreUnseal(c2, key)
|
for i, key := range keys {
|
||||||
if err != nil {
|
unseal, err := TestCoreUnseal(c2, key)
|
||||||
t.Fatalf("err: %v", err)
|
if err != nil {
|
||||||
}
|
t.Fatalf("err: %v", err)
|
||||||
if !unseal {
|
}
|
||||||
t.Fatalf("should be unsealed")
|
if i+1 == len(keys) && !unseal {
|
||||||
|
t.Fatalf("should be unsealed")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Verify matching audit tables
|
// Verify matching audit tables
|
||||||
@@ -160,7 +162,7 @@ func TestCore_EnableAudit_MixedFailures(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestCore_DisableAudit(t *testing.T) {
|
func TestCore_DisableAudit(t *testing.T) {
|
||||||
c, key, _ := TestCoreUnsealed(t)
|
c, keys, _ := TestCoreUnsealed(t)
|
||||||
c.auditBackends["noop"] = func(config *audit.BackendConfig) (audit.Backend, error) {
|
c.auditBackends["noop"] = func(config *audit.BackendConfig) (audit.Backend, error) {
|
||||||
return &NoopAudit{
|
return &NoopAudit{
|
||||||
Config: config,
|
Config: config,
|
||||||
@@ -200,12 +202,14 @@ func TestCore_DisableAudit(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("err: %v", err)
|
t.Fatalf("err: %v", err)
|
||||||
}
|
}
|
||||||
unseal, err := TestCoreUnseal(c2, key)
|
for i, key := range keys {
|
||||||
if err != nil {
|
unseal, err := TestCoreUnseal(c2, key)
|
||||||
t.Fatalf("err: %v", err)
|
if err != nil {
|
||||||
}
|
t.Fatalf("err: %v", err)
|
||||||
if !unseal {
|
}
|
||||||
t.Fatalf("should be unsealed")
|
if i+1 == len(keys) && !unseal {
|
||||||
|
t.Fatalf("should be unsealed")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Verify matching mount tables
|
// Verify matching mount tables
|
||||||
@@ -215,7 +219,7 @@ func TestCore_DisableAudit(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestCore_DefaultAuditTable(t *testing.T) {
|
func TestCore_DefaultAuditTable(t *testing.T) {
|
||||||
c, key, _ := TestCoreUnsealed(t)
|
c, keys, _ := TestCoreUnsealed(t)
|
||||||
verifyDefaultAuditTable(t, c.audit)
|
verifyDefaultAuditTable(t, c.audit)
|
||||||
|
|
||||||
// Verify we have an audit broker
|
// Verify we have an audit broker
|
||||||
@@ -232,12 +236,14 @@ func TestCore_DefaultAuditTable(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("err: %v", err)
|
t.Fatalf("err: %v", err)
|
||||||
}
|
}
|
||||||
unseal, err := TestCoreUnseal(c2, key)
|
for i, key := range keys {
|
||||||
if err != nil {
|
unseal, err := TestCoreUnseal(c2, key)
|
||||||
t.Fatalf("err: %v", err)
|
if err != nil {
|
||||||
}
|
t.Fatalf("err: %v", err)
|
||||||
if !unseal {
|
}
|
||||||
t.Fatalf("should be unsealed")
|
if i+1 == len(keys) && !unseal {
|
||||||
|
t.Fatalf("should be unsealed")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Verify matching mount tables
|
// Verify matching mount tables
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func TestCore_DefaultAuthTable(t *testing.T) {
|
func TestCore_DefaultAuthTable(t *testing.T) {
|
||||||
c, key, _ := TestCoreUnsealed(t)
|
c, keys, _ := TestCoreUnsealed(t)
|
||||||
verifyDefaultAuthTable(t, c.auth)
|
verifyDefaultAuthTable(t, c.auth)
|
||||||
|
|
||||||
// Start a second core with same physical
|
// Start a second core with same physical
|
||||||
@@ -20,12 +20,14 @@ func TestCore_DefaultAuthTable(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("err: %v", err)
|
t.Fatalf("err: %v", err)
|
||||||
}
|
}
|
||||||
unseal, err := TestCoreUnseal(c2, key)
|
for i, key := range keys {
|
||||||
if err != nil {
|
unseal, err := TestCoreUnseal(c2, key)
|
||||||
t.Fatalf("err: %v", err)
|
if err != nil {
|
||||||
}
|
t.Fatalf("err: %v", err)
|
||||||
if !unseal {
|
}
|
||||||
t.Fatalf("should be unsealed")
|
if i+1 == len(keys) && !unseal {
|
||||||
|
t.Fatalf("should be unsealed")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Verify matching mount tables
|
// Verify matching mount tables
|
||||||
@@ -35,7 +37,7 @@ func TestCore_DefaultAuthTable(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestCore_EnableCredential(t *testing.T) {
|
func TestCore_EnableCredential(t *testing.T) {
|
||||||
c, key, _ := TestCoreUnsealed(t)
|
c, keys, _ := TestCoreUnsealed(t)
|
||||||
c.credentialBackends["noop"] = func(*logical.BackendConfig) (logical.Backend, error) {
|
c.credentialBackends["noop"] = func(*logical.BackendConfig) (logical.Backend, error) {
|
||||||
return &NoopBackend{}, nil
|
return &NoopBackend{}, nil
|
||||||
}
|
}
|
||||||
@@ -66,12 +68,14 @@ func TestCore_EnableCredential(t *testing.T) {
|
|||||||
c2.credentialBackends["noop"] = func(*logical.BackendConfig) (logical.Backend, error) {
|
c2.credentialBackends["noop"] = func(*logical.BackendConfig) (logical.Backend, error) {
|
||||||
return &NoopBackend{}, nil
|
return &NoopBackend{}, nil
|
||||||
}
|
}
|
||||||
unseal, err := TestCoreUnseal(c2, key)
|
for i, key := range keys {
|
||||||
if err != nil {
|
unseal, err := TestCoreUnseal(c2, key)
|
||||||
t.Fatalf("err: %v", err)
|
if err != nil {
|
||||||
}
|
t.Fatalf("err: %v", err)
|
||||||
if !unseal {
|
}
|
||||||
t.Fatalf("should be unsealed")
|
if i+1 == len(keys) && !unseal {
|
||||||
|
t.Fatalf("should be unsealed")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Verify matching auth tables
|
// Verify matching auth tables
|
||||||
@@ -122,7 +126,7 @@ func TestCore_EnableCredential_Token(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestCore_DisableCredential(t *testing.T) {
|
func TestCore_DisableCredential(t *testing.T) {
|
||||||
c, key, _ := TestCoreUnsealed(t)
|
c, keys, _ := TestCoreUnsealed(t)
|
||||||
c.credentialBackends["noop"] = func(*logical.BackendConfig) (logical.Backend, error) {
|
c.credentialBackends["noop"] = func(*logical.BackendConfig) (logical.Backend, error) {
|
||||||
return &NoopBackend{}, nil
|
return &NoopBackend{}, nil
|
||||||
}
|
}
|
||||||
@@ -160,12 +164,14 @@ func TestCore_DisableCredential(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("err: %v", err)
|
t.Fatalf("err: %v", err)
|
||||||
}
|
}
|
||||||
unseal, err := TestCoreUnseal(c2, key)
|
for i, key := range keys {
|
||||||
if err != nil {
|
unseal, err := TestCoreUnseal(c2, key)
|
||||||
t.Fatalf("err: %v", err)
|
if err != nil {
|
||||||
}
|
t.Fatalf("err: %v", err)
|
||||||
if !unseal {
|
}
|
||||||
t.Fatalf("should be unsealed")
|
if i+1 == len(keys) && !unseal {
|
||||||
|
t.Fatalf("should be unsealed")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Verify matching mount tables
|
// Verify matching mount tables
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package vault
|
package vault
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
|
||||||
"crypto/aes"
|
"crypto/aes"
|
||||||
"crypto/cipher"
|
"crypto/cipher"
|
||||||
"crypto/rand"
|
"crypto/rand"
|
||||||
@@ -300,7 +299,7 @@ func (b *AESGCMBarrier) ReloadMasterKey() error {
|
|||||||
defer b.l.Unlock()
|
defer b.l.Unlock()
|
||||||
|
|
||||||
// Check if the master key is the same
|
// Check if the master key is the same
|
||||||
if bytes.Equal(b.keyring.MasterKey(), key.Value) {
|
if subtle.ConstantTimeCompare(b.keyring.MasterKey(), key.Value) == 1 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -52,9 +52,11 @@ func TestClusterHAFetching(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("err: %v", err)
|
t.Fatalf("err: %v", err)
|
||||||
}
|
}
|
||||||
key, _ := TestCoreInit(t, c)
|
keys, _ := TestCoreInit(t, c)
|
||||||
if _, err := TestCoreUnseal(c, TestKeyCopy(key)); err != nil {
|
for _, key := range keys {
|
||||||
t.Fatalf("unseal err: %s", err)
|
if _, err := TestCoreUnseal(c, TestKeyCopy(key)); err != nil {
|
||||||
|
t.Fatalf("unseal err: %s", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Verify unsealed
|
// Verify unsealed
|
||||||
|
|||||||
@@ -1165,6 +1165,13 @@ func (c *Core) postUnseal() (retErr error) {
|
|||||||
}
|
}
|
||||||
// HA mode requires us to handle keyring rotation and rekeying
|
// HA mode requires us to handle keyring rotation and rekeying
|
||||||
if c.ha != nil {
|
if c.ha != nil {
|
||||||
|
// We want to reload these from disk so that in case of a rekey we're
|
||||||
|
// not using cached values
|
||||||
|
c.seal.SetBarrierConfig(nil)
|
||||||
|
if c.seal.RecoveryKeySupported() {
|
||||||
|
c.seal.SetRecoveryConfig(nil)
|
||||||
|
}
|
||||||
|
|
||||||
if err := c.checkKeyUpgrades(); err != nil {
|
if err := c.checkKeyUpgrades(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -228,12 +228,18 @@ func TestCore_Route_Sealed(t *testing.T) {
|
|||||||
|
|
||||||
// Attempt to unseal after doing a first seal
|
// Attempt to unseal after doing a first seal
|
||||||
func TestCore_SealUnseal(t *testing.T) {
|
func TestCore_SealUnseal(t *testing.T) {
|
||||||
c, key, root := TestCoreUnsealed(t)
|
c, keys, root := TestCoreUnsealed(t)
|
||||||
if err := c.Seal(root); err != nil {
|
if err := c.Seal(root); err != nil {
|
||||||
t.Fatalf("err: %v", err)
|
t.Fatalf("err: %v", err)
|
||||||
}
|
}
|
||||||
if unseal, err := TestCoreUnseal(c, key); err != nil || !unseal {
|
for i, key := range keys {
|
||||||
t.Fatalf("err: %v", err)
|
unseal, err := TestCoreUnseal(c, key)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %v", err)
|
||||||
|
}
|
||||||
|
if i+1 == len(keys) && !unseal {
|
||||||
|
t.Fatalf("err: should be unsealed")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -979,9 +985,11 @@ func TestCore_Standby_Seal(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("err: %v", err)
|
t.Fatalf("err: %v", err)
|
||||||
}
|
}
|
||||||
key, root := TestCoreInit(t, core)
|
keys, root := TestCoreInit(t, core)
|
||||||
if _, err := TestCoreUnseal(core, TestKeyCopy(key)); err != nil {
|
for _, key := range keys {
|
||||||
t.Fatalf("unseal err: %s", err)
|
if _, err := TestCoreUnseal(core, TestKeyCopy(key)); err != nil {
|
||||||
|
t.Fatalf("unseal err: %s", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Verify unsealed
|
// Verify unsealed
|
||||||
@@ -1019,8 +1027,10 @@ func TestCore_Standby_Seal(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("err: %v", err)
|
t.Fatalf("err: %v", err)
|
||||||
}
|
}
|
||||||
if _, err := TestCoreUnseal(core2, TestKeyCopy(key)); err != nil {
|
for _, key := range keys {
|
||||||
t.Fatalf("unseal err: %s", err)
|
if _, err := TestCoreUnseal(core2, TestKeyCopy(key)); err != nil {
|
||||||
|
t.Fatalf("unseal err: %s", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Verify unsealed
|
// Verify unsealed
|
||||||
@@ -1086,9 +1096,11 @@ func TestCore_StepDown(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("err: %v", err)
|
t.Fatalf("err: %v", err)
|
||||||
}
|
}
|
||||||
key, root := TestCoreInit(t, core)
|
keys, root := TestCoreInit(t, core)
|
||||||
if _, err := TestCoreUnseal(core, TestKeyCopy(key)); err != nil {
|
for _, key := range keys {
|
||||||
t.Fatalf("unseal err: %s", err)
|
if _, err := TestCoreUnseal(core, TestKeyCopy(key)); err != nil {
|
||||||
|
t.Fatalf("unseal err: %s", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Verify unsealed
|
// Verify unsealed
|
||||||
@@ -1126,8 +1138,10 @@ func TestCore_StepDown(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("err: %v", err)
|
t.Fatalf("err: %v", err)
|
||||||
}
|
}
|
||||||
if _, err := TestCoreUnseal(core2, TestKeyCopy(key)); err != nil {
|
for _, key := range keys {
|
||||||
t.Fatalf("unseal err: %s", err)
|
if _, err := TestCoreUnseal(core2, TestKeyCopy(key)); err != nil {
|
||||||
|
t.Fatalf("unseal err: %s", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Verify unsealed
|
// Verify unsealed
|
||||||
@@ -1273,9 +1287,11 @@ func TestCore_CleanLeaderPrefix(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("err: %v", err)
|
t.Fatalf("err: %v", err)
|
||||||
}
|
}
|
||||||
key, root := TestCoreInit(t, core)
|
keys, root := TestCoreInit(t, core)
|
||||||
if _, err := TestCoreUnseal(core, TestKeyCopy(key)); err != nil {
|
for _, key := range keys {
|
||||||
t.Fatalf("unseal err: %s", err)
|
if _, err := TestCoreUnseal(core, TestKeyCopy(key)); err != nil {
|
||||||
|
t.Fatalf("unseal err: %s", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Verify unsealed
|
// Verify unsealed
|
||||||
@@ -1340,8 +1356,10 @@ func TestCore_CleanLeaderPrefix(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("err: %v", err)
|
t.Fatalf("err: %v", err)
|
||||||
}
|
}
|
||||||
if _, err := TestCoreUnseal(core2, TestKeyCopy(key)); err != nil {
|
for _, key := range keys {
|
||||||
t.Fatalf("unseal err: %s", err)
|
if _, err := TestCoreUnseal(core2, TestKeyCopy(key)); err != nil {
|
||||||
|
t.Fatalf("unseal err: %s", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Verify unsealed
|
// Verify unsealed
|
||||||
@@ -1441,9 +1459,11 @@ func testCore_Standby_Common(t *testing.T, inm physical.Backend, inmha physical.
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("err: %v", err)
|
t.Fatalf("err: %v", err)
|
||||||
}
|
}
|
||||||
key, root := TestCoreInit(t, core)
|
keys, root := TestCoreInit(t, core)
|
||||||
if _, err := TestCoreUnseal(core, TestKeyCopy(key)); err != nil {
|
for _, key := range keys {
|
||||||
t.Fatalf("unseal err: %s", err)
|
if _, err := TestCoreUnseal(core, TestKeyCopy(key)); err != nil {
|
||||||
|
t.Fatalf("unseal err: %s", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Verify unsealed
|
// Verify unsealed
|
||||||
@@ -1495,8 +1515,10 @@ func testCore_Standby_Common(t *testing.T, inm physical.Backend, inmha physical.
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("err: %v", err)
|
t.Fatalf("err: %v", err)
|
||||||
}
|
}
|
||||||
if _, err := TestCoreUnseal(core2, TestKeyCopy(key)); err != nil {
|
for _, key := range keys {
|
||||||
t.Fatalf("unseal err: %s", err)
|
if _, err := TestCoreUnseal(core2, TestKeyCopy(key)); err != nil {
|
||||||
|
t.Fatalf("unseal err: %s", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Verify unsealed
|
// Verify unsealed
|
||||||
@@ -1988,9 +2010,11 @@ func TestCore_Standby_Rotate(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("err: %v", err)
|
t.Fatalf("err: %v", err)
|
||||||
}
|
}
|
||||||
key, root := TestCoreInit(t, core)
|
keys, root := TestCoreInit(t, core)
|
||||||
if _, err := TestCoreUnseal(core, TestKeyCopy(key)); err != nil {
|
for _, key := range keys {
|
||||||
t.Fatalf("unseal err: %s", err)
|
if _, err := TestCoreUnseal(core, TestKeyCopy(key)); err != nil {
|
||||||
|
t.Fatalf("unseal err: %s", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Wait for core to become active
|
// Wait for core to become active
|
||||||
@@ -2007,8 +2031,10 @@ func TestCore_Standby_Rotate(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("err: %v", err)
|
t.Fatalf("err: %v", err)
|
||||||
}
|
}
|
||||||
if _, err := TestCoreUnseal(core2, TestKeyCopy(key)); err != nil {
|
for _, key := range keys {
|
||||||
t.Fatalf("unseal err: %s", err)
|
if _, err := TestCoreUnseal(core2, TestKeyCopy(key)); err != nil {
|
||||||
|
t.Fatalf("unseal err: %s", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Rotate the encryption key
|
// Rotate the encryption key
|
||||||
|
|||||||
@@ -10,10 +10,12 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func TestCore_GenerateRoot_Lifecycle(t *testing.T) {
|
func TestCore_GenerateRoot_Lifecycle(t *testing.T) {
|
||||||
c, master, _ := TestCoreUnsealed(t)
|
|
||||||
testCore_GenerateRoot_Lifecycle_Common(t, c, [][]byte{master})
|
|
||||||
|
|
||||||
bc, rc := TestSealDefConfigs()
|
bc, rc := TestSealDefConfigs()
|
||||||
|
c, masterKeys, _, _ := TestCoreUnsealedWithConfigs(t, bc, rc)
|
||||||
|
c.seal.(*TestSeal).recoveryKeysDisabled = true
|
||||||
|
testCore_GenerateRoot_Lifecycle_Common(t, c, masterKeys)
|
||||||
|
|
||||||
|
bc, rc = TestSealDefConfigs()
|
||||||
c, _, recoveryKeys, _ := TestCoreUnsealedWithConfigs(t, bc, rc)
|
c, _, recoveryKeys, _ := TestCoreUnsealedWithConfigs(t, bc, rc)
|
||||||
testCore_GenerateRoot_Lifecycle_Common(t, c, recoveryKeys)
|
testCore_GenerateRoot_Lifecycle_Common(t, c, recoveryKeys)
|
||||||
}
|
}
|
||||||
@@ -109,12 +111,17 @@ func testCore_GenerateRoot_Init_Common(t *testing.T, c *Core) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestCore_GenerateRoot_InvalidMasterNonce(t *testing.T) {
|
func TestCore_GenerateRoot_InvalidMasterNonce(t *testing.T) {
|
||||||
c, master, _ := TestCoreUnsealed(t)
|
|
||||||
// Make the master invalid
|
|
||||||
master[0]++
|
|
||||||
testCore_GenerateRoot_InvalidMasterNonce_Common(t, c, [][]byte{master})
|
|
||||||
|
|
||||||
bc, rc := TestSealDefConfigs()
|
bc, rc := TestSealDefConfigs()
|
||||||
|
bc.SecretShares = 1
|
||||||
|
bc.SecretThreshold = 1
|
||||||
|
bc.StoredShares = 0
|
||||||
|
c, masterKeys, _, _ := TestCoreUnsealedWithConfigs(t, bc, rc)
|
||||||
|
c.seal.(*TestSeal).recoveryKeysDisabled = true
|
||||||
|
// Make the master invalid
|
||||||
|
masterKeys[0][0]++
|
||||||
|
testCore_GenerateRoot_InvalidMasterNonce_Common(t, c, masterKeys)
|
||||||
|
|
||||||
|
bc, rc = TestSealDefConfigs()
|
||||||
// For ease of use let's make the threshold the same as the shares and also
|
// For ease of use let's make the threshold the same as the shares and also
|
||||||
// no stored shares so we get an error after the full set
|
// no stored shares so we get an error after the full set
|
||||||
bc.StoredShares = 0
|
bc.StoredShares = 0
|
||||||
@@ -123,7 +130,7 @@ func TestCore_GenerateRoot_InvalidMasterNonce(t *testing.T) {
|
|||||||
rc.SecretShares = 5
|
rc.SecretShares = 5
|
||||||
rc.SecretThreshold = 5
|
rc.SecretThreshold = 5
|
||||||
// In this case, pass in master keys instead as they'll be invalid
|
// In this case, pass in master keys instead as they'll be invalid
|
||||||
c, masterKeys, _, _ := TestCoreUnsealedWithConfigs(t, bc, rc)
|
c, masterKeys, _, _ = TestCoreUnsealedWithConfigs(t, bc, rc)
|
||||||
testCore_GenerateRoot_InvalidMasterNonce_Common(t, c, masterKeys)
|
testCore_GenerateRoot_InvalidMasterNonce_Common(t, c, masterKeys)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -163,10 +170,12 @@ func testCore_GenerateRoot_InvalidMasterNonce_Common(t *testing.T, c *Core, keys
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestCore_GenerateRoot_Update_OTP(t *testing.T) {
|
func TestCore_GenerateRoot_Update_OTP(t *testing.T) {
|
||||||
c, master, _ := TestCoreUnsealed(t)
|
|
||||||
testCore_GenerateRoot_Update_OTP_Common(t, c, [][]byte{master})
|
|
||||||
|
|
||||||
bc, rc := TestSealDefConfigs()
|
bc, rc := TestSealDefConfigs()
|
||||||
|
c, masterKeys, _, _ := TestCoreUnsealedWithConfigs(t, bc, rc)
|
||||||
|
c.seal.(*TestSeal).recoveryKeysDisabled = true
|
||||||
|
testCore_GenerateRoot_Update_OTP_Common(t, c, masterKeys[0:bc.SecretThreshold])
|
||||||
|
|
||||||
|
bc, rc = TestSealDefConfigs()
|
||||||
c, _, recoveryKeys, _ := TestCoreUnsealedWithConfigs(t, bc, rc)
|
c, _, recoveryKeys, _ := TestCoreUnsealedWithConfigs(t, bc, rc)
|
||||||
testCore_GenerateRoot_Update_OTP_Common(t, c, recoveryKeys[0:rc.SecretThreshold])
|
testCore_GenerateRoot_Update_OTP_Common(t, c, recoveryKeys[0:rc.SecretThreshold])
|
||||||
}
|
}
|
||||||
@@ -249,10 +258,12 @@ func testCore_GenerateRoot_Update_OTP_Common(t *testing.T, c *Core, keys [][]byt
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestCore_GenerateRoot_Update_PGP(t *testing.T) {
|
func TestCore_GenerateRoot_Update_PGP(t *testing.T) {
|
||||||
c, master, _ := TestCoreUnsealed(t)
|
|
||||||
testCore_GenerateRoot_Update_PGP_Common(t, c, [][]byte{master})
|
|
||||||
|
|
||||||
bc, rc := TestSealDefConfigs()
|
bc, rc := TestSealDefConfigs()
|
||||||
|
c, masterKeys, _, _ := TestCoreUnsealedWithConfigs(t, bc, rc)
|
||||||
|
c.seal.(*TestSeal).recoveryKeysDisabled = true
|
||||||
|
testCore_GenerateRoot_Update_PGP_Common(t, c, masterKeys[0:bc.SecretThreshold])
|
||||||
|
|
||||||
|
bc, rc = TestSealDefConfigs()
|
||||||
c, _, recoveryKeys, _ := TestCoreUnsealedWithConfigs(t, bc, rc)
|
c, _, recoveryKeys, _ := TestCoreUnsealedWithConfigs(t, bc, rc)
|
||||||
testCore_GenerateRoot_Update_PGP_Common(t, c, recoveryKeys[0:rc.SecretThreshold])
|
testCore_GenerateRoot_Update_PGP_Common(t, c, recoveryKeys[0:rc.SecretThreshold])
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func TestCore_DefaultMountTable(t *testing.T) {
|
func TestCore_DefaultMountTable(t *testing.T) {
|
||||||
c, key, _ := TestCoreUnsealed(t)
|
c, keys, _ := TestCoreUnsealed(t)
|
||||||
verifyDefaultTable(t, c.mounts)
|
verifyDefaultTable(t, c.mounts)
|
||||||
|
|
||||||
// Start a second core with same physical
|
// Start a second core with same physical
|
||||||
@@ -25,12 +25,14 @@ func TestCore_DefaultMountTable(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("err: %v", err)
|
t.Fatalf("err: %v", err)
|
||||||
}
|
}
|
||||||
unseal, err := TestCoreUnseal(c2, key)
|
for i, key := range keys {
|
||||||
if err != nil {
|
unseal, err := TestCoreUnseal(c2, key)
|
||||||
t.Fatalf("err: %v", err)
|
if err != nil {
|
||||||
}
|
t.Fatalf("err: %v", err)
|
||||||
if !unseal {
|
}
|
||||||
t.Fatalf("should be unsealed")
|
if i+1 == len(keys) && !unseal {
|
||||||
|
t.Fatalf("should be unsealed")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Verify matching mount tables
|
// Verify matching mount tables
|
||||||
@@ -40,7 +42,7 @@ func TestCore_DefaultMountTable(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestCore_Mount(t *testing.T) {
|
func TestCore_Mount(t *testing.T) {
|
||||||
c, key, _ := TestCoreUnsealed(t)
|
c, keys, _ := TestCoreUnsealed(t)
|
||||||
me := &MountEntry{
|
me := &MountEntry{
|
||||||
Table: mountTableType,
|
Table: mountTableType,
|
||||||
Path: "foo",
|
Path: "foo",
|
||||||
@@ -64,12 +66,14 @@ func TestCore_Mount(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("err: %v", err)
|
t.Fatalf("err: %v", err)
|
||||||
}
|
}
|
||||||
unseal, err := TestCoreUnseal(c2, key)
|
for i, key := range keys {
|
||||||
if err != nil {
|
unseal, err := TestCoreUnseal(c2, key)
|
||||||
t.Fatalf("err: %v", err)
|
if err != nil {
|
||||||
}
|
t.Fatalf("err: %v", err)
|
||||||
if !unseal {
|
}
|
||||||
t.Fatalf("should be unsealed")
|
if i+1 == len(keys) && !unseal {
|
||||||
|
t.Fatalf("should be unsealed")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Verify matching mount tables
|
// Verify matching mount tables
|
||||||
@@ -79,7 +83,7 @@ func TestCore_Mount(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestCore_Unmount(t *testing.T) {
|
func TestCore_Unmount(t *testing.T) {
|
||||||
c, key, _ := TestCoreUnsealed(t)
|
c, keys, _ := TestCoreUnsealed(t)
|
||||||
existed, err := c.unmount("secret")
|
existed, err := c.unmount("secret")
|
||||||
if !existed || err != nil {
|
if !existed || err != nil {
|
||||||
t.Fatalf("existed: %v; err: %v", existed, err)
|
t.Fatalf("existed: %v; err: %v", existed, err)
|
||||||
@@ -98,12 +102,14 @@ func TestCore_Unmount(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("err: %v", err)
|
t.Fatalf("err: %v", err)
|
||||||
}
|
}
|
||||||
unseal, err := TestCoreUnseal(c2, key)
|
for i, key := range keys {
|
||||||
if err != nil {
|
unseal, err := TestCoreUnseal(c2, key)
|
||||||
t.Fatalf("err: %v", err)
|
if err != nil {
|
||||||
}
|
t.Fatalf("err: %v", err)
|
||||||
if !unseal {
|
}
|
||||||
t.Fatalf("should be unsealed")
|
if i+1 == len(keys) && !unseal {
|
||||||
|
t.Fatalf("should be unsealed")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Verify matching mount tables
|
// Verify matching mount tables
|
||||||
@@ -197,7 +203,7 @@ func TestCore_Unmount_Cleanup(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestCore_Remount(t *testing.T) {
|
func TestCore_Remount(t *testing.T) {
|
||||||
c, key, _ := TestCoreUnsealed(t)
|
c, keys, _ := TestCoreUnsealed(t)
|
||||||
err := c.remount("secret", "foo")
|
err := c.remount("secret", "foo")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("err: %v", err)
|
t.Fatalf("err: %v", err)
|
||||||
@@ -216,12 +222,14 @@ func TestCore_Remount(t *testing.T) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("err: %v", err)
|
t.Fatalf("err: %v", err)
|
||||||
}
|
}
|
||||||
unseal, err := TestCoreUnseal(c2, key)
|
for i, key := range keys {
|
||||||
if err != nil {
|
unseal, err := TestCoreUnseal(c2, key)
|
||||||
t.Fatalf("err: %v", err)
|
if err != nil {
|
||||||
}
|
t.Fatalf("err: %v", err)
|
||||||
if !unseal {
|
}
|
||||||
t.Fatalf("should be unsealed")
|
if i+1 == len(keys) && !unseal {
|
||||||
|
t.Fatalf("should be unsealed")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Verify matching mount tables
|
// Verify matching mount tables
|
||||||
|
|||||||
@@ -12,11 +12,18 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func TestCore_Rekey_Lifecycle(t *testing.T) {
|
func TestCore_Rekey_Lifecycle(t *testing.T) {
|
||||||
c, master, _ := TestCoreUnsealed(t)
|
|
||||||
testCore_Rekey_Lifecycle_Common(t, c, [][]byte{master}, false)
|
|
||||||
|
|
||||||
bc, rc := TestSealDefConfigs()
|
bc, rc := TestSealDefConfigs()
|
||||||
|
bc.SecretShares = 1
|
||||||
|
bc.SecretThreshold = 1
|
||||||
|
bc.StoredShares = 0
|
||||||
c, masterKeys, recoveryKeys, _ := TestCoreUnsealedWithConfigs(t, bc, rc)
|
c, masterKeys, recoveryKeys, _ := TestCoreUnsealedWithConfigs(t, bc, rc)
|
||||||
|
if len(masterKeys) != 1 {
|
||||||
|
t.Fatalf("expected %d keys, got %d", bc.SecretShares-bc.StoredShares, len(masterKeys))
|
||||||
|
}
|
||||||
|
testCore_Rekey_Lifecycle_Common(t, c, masterKeys, false)
|
||||||
|
|
||||||
|
bc, rc = TestSealDefConfigs()
|
||||||
|
c, masterKeys, recoveryKeys, _ = TestCoreUnsealedWithConfigs(t, bc, rc)
|
||||||
if len(masterKeys) != 3 {
|
if len(masterKeys) != 3 {
|
||||||
t.Fatalf("expected %d keys, got %d", bc.SecretShares-bc.StoredShares, len(masterKeys))
|
t.Fatalf("expected %d keys, got %d", bc.SecretShares-bc.StoredShares, len(masterKeys))
|
||||||
}
|
}
|
||||||
@@ -129,10 +136,14 @@ func testCore_Rekey_Init_Common(t *testing.T, c *Core, recovery bool) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestCore_Rekey_Update(t *testing.T) {
|
func TestCore_Rekey_Update(t *testing.T) {
|
||||||
c, master, root := TestCoreUnsealed(t)
|
|
||||||
testCore_Rekey_Update_Common(t, c, [][]byte{master}, root, false)
|
|
||||||
|
|
||||||
bc, rc := TestSealDefConfigs()
|
bc, rc := TestSealDefConfigs()
|
||||||
|
bc.SecretShares = 1
|
||||||
|
bc.SecretThreshold = 1
|
||||||
|
bc.StoredShares = 0
|
||||||
|
c, masterKeys, _, root := TestCoreUnsealedWithConfigs(t, bc, rc)
|
||||||
|
testCore_Rekey_Update_Common(t, c, masterKeys, root, false)
|
||||||
|
|
||||||
|
bc, rc = TestSealDefConfigs()
|
||||||
bc.StoredShares = 0
|
bc.StoredShares = 0
|
||||||
c, masterKeys, recoveryKeys, root := TestCoreUnsealedWithConfigs(t, bc, rc)
|
c, masterKeys, recoveryKeys, root := TestCoreUnsealedWithConfigs(t, bc, rc)
|
||||||
testCore_Rekey_Update_Common(t, c, masterKeys, root, false)
|
testCore_Rekey_Update_Common(t, c, masterKeys, root, false)
|
||||||
@@ -178,7 +189,7 @@ func testCore_Rekey_Update_Common(t *testing.T, c *Core, keys [][]byte, root str
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if result == nil || len(result.SecretShares) != 5 {
|
if result == nil || len(result.SecretShares) != newConf.SecretShares {
|
||||||
t.Fatalf("Bad: %#v", result)
|
t.Fatalf("Bad: %#v", result)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -309,9 +320,6 @@ func testCore_Rekey_Update_Common(t *testing.T, c *Core, keys [][]byte, root str
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestCore_Rekey_Invalid(t *testing.T) {
|
func TestCore_Rekey_Invalid(t *testing.T) {
|
||||||
c, master, _ := TestCoreUnsealed(t)
|
|
||||||
testCore_Rekey_Invalid_Common(t, c, [][]byte{master}, false)
|
|
||||||
|
|
||||||
bc, rc := TestSealDefConfigs()
|
bc, rc := TestSealDefConfigs()
|
||||||
bc.StoredShares = 0
|
bc.StoredShares = 0
|
||||||
bc.SecretShares = 1
|
bc.SecretShares = 1
|
||||||
@@ -372,13 +380,16 @@ func TestCore_Standby_Rekey(t *testing.T) {
|
|||||||
HAPhysical: inmha,
|
HAPhysical: inmha,
|
||||||
RedirectAddr: redirectOriginal,
|
RedirectAddr: redirectOriginal,
|
||||||
DisableMlock: true,
|
DisableMlock: true,
|
||||||
|
DisableCache: true,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("err: %v", err)
|
t.Fatalf("err: %v", err)
|
||||||
}
|
}
|
||||||
key, root := TestCoreInit(t, core)
|
keys, root := TestCoreInit(t, core)
|
||||||
if _, err := TestCoreUnseal(core, TestKeyCopy(key)); err != nil {
|
for _, key := range keys {
|
||||||
t.Fatalf("unseal err: %s", err)
|
if _, err := TestCoreUnseal(core, TestKeyCopy(key)); err != nil {
|
||||||
|
t.Fatalf("unseal err: %s", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Wait for core to become active
|
// Wait for core to become active
|
||||||
@@ -391,12 +402,15 @@ func TestCore_Standby_Rekey(t *testing.T) {
|
|||||||
HAPhysical: inmha,
|
HAPhysical: inmha,
|
||||||
RedirectAddr: redirectOriginal2,
|
RedirectAddr: redirectOriginal2,
|
||||||
DisableMlock: true,
|
DisableMlock: true,
|
||||||
|
DisableCache: true,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("err: %v", err)
|
t.Fatalf("err: %v", err)
|
||||||
}
|
}
|
||||||
if _, err := TestCoreUnseal(core2, TestKeyCopy(key)); err != nil {
|
for _, key := range keys {
|
||||||
t.Fatalf("unseal err: %s", err)
|
if _, err := TestCoreUnseal(core2, TestKeyCopy(key)); err != nil {
|
||||||
|
t.Fatalf("unseal err: %s", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Rekey the master key
|
// Rekey the master key
|
||||||
@@ -416,11 +430,14 @@ func TestCore_Standby_Rekey(t *testing.T) {
|
|||||||
if rkconf == nil {
|
if rkconf == nil {
|
||||||
t.Fatalf("bad: no rekey config received")
|
t.Fatalf("bad: no rekey config received")
|
||||||
}
|
}
|
||||||
result, err := core.RekeyUpdate(key, rkconf.Nonce, false)
|
var rekeyResult *RekeyResult
|
||||||
if err != nil {
|
for _, key := range keys {
|
||||||
t.Fatalf("err: %v", err)
|
rekeyResult, err = core.RekeyUpdate(key, rkconf.Nonce, false)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %v", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if result == nil {
|
if rekeyResult == nil {
|
||||||
t.Fatalf("rekey failed")
|
t.Fatalf("rekey failed")
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -446,11 +463,21 @@ func TestCore_Standby_Rekey(t *testing.T) {
|
|||||||
if rkconf == nil {
|
if rkconf == nil {
|
||||||
t.Fatalf("bad: no rekey config received")
|
t.Fatalf("bad: no rekey config received")
|
||||||
}
|
}
|
||||||
result, err = core2.RekeyUpdate(result.SecretShares[0], rkconf.Nonce, false)
|
var rekeyResult2 *RekeyResult
|
||||||
|
for _, key := range rekeyResult.SecretShares {
|
||||||
|
rekeyResult2, err = core2.RekeyUpdate(key, rkconf.Nonce, false)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatalf("err: %v", err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if rekeyResult2 == nil {
|
||||||
|
t.Fatalf("rekey failed")
|
||||||
|
}
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("err: %v", err)
|
t.Fatalf("err: %v", err)
|
||||||
}
|
}
|
||||||
if result == nil {
|
if rekeyResult2 == nil {
|
||||||
t.Fatalf("rekey failed")
|
t.Fatalf("rekey failed")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -160,6 +160,13 @@ func (d *DefaultSeal) SetBarrierConfig(config *SealConfig) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Provide a way to wipe out the cached value (also prevents actually
|
||||||
|
// saving a nil config)
|
||||||
|
if config == nil {
|
||||||
|
d.config = nil
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
config.Type = d.BarrierType()
|
config.Type = d.BarrierType()
|
||||||
|
|
||||||
// Encode the seal configuration
|
// Encode the seal configuration
|
||||||
|
|||||||
@@ -7,10 +7,12 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type TestSeal struct {
|
type TestSeal struct {
|
||||||
defseal *DefaultSeal
|
defseal *DefaultSeal
|
||||||
barrierKeys [][]byte
|
barrierKeys [][]byte
|
||||||
recoveryKey []byte
|
recoveryKey []byte
|
||||||
recoveryConfig *SealConfig
|
recoveryConfig *SealConfig
|
||||||
|
storedKeysDisabled bool
|
||||||
|
recoveryKeysDisabled bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func newTestSeal(t *testing.T) Seal {
|
func newTestSeal(t *testing.T) Seal {
|
||||||
@@ -43,11 +45,11 @@ func (d *TestSeal) BarrierType() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (d *TestSeal) StoredKeysSupported() bool {
|
func (d *TestSeal) StoredKeysSupported() bool {
|
||||||
return true
|
return !d.storedKeysDisabled
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *TestSeal) RecoveryKeySupported() bool {
|
func (d *TestSeal) RecoveryKeySupported() bool {
|
||||||
return true
|
return !d.recoveryKeysDisabled
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *TestSeal) SetStoredKeys(keys [][]byte) error {
|
func (d *TestSeal) SetStoredKeys(keys [][]byte) error {
|
||||||
@@ -110,8 +112,7 @@ func TestCoreUnsealedWithConfigs(t *testing.T, barrierConf, recoveryConf *SealCo
|
|||||||
}
|
}
|
||||||
if sealed, _ := core.Sealed(); sealed {
|
if sealed, _ := core.Sealed(); sealed {
|
||||||
for _, key := range result.SecretShares {
|
for _, key := range result.SecretShares {
|
||||||
if _, err := core.Unseal(key); err != nil {
|
if _, err := core.Unseal(TestKeyCopy(key)); err != nil {
|
||||||
|
|
||||||
t.Fatalf("unseal err: %s", err)
|
t.Fatalf("unseal err: %s", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
115
vault/testing.go
115
vault/testing.go
@@ -15,6 +15,7 @@ import (
|
|||||||
"time"
|
"time"
|
||||||
|
|
||||||
log "github.com/mgutz/logxi/v1"
|
log "github.com/mgutz/logxi/v1"
|
||||||
|
"github.com/mitchellh/copystructure"
|
||||||
|
|
||||||
"golang.org/x/crypto/ssh"
|
"golang.org/x/crypto/ssh"
|
||||||
|
|
||||||
@@ -142,24 +143,24 @@ func TestCoreWithSeal(t *testing.T, testSeal Seal) *Core {
|
|||||||
|
|
||||||
// TestCoreInit initializes the core with a single key, and returns
|
// TestCoreInit initializes the core with a single key, and returns
|
||||||
// the key that must be used to unseal the core and a root token.
|
// the key that must be used to unseal the core and a root token.
|
||||||
func TestCoreInit(t *testing.T, core *Core) ([]byte, string) {
|
func TestCoreInit(t *testing.T, core *Core) ([][]byte, string) {
|
||||||
return TestCoreInitClusterWrapperSetup(t, core, nil, func() (http.Handler, http.Handler) { return nil, nil })
|
return TestCoreInitClusterWrapperSetup(t, core, nil, func() (http.Handler, http.Handler) { return nil, nil })
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestCoreInitClusterWrapperSetup(t *testing.T, core *Core, clusterAddrs []*net.TCPAddr, handlerSetupFunc func() (http.Handler, http.Handler)) ([]byte, string) {
|
func TestCoreInitClusterWrapperSetup(t *testing.T, core *Core, clusterAddrs []*net.TCPAddr, handlerSetupFunc func() (http.Handler, http.Handler)) ([][]byte, string) {
|
||||||
core.SetClusterListenerAddrs(clusterAddrs)
|
core.SetClusterListenerAddrs(clusterAddrs)
|
||||||
core.SetClusterSetupFuncs(handlerSetupFunc)
|
core.SetClusterSetupFuncs(handlerSetupFunc)
|
||||||
result, err := core.Initialize(&InitParams{
|
result, err := core.Initialize(&InitParams{
|
||||||
BarrierConfig: &SealConfig{
|
BarrierConfig: &SealConfig{
|
||||||
SecretShares: 1,
|
SecretShares: 3,
|
||||||
SecretThreshold: 1,
|
SecretThreshold: 3,
|
||||||
},
|
},
|
||||||
RecoveryConfig: nil,
|
RecoveryConfig: nil,
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatalf("err: %s", err)
|
t.Fatalf("err: %s", err)
|
||||||
}
|
}
|
||||||
return result.SecretShares[0], result.RootToken
|
return result.SecretShares, result.RootToken
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestCoreUnseal(core *Core, key []byte) (bool, error) {
|
func TestCoreUnseal(core *Core, key []byte) (bool, error) {
|
||||||
@@ -169,11 +170,13 @@ func TestCoreUnseal(core *Core, key []byte) (bool, error) {
|
|||||||
|
|
||||||
// TestCoreUnsealed returns a pure in-memory core that is already
|
// TestCoreUnsealed returns a pure in-memory core that is already
|
||||||
// initialized and unsealed.
|
// initialized and unsealed.
|
||||||
func TestCoreUnsealed(t *testing.T) (*Core, []byte, string) {
|
func TestCoreUnsealed(t *testing.T) (*Core, [][]byte, string) {
|
||||||
core := TestCore(t)
|
core := TestCore(t)
|
||||||
key, token := TestCoreInit(t, core)
|
keys, token := TestCoreInit(t, core)
|
||||||
if _, err := TestCoreUnseal(core, TestKeyCopy(key)); err != nil {
|
for _, key := range keys {
|
||||||
t.Fatalf("unseal err: %s", err)
|
if _, err := TestCoreUnseal(core, TestKeyCopy(key)); err != nil {
|
||||||
|
t.Fatalf("unseal err: %s", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sealed, err := core.Sealed()
|
sealed, err := core.Sealed()
|
||||||
@@ -184,13 +187,13 @@ func TestCoreUnsealed(t *testing.T) (*Core, []byte, string) {
|
|||||||
t.Fatal("should not be sealed")
|
t.Fatal("should not be sealed")
|
||||||
}
|
}
|
||||||
|
|
||||||
return core, key, token
|
return core, keys, token
|
||||||
}
|
}
|
||||||
|
|
||||||
// TestCoreWithTokenStore returns an in-memory core that has a token store
|
// TestCoreWithTokenStore returns an in-memory core that has a token store
|
||||||
// mounted, so that logical token functions can be used
|
// mounted, so that logical token functions can be used
|
||||||
func TestCoreWithTokenStore(t *testing.T) (*Core, *TokenStore, []byte, string) {
|
func TestCoreWithTokenStore(t *testing.T) (*Core, *TokenStore, [][]byte, string) {
|
||||||
c, key, root := TestCoreUnsealed(t)
|
c, keys, root := TestCoreUnsealed(t)
|
||||||
|
|
||||||
me := &MountEntry{
|
me := &MountEntry{
|
||||||
Table: credentialTableType,
|
Table: credentialTableType,
|
||||||
@@ -219,7 +222,7 @@ func TestCoreWithTokenStore(t *testing.T) (*Core, *TokenStore, []byte, string) {
|
|||||||
exp := NewExpirationManager(router, subview, ts, logger)
|
exp := NewExpirationManager(router, subview, ts, logger)
|
||||||
ts.SetExpirationManager(exp)
|
ts.SetExpirationManager(exp)
|
||||||
|
|
||||||
return c, ts, key, root
|
return c, ts, keys, root
|
||||||
}
|
}
|
||||||
|
|
||||||
// TestKeyCopy is a silly little function to just copy the key so that
|
// TestKeyCopy is a silly little function to just copy the key so that
|
||||||
@@ -444,7 +447,7 @@ type TestClusterCore struct {
|
|||||||
*Core
|
*Core
|
||||||
Listeners []*TestListener
|
Listeners []*TestListener
|
||||||
Root string
|
Root string
|
||||||
Key []byte
|
BarrierKeys [][]byte
|
||||||
CACertBytes []byte
|
CACertBytes []byte
|
||||||
CACert *x509.Certificate
|
CACert *x509.Certificate
|
||||||
TLSConfig *tls.Config
|
TLSConfig *tls.Config
|
||||||
@@ -686,9 +689,11 @@ func TestCluster(t *testing.T, handlers []http.Handler, base *CoreConfig, unseal
|
|||||||
c2.SetClusterSetupFuncs(WrapHandlerForClustering(handlers[1], logger))
|
c2.SetClusterSetupFuncs(WrapHandlerForClustering(handlers[1], logger))
|
||||||
c3.SetClusterListenerAddrs(clusterAddrGen(c3lns))
|
c3.SetClusterListenerAddrs(clusterAddrGen(c3lns))
|
||||||
c3.SetClusterSetupFuncs(WrapHandlerForClustering(handlers[2], logger))
|
c3.SetClusterSetupFuncs(WrapHandlerForClustering(handlers[2], logger))
|
||||||
key, root := TestCoreInitClusterWrapperSetup(t, c1, clusterAddrGen(c1lns), WrapHandlerForClustering(handlers[0], logger))
|
keys, root := TestCoreInitClusterWrapperSetup(t, c1, clusterAddrGen(c1lns), WrapHandlerForClustering(handlers[0], logger))
|
||||||
if _, err := c1.Unseal(TestKeyCopy(key)); err != nil {
|
for _, key := range keys {
|
||||||
t.Fatalf("unseal err: %s", err)
|
if _, err := c1.Unseal(TestKeyCopy(key)); err != nil {
|
||||||
|
t.Fatalf("unseal err: %s", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Verify unsealed
|
// Verify unsealed
|
||||||
@@ -703,11 +708,15 @@ func TestCluster(t *testing.T, handlers []http.Handler, base *CoreConfig, unseal
|
|||||||
TestWaitActive(t, c1)
|
TestWaitActive(t, c1)
|
||||||
|
|
||||||
if unsealStandbys {
|
if unsealStandbys {
|
||||||
if _, err := c2.Unseal(TestKeyCopy(key)); err != nil {
|
for _, key := range keys {
|
||||||
t.Fatalf("unseal err: %s", err)
|
if _, err := c2.Unseal(TestKeyCopy(key)); err != nil {
|
||||||
|
t.Fatalf("unseal err: %s", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if _, err := c3.Unseal(TestKeyCopy(key)); err != nil {
|
for _, key := range keys {
|
||||||
t.Fatalf("unseal err: %s", err)
|
if _, err := c3.Unseal(TestKeyCopy(key)); err != nil {
|
||||||
|
t.Fatalf("unseal err: %s", err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Let them come fully up to standby
|
// Let them come fully up to standby
|
||||||
@@ -730,35 +739,41 @@ func TestCluster(t *testing.T, handlers []http.Handler, base *CoreConfig, unseal
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return []*TestClusterCore{
|
var ret []*TestClusterCore
|
||||||
&TestClusterCore{
|
keyCopies, _ := copystructure.Copy(keys)
|
||||||
Core: c1,
|
ret = append(ret, &TestClusterCore{
|
||||||
Listeners: c1lns,
|
Core: c1,
|
||||||
Root: root,
|
Listeners: c1lns,
|
||||||
Key: TestKeyCopy(key),
|
Root: root,
|
||||||
CACertBytes: caBytes,
|
BarrierKeys: keyCopies.([][]byte),
|
||||||
CACert: caCert,
|
CACertBytes: caBytes,
|
||||||
TLSConfig: tlsConfig,
|
CACert: caCert,
|
||||||
},
|
TLSConfig: tlsConfig,
|
||||||
&TestClusterCore{
|
})
|
||||||
Core: c2,
|
|
||||||
Listeners: c2lns,
|
keyCopies, _ = copystructure.Copy(keys)
|
||||||
Root: root,
|
ret = append(ret, &TestClusterCore{
|
||||||
Key: TestKeyCopy(key),
|
Core: c2,
|
||||||
CACertBytes: caBytes,
|
Listeners: c2lns,
|
||||||
CACert: caCert,
|
Root: root,
|
||||||
TLSConfig: tlsConfig,
|
BarrierKeys: keyCopies.([][]byte),
|
||||||
},
|
CACertBytes: caBytes,
|
||||||
&TestClusterCore{
|
CACert: caCert,
|
||||||
Core: c3,
|
TLSConfig: tlsConfig,
|
||||||
Listeners: c3lns,
|
})
|
||||||
Root: root,
|
|
||||||
Key: TestKeyCopy(key),
|
keyCopies, _ = copystructure.Copy(keys)
|
||||||
CACertBytes: caBytes,
|
ret = append(ret, &TestClusterCore{
|
||||||
CACert: caCert,
|
Core: c3,
|
||||||
TLSConfig: tlsConfig,
|
Listeners: c3lns,
|
||||||
},
|
Root: root,
|
||||||
}
|
BarrierKeys: keyCopies.([][]byte),
|
||||||
|
CACertBytes: caBytes,
|
||||||
|
CACert: caCert,
|
||||||
|
TLSConfig: tlsConfig,
|
||||||
|
})
|
||||||
|
|
||||||
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|||||||
Reference in New Issue
Block a user