|
@@ -6,6 +6,7 @@ package main
|
|
|
import (
|
|
|
"bytes"
|
|
|
"crypto/rand"
|
|
|
+ "errors"
|
|
|
"io/ioutil"
|
|
|
"os"
|
|
|
"testing"
|
|
@@ -58,17 +59,39 @@ func Test_signCert(t *testing.T) {
|
|
|
ob := &bytes.Buffer{}
|
|
|
eb := &bytes.Buffer{}
|
|
|
|
|
|
+ nopw := &StubPasswordReader{
|
|
|
+ password: []byte(""),
|
|
|
+ err: nil,
|
|
|
+ }
|
|
|
+
|
|
|
+ errpw := &StubPasswordReader{
|
|
|
+ password: []byte(""),
|
|
|
+ err: errors.New("stub error"),
|
|
|
+ }
|
|
|
+
|
|
|
+ passphrase := []byte("DO NOT USE THIS KEY")
|
|
|
+ testpw := &StubPasswordReader{
|
|
|
+ password: passphrase,
|
|
|
+ err: nil,
|
|
|
+ }
|
|
|
+
|
|
|
// required args
|
|
|
- assertHelpError(t, signCert([]string{"-ca-crt", "./nope", "-ca-key", "./nope", "-ip", "1.1.1.1/24", "-out-key", "nope", "-out-crt", "nope"}, ob, eb), "-name is required")
|
|
|
+ assertHelpError(t, signCert(
|
|
|
+ []string{"-ca-crt", "./nope", "-ca-key", "./nope", "-ip", "1.1.1.1/24", "-out-key", "nope", "-out-crt", "nope"}, ob, eb, nopw,
|
|
|
+ ), "-name is required")
|
|
|
assert.Empty(t, ob.String())
|
|
|
assert.Empty(t, eb.String())
|
|
|
|
|
|
- assertHelpError(t, signCert([]string{"-ca-crt", "./nope", "-ca-key", "./nope", "-name", "test", "-out-key", "nope", "-out-crt", "nope"}, ob, eb), "-ip is required")
|
|
|
+ assertHelpError(t, signCert(
|
|
|
+ []string{"-ca-crt", "./nope", "-ca-key", "./nope", "-name", "test", "-out-key", "nope", "-out-crt", "nope"}, ob, eb, nopw,
|
|
|
+ ), "-ip is required")
|
|
|
assert.Empty(t, ob.String())
|
|
|
assert.Empty(t, eb.String())
|
|
|
|
|
|
// cannot set -in-pub and -out-key
|
|
|
- assertHelpError(t, signCert([]string{"-ca-crt", "./nope", "-ca-key", "./nope", "-name", "test", "-in-pub", "nope", "-ip", "1.1.1.1/24", "-out-crt", "nope", "-out-key", "nope"}, ob, eb), "cannot set both -in-pub and -out-key")
|
|
|
+ assertHelpError(t, signCert(
|
|
|
+ []string{"-ca-crt", "./nope", "-ca-key", "./nope", "-name", "test", "-in-pub", "nope", "-ip", "1.1.1.1/24", "-out-crt", "nope", "-out-key", "nope"}, ob, eb, nopw,
|
|
|
+ ), "cannot set both -in-pub and -out-key")
|
|
|
assert.Empty(t, ob.String())
|
|
|
assert.Empty(t, eb.String())
|
|
|
|
|
@@ -76,7 +99,7 @@ func Test_signCert(t *testing.T) {
|
|
|
ob.Reset()
|
|
|
eb.Reset()
|
|
|
args := []string{"-ca-crt", "./nope", "-ca-key", "./nope", "-name", "test", "-ip", "1.1.1.1/24", "-out-crt", "nope", "-out-key", "nope", "-duration", "100m"}
|
|
|
- assert.EqualError(t, signCert(args, ob, eb), "error while reading ca-key: open ./nope: "+NoSuchFileError)
|
|
|
+ assert.EqualError(t, signCert(args, ob, eb, nopw), "error while reading ca-key: open ./nope: "+NoSuchFileError)
|
|
|
|
|
|
// failed to unmarshal key
|
|
|
ob.Reset()
|
|
@@ -86,7 +109,7 @@ func Test_signCert(t *testing.T) {
|
|
|
defer os.Remove(caKeyF.Name())
|
|
|
|
|
|
args = []string{"-ca-crt", "./nope", "-ca-key", caKeyF.Name(), "-name", "test", "-ip", "1.1.1.1/24", "-out-crt", "nope", "-out-key", "nope", "-duration", "100m"}
|
|
|
- assert.EqualError(t, signCert(args, ob, eb), "error while parsing ca-key: input did not contain a valid PEM encoded block")
|
|
|
+ assert.EqualError(t, signCert(args, ob, eb, nopw), "error while parsing ca-key: input did not contain a valid PEM encoded block")
|
|
|
assert.Empty(t, ob.String())
|
|
|
assert.Empty(t, eb.String())
|
|
|
|
|
@@ -98,7 +121,7 @@ func Test_signCert(t *testing.T) {
|
|
|
|
|
|
// failed to read cert
|
|
|
args = []string{"-ca-crt", "./nope", "-ca-key", caKeyF.Name(), "-name", "test", "-ip", "1.1.1.1/24", "-out-crt", "nope", "-out-key", "nope", "-duration", "100m"}
|
|
|
- assert.EqualError(t, signCert(args, ob, eb), "error while reading ca-crt: open ./nope: "+NoSuchFileError)
|
|
|
+ assert.EqualError(t, signCert(args, ob, eb, nopw), "error while reading ca-crt: open ./nope: "+NoSuchFileError)
|
|
|
assert.Empty(t, ob.String())
|
|
|
assert.Empty(t, eb.String())
|
|
|
|
|
@@ -110,7 +133,7 @@ func Test_signCert(t *testing.T) {
|
|
|
defer os.Remove(caCrtF.Name())
|
|
|
|
|
|
args = []string{"-ca-crt", caCrtF.Name(), "-ca-key", caKeyF.Name(), "-name", "test", "-ip", "1.1.1.1/24", "-out-crt", "nope", "-out-key", "nope", "-duration", "100m"}
|
|
|
- assert.EqualError(t, signCert(args, ob, eb), "error while parsing ca-crt: input did not contain a valid PEM encoded block")
|
|
|
+ assert.EqualError(t, signCert(args, ob, eb, nopw), "error while parsing ca-crt: input did not contain a valid PEM encoded block")
|
|
|
assert.Empty(t, ob.String())
|
|
|
assert.Empty(t, eb.String())
|
|
|
|
|
@@ -129,7 +152,7 @@ func Test_signCert(t *testing.T) {
|
|
|
|
|
|
// failed to read pub
|
|
|
args = []string{"-ca-crt", caCrtF.Name(), "-ca-key", caKeyF.Name(), "-name", "test", "-ip", "1.1.1.1/24", "-out-crt", "nope", "-in-pub", "./nope", "-duration", "100m"}
|
|
|
- assert.EqualError(t, signCert(args, ob, eb), "error while reading in-pub: open ./nope: "+NoSuchFileError)
|
|
|
+ assert.EqualError(t, signCert(args, ob, eb, nopw), "error while reading in-pub: open ./nope: "+NoSuchFileError)
|
|
|
assert.Empty(t, ob.String())
|
|
|
assert.Empty(t, eb.String())
|
|
|
|
|
@@ -141,7 +164,7 @@ func Test_signCert(t *testing.T) {
|
|
|
defer os.Remove(inPubF.Name())
|
|
|
|
|
|
args = []string{"-ca-crt", caCrtF.Name(), "-ca-key", caKeyF.Name(), "-name", "test", "-ip", "1.1.1.1/24", "-out-crt", "nope", "-in-pub", inPubF.Name(), "-duration", "100m"}
|
|
|
- assert.EqualError(t, signCert(args, ob, eb), "error while parsing in-pub: input did not contain a valid PEM encoded block")
|
|
|
+ assert.EqualError(t, signCert(args, ob, eb, nopw), "error while parsing in-pub: input did not contain a valid PEM encoded block")
|
|
|
assert.Empty(t, ob.String())
|
|
|
assert.Empty(t, eb.String())
|
|
|
|
|
@@ -155,14 +178,14 @@ func Test_signCert(t *testing.T) {
|
|
|
ob.Reset()
|
|
|
eb.Reset()
|
|
|
args = []string{"-ca-crt", caCrtF.Name(), "-ca-key", caKeyF.Name(), "-name", "test", "-ip", "a1.1.1.1/24", "-out-crt", "nope", "-out-key", "nope", "-duration", "100m"}
|
|
|
- assertHelpError(t, signCert(args, ob, eb), "invalid ip definition: invalid CIDR address: a1.1.1.1/24")
|
|
|
+ assertHelpError(t, signCert(args, ob, eb, nopw), "invalid ip definition: invalid CIDR address: a1.1.1.1/24")
|
|
|
assert.Empty(t, ob.String())
|
|
|
assert.Empty(t, eb.String())
|
|
|
|
|
|
ob.Reset()
|
|
|
eb.Reset()
|
|
|
args = []string{"-ca-crt", caCrtF.Name(), "-ca-key", caKeyF.Name(), "-name", "test", "-ip", "100::100/100", "-out-crt", "nope", "-out-key", "nope", "-duration", "100m"}
|
|
|
- assertHelpError(t, signCert(args, ob, eb), "invalid ip definition: can only be ipv4, have 100::100/100")
|
|
|
+ assertHelpError(t, signCert(args, ob, eb, nopw), "invalid ip definition: can only be ipv4, have 100::100/100")
|
|
|
assert.Empty(t, ob.String())
|
|
|
assert.Empty(t, eb.String())
|
|
|
|
|
@@ -170,14 +193,14 @@ func Test_signCert(t *testing.T) {
|
|
|
ob.Reset()
|
|
|
eb.Reset()
|
|
|
args = []string{"-ca-crt", caCrtF.Name(), "-ca-key", caKeyF.Name(), "-name", "test", "-ip", "1.1.1.1/24", "-out-crt", "nope", "-out-key", "nope", "-duration", "100m", "-subnets", "a"}
|
|
|
- assertHelpError(t, signCert(args, ob, eb), "invalid subnet definition: invalid CIDR address: a")
|
|
|
+ assertHelpError(t, signCert(args, ob, eb, nopw), "invalid subnet definition: invalid CIDR address: a")
|
|
|
assert.Empty(t, ob.String())
|
|
|
assert.Empty(t, eb.String())
|
|
|
|
|
|
ob.Reset()
|
|
|
eb.Reset()
|
|
|
args = []string{"-ca-crt", caCrtF.Name(), "-ca-key", caKeyF.Name(), "-name", "test", "-ip", "1.1.1.1/24", "-out-crt", "nope", "-out-key", "nope", "-duration", "100m", "-subnets", "100::100/100"}
|
|
|
- assertHelpError(t, signCert(args, ob, eb), "invalid subnet definition: can only be ipv4, have 100::100/100")
|
|
|
+ assertHelpError(t, signCert(args, ob, eb, nopw), "invalid subnet definition: can only be ipv4, have 100::100/100")
|
|
|
assert.Empty(t, ob.String())
|
|
|
assert.Empty(t, eb.String())
|
|
|
|
|
@@ -191,7 +214,7 @@ func Test_signCert(t *testing.T) {
|
|
|
ob.Reset()
|
|
|
eb.Reset()
|
|
|
args = []string{"-ca-crt", caCrtF.Name(), "-ca-key", caKeyF2.Name(), "-name", "test", "-ip", "1.1.1.1/24", "-out-crt", "nope", "-out-key", "nope", "-duration", "100m", "-subnets", "a"}
|
|
|
- assert.EqualError(t, signCert(args, ob, eb), "refusing to sign, root certificate does not match private key")
|
|
|
+ assert.EqualError(t, signCert(args, ob, eb, nopw), "refusing to sign, root certificate does not match private key")
|
|
|
assert.Empty(t, ob.String())
|
|
|
assert.Empty(t, eb.String())
|
|
|
|
|
@@ -199,7 +222,7 @@ func Test_signCert(t *testing.T) {
|
|
|
ob.Reset()
|
|
|
eb.Reset()
|
|
|
args = []string{"-ca-crt", caCrtF.Name(), "-ca-key", caKeyF.Name(), "-name", "test", "-ip", "1.1.1.1/24", "-out-crt", "/do/not/write/pleasecrt", "-out-key", "/do/not/write/pleasekey", "-duration", "100m", "-subnets", "10.1.1.1/32"}
|
|
|
- assert.EqualError(t, signCert(args, ob, eb), "error while writing out-key: open /do/not/write/pleasekey: "+NoSuchDirError)
|
|
|
+ assert.EqualError(t, signCert(args, ob, eb, nopw), "error while writing out-key: open /do/not/write/pleasekey: "+NoSuchDirError)
|
|
|
assert.Empty(t, ob.String())
|
|
|
assert.Empty(t, eb.String())
|
|
|
|
|
@@ -212,7 +235,7 @@ func Test_signCert(t *testing.T) {
|
|
|
ob.Reset()
|
|
|
eb.Reset()
|
|
|
args = []string{"-ca-crt", caCrtF.Name(), "-ca-key", caKeyF.Name(), "-name", "test", "-ip", "1.1.1.1/24", "-out-crt", "/do/not/write/pleasecrt", "-out-key", keyF.Name(), "-duration", "100m", "-subnets", "10.1.1.1/32"}
|
|
|
- assert.EqualError(t, signCert(args, ob, eb), "error while writing out-crt: open /do/not/write/pleasecrt: "+NoSuchDirError)
|
|
|
+ assert.EqualError(t, signCert(args, ob, eb, nopw), "error while writing out-crt: open /do/not/write/pleasecrt: "+NoSuchDirError)
|
|
|
assert.Empty(t, ob.String())
|
|
|
assert.Empty(t, eb.String())
|
|
|
os.Remove(keyF.Name())
|
|
@@ -226,7 +249,7 @@ func Test_signCert(t *testing.T) {
|
|
|
ob.Reset()
|
|
|
eb.Reset()
|
|
|
args = []string{"-ca-crt", caCrtF.Name(), "-ca-key", caKeyF.Name(), "-name", "test", "-ip", "1.1.1.1/24", "-out-crt", crtF.Name(), "-out-key", keyF.Name(), "-duration", "100m", "-subnets", "10.1.1.1/32, , 10.2.2.2/32 , , ,, 10.5.5.5/32", "-groups", "1,, 2 , ,,,3,4,5"}
|
|
|
- assert.Nil(t, signCert(args, ob, eb))
|
|
|
+ assert.Nil(t, signCert(args, ob, eb, nopw))
|
|
|
assert.Empty(t, ob.String())
|
|
|
assert.Empty(t, eb.String())
|
|
|
|
|
@@ -268,7 +291,7 @@ func Test_signCert(t *testing.T) {
|
|
|
ob.Reset()
|
|
|
eb.Reset()
|
|
|
args = []string{"-ca-crt", caCrtF.Name(), "-ca-key", caKeyF.Name(), "-name", "test", "-ip", "1.1.1.1/24", "-out-crt", crtF.Name(), "-in-pub", inPubF.Name(), "-duration", "100m", "-groups", "1"}
|
|
|
- assert.Nil(t, signCert(args, ob, eb))
|
|
|
+ assert.Nil(t, signCert(args, ob, eb, nopw))
|
|
|
assert.Empty(t, ob.String())
|
|
|
assert.Empty(t, eb.String())
|
|
|
|
|
@@ -283,7 +306,7 @@ func Test_signCert(t *testing.T) {
|
|
|
ob.Reset()
|
|
|
eb.Reset()
|
|
|
args = []string{"-ca-crt", caCrtF.Name(), "-ca-key", caKeyF.Name(), "-name", "test", "-ip", "1.1.1.1/24", "-out-crt", crtF.Name(), "-out-key", keyF.Name(), "-duration", "1000m", "-subnets", "10.1.1.1/32, , 10.2.2.2/32 , , ,, 10.5.5.5/32", "-groups", "1,, 2 , ,,,3,4,5"}
|
|
|
- assert.EqualError(t, signCert(args, ob, eb), "refusing to sign, root certificate constraints violated: certificate expires after signing certificate")
|
|
|
+ assert.EqualError(t, signCert(args, ob, eb, nopw), "refusing to sign, root certificate constraints violated: certificate expires after signing certificate")
|
|
|
assert.Empty(t, ob.String())
|
|
|
assert.Empty(t, eb.String())
|
|
|
|
|
@@ -291,14 +314,14 @@ func Test_signCert(t *testing.T) {
|
|
|
os.Remove(keyF.Name())
|
|
|
os.Remove(crtF.Name())
|
|
|
args = []string{"-ca-crt", caCrtF.Name(), "-ca-key", caKeyF.Name(), "-name", "test", "-ip", "1.1.1.1/24", "-out-crt", crtF.Name(), "-out-key", keyF.Name(), "-duration", "100m", "-subnets", "10.1.1.1/32, , 10.2.2.2/32 , , ,, 10.5.5.5/32", "-groups", "1,, 2 , ,,,3,4,5"}
|
|
|
- assert.Nil(t, signCert(args, ob, eb))
|
|
|
+ assert.Nil(t, signCert(args, ob, eb, nopw))
|
|
|
|
|
|
// test that we won't overwrite existing key file
|
|
|
os.Remove(crtF.Name())
|
|
|
ob.Reset()
|
|
|
eb.Reset()
|
|
|
args = []string{"-ca-crt", caCrtF.Name(), "-ca-key", caKeyF.Name(), "-name", "test", "-ip", "1.1.1.1/24", "-out-crt", crtF.Name(), "-out-key", keyF.Name(), "-duration", "100m", "-subnets", "10.1.1.1/32, , 10.2.2.2/32 , , ,, 10.5.5.5/32", "-groups", "1,, 2 , ,,,3,4,5"}
|
|
|
- assert.EqualError(t, signCert(args, ob, eb), "refusing to overwrite existing key: "+keyF.Name())
|
|
|
+ assert.EqualError(t, signCert(args, ob, eb, nopw), "refusing to overwrite existing key: "+keyF.Name())
|
|
|
assert.Empty(t, ob.String())
|
|
|
assert.Empty(t, eb.String())
|
|
|
|
|
@@ -306,14 +329,83 @@ func Test_signCert(t *testing.T) {
|
|
|
os.Remove(keyF.Name())
|
|
|
os.Remove(crtF.Name())
|
|
|
args = []string{"-ca-crt", caCrtF.Name(), "-ca-key", caKeyF.Name(), "-name", "test", "-ip", "1.1.1.1/24", "-out-crt", crtF.Name(), "-out-key", keyF.Name(), "-duration", "100m", "-subnets", "10.1.1.1/32, , 10.2.2.2/32 , , ,, 10.5.5.5/32", "-groups", "1,, 2 , ,,,3,4,5"}
|
|
|
- assert.Nil(t, signCert(args, ob, eb))
|
|
|
+ assert.Nil(t, signCert(args, ob, eb, nopw))
|
|
|
|
|
|
// test that we won't overwrite existing certificate file
|
|
|
os.Remove(keyF.Name())
|
|
|
ob.Reset()
|
|
|
eb.Reset()
|
|
|
args = []string{"-ca-crt", caCrtF.Name(), "-ca-key", caKeyF.Name(), "-name", "test", "-ip", "1.1.1.1/24", "-out-crt", crtF.Name(), "-out-key", keyF.Name(), "-duration", "100m", "-subnets", "10.1.1.1/32, , 10.2.2.2/32 , , ,, 10.5.5.5/32", "-groups", "1,, 2 , ,,,3,4,5"}
|
|
|
- assert.EqualError(t, signCert(args, ob, eb), "refusing to overwrite existing cert: "+crtF.Name())
|
|
|
+ assert.EqualError(t, signCert(args, ob, eb, nopw), "refusing to overwrite existing cert: "+crtF.Name())
|
|
|
assert.Empty(t, ob.String())
|
|
|
assert.Empty(t, eb.String())
|
|
|
+
|
|
|
+ // create valid cert/key using encrypted CA key
|
|
|
+ os.Remove(caKeyF.Name())
|
|
|
+ os.Remove(caCrtF.Name())
|
|
|
+ os.Remove(keyF.Name())
|
|
|
+ os.Remove(crtF.Name())
|
|
|
+ ob.Reset()
|
|
|
+ eb.Reset()
|
|
|
+
|
|
|
+ caKeyF, err = ioutil.TempFile("", "sign-cert.key")
|
|
|
+ assert.Nil(t, err)
|
|
|
+ defer os.Remove(caKeyF.Name())
|
|
|
+
|
|
|
+ caCrtF, err = ioutil.TempFile("", "sign-cert.crt")
|
|
|
+ assert.Nil(t, err)
|
|
|
+ defer os.Remove(caCrtF.Name())
|
|
|
+
|
|
|
+ // generate the encrypted key
|
|
|
+ caPub, caPriv, _ = ed25519.GenerateKey(rand.Reader)
|
|
|
+ kdfParams := cert.NewArgon2Parameters(64*1024, 4, 3)
|
|
|
+ b, _ = cert.EncryptAndMarshalEd25519PrivateKey(caPriv, passphrase, kdfParams)
|
|
|
+ caKeyF.Write(b)
|
|
|
+
|
|
|
+ ca = cert.NebulaCertificate{
|
|
|
+ Details: cert.NebulaCertificateDetails{
|
|
|
+ Name: "ca",
|
|
|
+ NotBefore: time.Now(),
|
|
|
+ NotAfter: time.Now().Add(time.Minute * 200),
|
|
|
+ PublicKey: caPub,
|
|
|
+ IsCA: true,
|
|
|
+ },
|
|
|
+ }
|
|
|
+ b, _ = ca.MarshalToPEM()
|
|
|
+ caCrtF.Write(b)
|
|
|
+
|
|
|
+ // test with the proper password
|
|
|
+ args = []string{"-ca-crt", caCrtF.Name(), "-ca-key", caKeyF.Name(), "-name", "test", "-ip", "1.1.1.1/24", "-out-crt", crtF.Name(), "-out-key", keyF.Name(), "-duration", "100m", "-subnets", "10.1.1.1/32, , 10.2.2.2/32 , , ,, 10.5.5.5/32", "-groups", "1,, 2 , ,,,3,4,5"}
|
|
|
+ assert.Nil(t, signCert(args, ob, eb, testpw))
|
|
|
+ assert.Equal(t, "Enter passphrase: ", ob.String())
|
|
|
+ assert.Empty(t, eb.String())
|
|
|
+
|
|
|
+ // test with the wrong password
|
|
|
+ ob.Reset()
|
|
|
+ eb.Reset()
|
|
|
+
|
|
|
+ testpw.password = []byte("invalid password")
|
|
|
+ args = []string{"-ca-crt", caCrtF.Name(), "-ca-key", caKeyF.Name(), "-name", "test", "-ip", "1.1.1.1/24", "-out-crt", crtF.Name(), "-out-key", keyF.Name(), "-duration", "100m", "-subnets", "10.1.1.1/32, , 10.2.2.2/32 , , ,, 10.5.5.5/32", "-groups", "1,, 2 , ,,,3,4,5"}
|
|
|
+ assert.Error(t, signCert(args, ob, eb, testpw))
|
|
|
+ assert.Equal(t, "Enter passphrase: ", ob.String())
|
|
|
+ assert.Empty(t, eb.String())
|
|
|
+
|
|
|
+ // test with the user not entering a password
|
|
|
+ ob.Reset()
|
|
|
+ eb.Reset()
|
|
|
+
|
|
|
+ args = []string{"-ca-crt", caCrtF.Name(), "-ca-key", caKeyF.Name(), "-name", "test", "-ip", "1.1.1.1/24", "-out-crt", crtF.Name(), "-out-key", keyF.Name(), "-duration", "100m", "-subnets", "10.1.1.1/32, , 10.2.2.2/32 , , ,, 10.5.5.5/32", "-groups", "1,, 2 , ,,,3,4,5"}
|
|
|
+ assert.Error(t, signCert(args, ob, eb, nopw))
|
|
|
+ // normally the user hitting enter on the prompt would add newlines between these
|
|
|
+ assert.Equal(t, "Enter passphrase: Enter passphrase: Enter passphrase: Enter passphrase: Enter passphrase: ", ob.String())
|
|
|
+ assert.Empty(t, eb.String())
|
|
|
+
|
|
|
+ // test an error condition
|
|
|
+ ob.Reset()
|
|
|
+ eb.Reset()
|
|
|
+
|
|
|
+ args = []string{"-ca-crt", caCrtF.Name(), "-ca-key", caKeyF.Name(), "-name", "test", "-ip", "1.1.1.1/24", "-out-crt", crtF.Name(), "-out-key", keyF.Name(), "-duration", "100m", "-subnets", "10.1.1.1/32, , 10.2.2.2/32 , , ,, 10.5.5.5/32", "-groups", "1,, 2 , ,,,3,4,5"}
|
|
|
+ assert.Error(t, signCert(args, ob, eb, errpw))
|
|
|
+ assert.Equal(t, "Enter passphrase: ", ob.String())
|
|
|
+ assert.Empty(t, eb.String())
|
|
|
}
|