|
@@ -447,6 +447,255 @@ BVG+oJpAoqokUBbI4U0N8CSfpUABEkB/Pm5A2xyH/nc8mg/wvGUWG3pZ7nHzaDMf
|
|
assert.Equal(t, pp.CAs[string("5c9c3f23e7ee7fe97637cbd3a0a5b854154d1d9aaaf7b566a51f4a88f76b64cd")].Details.Name, rootCA01.Details.Name)
|
|
assert.Equal(t, pp.CAs[string("5c9c3f23e7ee7fe97637cbd3a0a5b854154d1d9aaaf7b566a51f4a88f76b64cd")].Details.Name, rootCA01.Details.Name)
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+func appendByteSlices(b ...[]byte) []byte {
|
|
|
|
+ retSlice := []byte{}
|
|
|
|
+ for _, v := range b {
|
|
|
|
+ retSlice = append(retSlice, v...)
|
|
|
|
+ }
|
|
|
|
+ return retSlice
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func TestUnmrshalCertPEM(t *testing.T) {
|
|
|
|
+ goodCert := []byte(`
|
|
|
|
+# A good cert
|
|
|
|
+-----BEGIN NEBULA CERTIFICATE-----
|
|
|
|
+CkAKDm5lYnVsYSByb290IGNhKJfap9AFMJfg1+YGOiCUQGByMuNRhIlQBOyzXWbL
|
|
|
|
+vcKBwDhov900phEfJ5DN3kABEkDCq5R8qBiu8sl54yVfgRcQXEDt3cHr8UTSLszv
|
|
|
|
+bzBEr00kERQxxTzTsH8cpYEgRoipvmExvg8WP8NdAJEYJosB
|
|
|
|
+-----END NEBULA CERTIFICATE-----
|
|
|
|
+`)
|
|
|
|
+ badBanner := []byte(`# A bad banner
|
|
|
|
+-----BEGIN NOT A NEBULA CERTIFICATE-----
|
|
|
|
+CkAKDm5lYnVsYSByb290IGNhKJfap9AFMJfg1+YGOiCUQGByMuNRhIlQBOyzXWbL
|
|
|
|
+vcKBwDhov900phEfJ5DN3kABEkDCq5R8qBiu8sl54yVfgRcQXEDt3cHr8UTSLszv
|
|
|
|
+bzBEr00kERQxxTzTsH8cpYEgRoipvmExvg8WP8NdAJEYJosB
|
|
|
|
+-----END NOT A NEBULA CERTIFICATE-----
|
|
|
|
+`)
|
|
|
|
+ invalidPem := []byte(`# Not a valid PEM format
|
|
|
|
+-BEGIN NEBULA CERTIFICATE-----
|
|
|
|
+CkAKDm5lYnVsYSByb290IGNhKJfap9AFMJfg1+YGOiCUQGByMuNRhIlQBOyzXWbL
|
|
|
|
+vcKBwDhov900phEfJ5DN3kABEkDCq5R8qBiu8sl54yVfgRcQXEDt3cHr8UTSLszv
|
|
|
|
+bzBEr00kERQxxTzTsH8cpYEgRoipvmExvg8WP8NdAJEYJosB
|
|
|
|
+-END NEBULA CERTIFICATE----`)
|
|
|
|
+
|
|
|
|
+ certBundle := appendByteSlices(goodCert, badBanner, invalidPem)
|
|
|
|
+
|
|
|
|
+ // Success test case
|
|
|
|
+ cert, rest, err := UnmarshalNebulaCertificateFromPEM(certBundle)
|
|
|
|
+ assert.NotNil(t, cert)
|
|
|
|
+ assert.Equal(t, rest, append(badBanner, invalidPem...))
|
|
|
|
+ assert.Nil(t, err)
|
|
|
|
+
|
|
|
|
+ // Fail due to invalid banner.
|
|
|
|
+ cert, rest, err = UnmarshalNebulaCertificateFromPEM(rest)
|
|
|
|
+ assert.Nil(t, cert)
|
|
|
|
+ assert.Equal(t, rest, invalidPem)
|
|
|
|
+ assert.EqualError(t, err, "bytes did not contain a proper nebula certificate banner")
|
|
|
|
+
|
|
|
|
+ // Fail due to ivalid PEM format, because
|
|
|
|
+ // it's missing the requisite pre-encapsulation boundary.
|
|
|
|
+ cert, rest, err = UnmarshalNebulaCertificateFromPEM(rest)
|
|
|
|
+ assert.Nil(t, cert)
|
|
|
|
+ assert.Equal(t, rest, invalidPem)
|
|
|
|
+ assert.EqualError(t, err, "input did not contain a valid PEM encoded block")
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func TestUnmarshalEd25519PrivateKey(t *testing.T) {
|
|
|
|
+ privKey := []byte(`# A good key
|
|
|
|
+-----BEGIN NEBULA ED25519 PRIVATE KEY-----
|
|
|
|
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
|
|
|
|
+-----END NEBULA ED25519 PRIVATE KEY-----
|
|
|
|
+`)
|
|
|
|
+ shortKey := []byte(`# A short key
|
|
|
|
+-----BEGIN NEBULA ED25519 PRIVATE KEY-----
|
|
|
|
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
|
|
|
|
+-----END NEBULA ED25519 PRIVATE KEY-----
|
|
|
|
+`)
|
|
|
|
+ invalidBanner := []byte(`# Invalid banner
|
|
|
|
+-----BEGIN NOT A NEBULA PRIVATE KEY-----
|
|
|
|
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
|
|
|
|
+-----END NOT A NEBULA PRIVATE KEY-----
|
|
|
|
+`)
|
|
|
|
+ invalidPem := []byte(`# Not a valid PEM format
|
|
|
|
+-BEGIN NEBULA ED25519 PRIVATE KEY-----
|
|
|
|
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
|
|
|
|
+-END NEBULA ED25519 PRIVATE KEY-----`)
|
|
|
|
+
|
|
|
|
+ keyBundle := appendByteSlices(privKey, shortKey, invalidBanner, invalidPem)
|
|
|
|
+
|
|
|
|
+ // Success test case
|
|
|
|
+ k, rest, err := UnmarshalEd25519PrivateKey(keyBundle)
|
|
|
|
+ assert.Len(t, k, 64)
|
|
|
|
+ assert.Equal(t, rest, appendByteSlices(shortKey, invalidBanner, invalidPem))
|
|
|
|
+ assert.Nil(t, err)
|
|
|
|
+
|
|
|
|
+ // Fail due to short key
|
|
|
|
+ k, rest, err = UnmarshalEd25519PrivateKey(rest)
|
|
|
|
+ assert.Nil(t, k)
|
|
|
|
+ assert.Equal(t, rest, appendByteSlices(invalidBanner, invalidPem))
|
|
|
|
+ assert.EqualError(t, err, "key was not 64 bytes, is invalid ed25519 private key")
|
|
|
|
+
|
|
|
|
+ // Fail due to invalid banner
|
|
|
|
+ k, rest, err = UnmarshalEd25519PrivateKey(rest)
|
|
|
|
+ assert.Nil(t, k)
|
|
|
|
+ assert.Equal(t, rest, invalidPem)
|
|
|
|
+ assert.EqualError(t, err, "bytes did not contain a proper nebula Ed25519 private key banner")
|
|
|
|
+
|
|
|
|
+ // Fail due to ivalid PEM format, because
|
|
|
|
+ // it's missing the requisite pre-encapsulation boundary.
|
|
|
|
+ k, rest, err = UnmarshalEd25519PrivateKey(rest)
|
|
|
|
+ assert.Nil(t, k)
|
|
|
|
+ assert.Equal(t, rest, invalidPem)
|
|
|
|
+ assert.EqualError(t, err, "input did not contain a valid PEM encoded block")
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func TestUnmarshalX25519PrivateKey(t *testing.T) {
|
|
|
|
+ privKey := []byte(`# A good key
|
|
|
|
+-----BEGIN NEBULA X25519 PRIVATE KEY-----
|
|
|
|
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
|
|
|
|
+-----END NEBULA X25519 PRIVATE KEY-----
|
|
|
|
+`)
|
|
|
|
+ shortKey := []byte(`# A short key
|
|
|
|
+-----BEGIN NEBULA X25519 PRIVATE KEY-----
|
|
|
|
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
|
|
|
|
+-----END NEBULA X25519 PRIVATE KEY-----
|
|
|
|
+`)
|
|
|
|
+ invalidBanner := []byte(`# Invalid banner
|
|
|
|
+-----BEGIN NOT A NEBULA PRIVATE KEY-----
|
|
|
|
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
|
|
|
|
+-----END NOT A NEBULA PRIVATE KEY-----
|
|
|
|
+`)
|
|
|
|
+ invalidPem := []byte(`# Not a valid PEM format
|
|
|
|
+-BEGIN NEBULA X25519 PRIVATE KEY-----
|
|
|
|
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
|
|
|
|
+-END NEBULA X25519 PRIVATE KEY-----`)
|
|
|
|
+
|
|
|
|
+ keyBundle := appendByteSlices(privKey, shortKey, invalidBanner, invalidPem)
|
|
|
|
+
|
|
|
|
+ // Success test case
|
|
|
|
+ k, rest, err := UnmarshalX25519PrivateKey(keyBundle)
|
|
|
|
+ assert.Len(t, k, 32)
|
|
|
|
+ assert.Equal(t, rest, appendByteSlices(shortKey, invalidBanner, invalidPem))
|
|
|
|
+ assert.Nil(t, err)
|
|
|
|
+
|
|
|
|
+ // Fail due to short key
|
|
|
|
+ k, rest, err = UnmarshalX25519PrivateKey(rest)
|
|
|
|
+ assert.Nil(t, k)
|
|
|
|
+ assert.Equal(t, rest, appendByteSlices(invalidBanner, invalidPem))
|
|
|
|
+ assert.EqualError(t, err, "key was not 32 bytes, is invalid X25519 private key")
|
|
|
|
+
|
|
|
|
+ // Fail due to invalid banner
|
|
|
|
+ k, rest, err = UnmarshalX25519PrivateKey(rest)
|
|
|
|
+ assert.Nil(t, k)
|
|
|
|
+ assert.Equal(t, rest, invalidPem)
|
|
|
|
+ assert.EqualError(t, err, "bytes did not contain a proper nebula X25519 private key banner")
|
|
|
|
+
|
|
|
|
+ // Fail due to ivalid PEM format, because
|
|
|
|
+ // it's missing the requisite pre-encapsulation boundary.
|
|
|
|
+ k, rest, err = UnmarshalX25519PrivateKey(rest)
|
|
|
|
+ assert.Nil(t, k)
|
|
|
|
+ assert.Equal(t, rest, invalidPem)
|
|
|
|
+ assert.EqualError(t, err, "input did not contain a valid PEM encoded block")
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func TestUnmarshalEd25519PublicKey(t *testing.T) {
|
|
|
|
+ pubKey := []byte(`# A good key
|
|
|
|
+-----BEGIN NEBULA ED25519 PUBLIC KEY-----
|
|
|
|
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
|
|
|
|
+-----END NEBULA ED25519 PUBLIC KEY-----
|
|
|
|
+`)
|
|
|
|
+ shortKey := []byte(`# A short key
|
|
|
|
+-----BEGIN NEBULA ED25519 PUBLIC KEY-----
|
|
|
|
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
|
|
|
|
+-----END NEBULA ED25519 PUBLIC KEY-----
|
|
|
|
+`)
|
|
|
|
+ invalidBanner := []byte(`# Invalid banner
|
|
|
|
+-----BEGIN NOT A NEBULA PUBLIC KEY-----
|
|
|
|
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
|
|
|
|
+-----END NOT A NEBULA PUBLIC KEY-----
|
|
|
|
+`)
|
|
|
|
+ invalidPem := []byte(`# Not a valid PEM format
|
|
|
|
+-BEGIN NEBULA ED25519 PUBLIC KEY-----
|
|
|
|
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
|
|
|
|
+-END NEBULA ED25519 PUBLIC KEY-----`)
|
|
|
|
+
|
|
|
|
+ keyBundle := appendByteSlices(pubKey, shortKey, invalidBanner, invalidPem)
|
|
|
|
+
|
|
|
|
+ // Success test case
|
|
|
|
+ k, rest, err := UnmarshalEd25519PublicKey(keyBundle)
|
|
|
|
+ assert.Equal(t, len(k), 32)
|
|
|
|
+ assert.Nil(t, err)
|
|
|
|
+ assert.Equal(t, rest, appendByteSlices(shortKey, invalidBanner, invalidPem))
|
|
|
|
+
|
|
|
|
+ // Fail due to short key
|
|
|
|
+ k, rest, err = UnmarshalEd25519PublicKey(rest)
|
|
|
|
+ assert.Nil(t, k)
|
|
|
|
+ assert.Equal(t, rest, appendByteSlices(invalidBanner, invalidPem))
|
|
|
|
+ assert.EqualError(t, err, "key was not 32 bytes, is invalid ed25519 public key")
|
|
|
|
+
|
|
|
|
+ // Fail due to invalid banner
|
|
|
|
+ k, rest, err = UnmarshalEd25519PublicKey(rest)
|
|
|
|
+ assert.Nil(t, k)
|
|
|
|
+ assert.EqualError(t, err, "bytes did not contain a proper nebula Ed25519 public key banner")
|
|
|
|
+ assert.Equal(t, rest, invalidPem)
|
|
|
|
+
|
|
|
|
+ // Fail due to ivalid PEM format, because
|
|
|
|
+ // it's missing the requisite pre-encapsulation boundary.
|
|
|
|
+ k, rest, err = UnmarshalEd25519PublicKey(rest)
|
|
|
|
+ assert.Nil(t, k)
|
|
|
|
+ assert.Equal(t, rest, invalidPem)
|
|
|
|
+ assert.EqualError(t, err, "input did not contain a valid PEM encoded block")
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+func TestUnmarshalX25519PublicKey(t *testing.T) {
|
|
|
|
+ pubKey := []byte(`# A good key
|
|
|
|
+-----BEGIN NEBULA X25519 PUBLIC KEY-----
|
|
|
|
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
|
|
|
|
+-----END NEBULA X25519 PUBLIC KEY-----
|
|
|
|
+`)
|
|
|
|
+ shortKey := []byte(`# A short key
|
|
|
|
+-----BEGIN NEBULA X25519 PUBLIC KEY-----
|
|
|
|
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
|
|
|
|
+-----END NEBULA X25519 PUBLIC KEY-----
|
|
|
|
+`)
|
|
|
|
+ invalidBanner := []byte(`# Invalid banner
|
|
|
|
+-----BEGIN NOT A NEBULA PUBLIC KEY-----
|
|
|
|
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
|
|
|
|
+-----END NOT A NEBULA PUBLIC KEY-----
|
|
|
|
+`)
|
|
|
|
+ invalidPem := []byte(`# Not a valid PEM format
|
|
|
|
+-BEGIN NEBULA X25519 PUBLIC KEY-----
|
|
|
|
+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
|
|
|
|
+-END NEBULA X25519 PUBLIC KEY-----`)
|
|
|
|
+
|
|
|
|
+ keyBundle := appendByteSlices(pubKey, shortKey, invalidBanner, invalidPem)
|
|
|
|
+
|
|
|
|
+ // Success test case
|
|
|
|
+ k, rest, err := UnmarshalX25519PublicKey(keyBundle)
|
|
|
|
+ assert.Equal(t, len(k), 32)
|
|
|
|
+ assert.Nil(t, err)
|
|
|
|
+ assert.Equal(t, rest, appendByteSlices(shortKey, invalidBanner, invalidPem))
|
|
|
|
+
|
|
|
|
+ // Fail due to short key
|
|
|
|
+ k, rest, err = UnmarshalX25519PublicKey(rest)
|
|
|
|
+ assert.Nil(t, k)
|
|
|
|
+ assert.Equal(t, rest, appendByteSlices(invalidBanner, invalidPem))
|
|
|
|
+ assert.EqualError(t, err, "key was not 32 bytes, is invalid X25519 public key")
|
|
|
|
+
|
|
|
|
+ // Fail due to invalid banner
|
|
|
|
+ k, rest, err = UnmarshalX25519PublicKey(rest)
|
|
|
|
+ assert.Nil(t, k)
|
|
|
|
+ assert.EqualError(t, err, "bytes did not contain a proper nebula X25519 public key banner")
|
|
|
|
+ assert.Equal(t, rest, invalidPem)
|
|
|
|
+
|
|
|
|
+ // Fail due to ivalid PEM format, because
|
|
|
|
+ // it's missing the requisite pre-encapsulation boundary.
|
|
|
|
+ k, rest, err = UnmarshalX25519PublicKey(rest)
|
|
|
|
+ assert.Nil(t, k)
|
|
|
|
+ assert.Equal(t, rest, invalidPem)
|
|
|
|
+ assert.EqualError(t, err, "input did not contain a valid PEM encoded block")
|
|
|
|
+}
|
|
|
|
+
|
|
// Ensure that upgrading the protobuf library does not change how certificates
|
|
// Ensure that upgrading the protobuf library does not change how certificates
|
|
// are marshalled, since this would break signature verification
|
|
// are marshalled, since this would break signature verification
|
|
func TestMarshalingNebulaCertificateConsistency(t *testing.T) {
|
|
func TestMarshalingNebulaCertificateConsistency(t *testing.T) {
|