| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293 | package certimport (	"testing"	"github.com/stretchr/testify/assert"	"github.com/stretchr/testify/require")func TestUnmarshalCertificateFromPEM(t *testing.T) {	goodCert := []byte(`# A good cert-----BEGIN NEBULA CERTIFICATE-----CkAKDm5lYnVsYSByb290IGNhKJfap9AFMJfg1+YGOiCUQGByMuNRhIlQBOyzXWbLvcKBwDhov900phEfJ5DN3kABEkDCq5R8qBiu8sl54yVfgRcQXEDt3cHr8UTSLszvbzBEr00kERQxxTzTsH8cpYEgRoipvmExvg8WP8NdAJEYJosB-----END NEBULA CERTIFICATE-----`)	badBanner := []byte(`# A bad banner-----BEGIN NOT A NEBULA CERTIFICATE-----CkAKDm5lYnVsYSByb290IGNhKJfap9AFMJfg1+YGOiCUQGByMuNRhIlQBOyzXWbLvcKBwDhov900phEfJ5DN3kABEkDCq5R8qBiu8sl54yVfgRcQXEDt3cHr8UTSLszvbzBEr00kERQxxTzTsH8cpYEgRoipvmExvg8WP8NdAJEYJosB-----END NOT A NEBULA CERTIFICATE-----`)	invalidPem := []byte(`# Not a valid PEM format-BEGIN NEBULA CERTIFICATE-----CkAKDm5lYnVsYSByb290IGNhKJfap9AFMJfg1+YGOiCUQGByMuNRhIlQBOyzXWbLvcKBwDhov900phEfJ5DN3kABEkDCq5R8qBiu8sl54yVfgRcQXEDt3cHr8UTSLszvbzBEr00kERQxxTzTsH8cpYEgRoipvmExvg8WP8NdAJEYJosB-END NEBULA CERTIFICATE----`)	certBundle := appendByteSlices(goodCert, badBanner, invalidPem)	// Success test case	cert, rest, err := UnmarshalCertificateFromPEM(certBundle)	assert.NotNil(t, cert)	assert.Equal(t, rest, append(badBanner, invalidPem...))	require.NoError(t, err)	// Fail due to invalid banner.	cert, rest, err = UnmarshalCertificateFromPEM(rest)	assert.Nil(t, cert)	assert.Equal(t, rest, invalidPem)	require.EqualError(t, err, "bytes did not contain a proper certificate banner")	// Fail due to ivalid PEM format, because	// it's missing the requisite pre-encapsulation boundary.	cert, rest, err = UnmarshalCertificateFromPEM(rest)	assert.Nil(t, cert)	assert.Equal(t, rest, invalidPem)	require.EqualError(t, err, "input did not contain a valid PEM encoded block")}func TestUnmarshalSigningPrivateKeyFromPEM(t *testing.T) {	privKey := []byte(`# A good key-----BEGIN NEBULA ED25519 PRIVATE KEY-----AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==-----END NEBULA ED25519 PRIVATE KEY-----`)	privP256Key := []byte(`# A good key-----BEGIN NEBULA ECDSA P256 PRIVATE KEY-----AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=-----END NEBULA ECDSA P256 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, privP256Key, shortKey, invalidBanner, invalidPem)	// Success test case	k, rest, curve, err := UnmarshalSigningPrivateKeyFromPEM(keyBundle)	assert.Len(t, k, 64)	assert.Equal(t, rest, appendByteSlices(privP256Key, shortKey, invalidBanner, invalidPem))	assert.Equal(t, Curve_CURVE25519, curve)	require.NoError(t, err)	// Success test case	k, rest, curve, err = UnmarshalSigningPrivateKeyFromPEM(rest)	assert.Len(t, k, 32)	assert.Equal(t, rest, appendByteSlices(shortKey, invalidBanner, invalidPem))	assert.Equal(t, Curve_P256, curve)	require.NoError(t, err)	// Fail due to short key	k, rest, curve, err = UnmarshalSigningPrivateKeyFromPEM(rest)	assert.Nil(t, k)	assert.Equal(t, rest, appendByteSlices(invalidBanner, invalidPem))	require.EqualError(t, err, "key was not 64 bytes, is invalid Ed25519 private key")	// Fail due to invalid banner	k, rest, curve, err = UnmarshalSigningPrivateKeyFromPEM(rest)	assert.Nil(t, k)	assert.Equal(t, rest, invalidPem)	require.EqualError(t, err, "bytes did not contain a proper Ed25519/ECDSA private key banner")	// Fail due to ivalid PEM format, because	// it's missing the requisite pre-encapsulation boundary.	k, rest, curve, err = UnmarshalSigningPrivateKeyFromPEM(rest)	assert.Nil(t, k)	assert.Equal(t, rest, invalidPem)	require.EqualError(t, err, "input did not contain a valid PEM encoded block")}func TestUnmarshalPrivateKeyFromPEM(t *testing.T) {	privKey := []byte(`# A good key-----BEGIN NEBULA X25519 PRIVATE KEY-----AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=-----END NEBULA X25519 PRIVATE KEY-----`)	privP256Key := []byte(`# A good key-----BEGIN NEBULA P256 PRIVATE KEY-----AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=-----END NEBULA P256 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, privP256Key, shortKey, invalidBanner, invalidPem)	// Success test case	k, rest, curve, err := UnmarshalPrivateKeyFromPEM(keyBundle)	assert.Len(t, k, 32)	assert.Equal(t, rest, appendByteSlices(privP256Key, shortKey, invalidBanner, invalidPem))	assert.Equal(t, Curve_CURVE25519, curve)	require.NoError(t, err)	// Success test case	k, rest, curve, err = UnmarshalPrivateKeyFromPEM(rest)	assert.Len(t, k, 32)	assert.Equal(t, rest, appendByteSlices(shortKey, invalidBanner, invalidPem))	assert.Equal(t, Curve_P256, curve)	require.NoError(t, err)	// Fail due to short key	k, rest, curve, err = UnmarshalPrivateKeyFromPEM(rest)	assert.Nil(t, k)	assert.Equal(t, rest, appendByteSlices(invalidBanner, invalidPem))	require.EqualError(t, err, "key was not 32 bytes, is invalid CURVE25519 private key")	// Fail due to invalid banner	k, rest, curve, err = UnmarshalPrivateKeyFromPEM(rest)	assert.Nil(t, k)	assert.Equal(t, rest, invalidPem)	require.EqualError(t, err, "bytes did not contain a proper private key banner")	// Fail due to ivalid PEM format, because	// it's missing the requisite pre-encapsulation boundary.	k, rest, curve, err = UnmarshalPrivateKeyFromPEM(rest)	assert.Nil(t, k)	assert.Equal(t, rest, invalidPem)	require.EqualError(t, err, "input did not contain a valid PEM encoded block")}func TestUnmarshalPublicKeyFromPEM(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, curve, err := UnmarshalPublicKeyFromPEM(keyBundle)	assert.Len(t, k, 32)	assert.Equal(t, Curve_CURVE25519, curve)	require.NoError(t, err)	assert.Equal(t, rest, appendByteSlices(shortKey, invalidBanner, invalidPem))	// Fail due to short key	k, rest, curve, err = UnmarshalPublicKeyFromPEM(rest)	assert.Nil(t, k)	assert.Equal(t, Curve_CURVE25519, curve)	assert.Equal(t, rest, appendByteSlices(invalidBanner, invalidPem))	require.EqualError(t, err, "key was not 32 bytes, is invalid CURVE25519 public key")	// Fail due to invalid banner	k, rest, curve, err = UnmarshalPublicKeyFromPEM(rest)	assert.Nil(t, k)	assert.Equal(t, Curve_CURVE25519, curve)	require.EqualError(t, err, "bytes did not contain a proper 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, curve, err = UnmarshalPublicKeyFromPEM(rest)	assert.Nil(t, k)	assert.Equal(t, Curve_CURVE25519, curve)	assert.Equal(t, rest, invalidPem)	require.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-----`)	pubP256Key := []byte(`# A good key-----BEGIN NEBULA P256 PUBLIC KEY-----AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=-----END NEBULA P256 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, pubP256Key, shortKey, invalidBanner, invalidPem)	// Success test case	k, rest, curve, err := UnmarshalPublicKeyFromPEM(keyBundle)	assert.Len(t, k, 32)	require.NoError(t, err)	assert.Equal(t, rest, appendByteSlices(pubP256Key, shortKey, invalidBanner, invalidPem))	assert.Equal(t, Curve_CURVE25519, curve)	// Success test case	k, rest, curve, err = UnmarshalPublicKeyFromPEM(rest)	assert.Len(t, k, 65)	require.NoError(t, err)	assert.Equal(t, rest, appendByteSlices(shortKey, invalidBanner, invalidPem))	assert.Equal(t, Curve_P256, curve)	// Fail due to short key	k, rest, curve, err = UnmarshalPublicKeyFromPEM(rest)	assert.Nil(t, k)	assert.Equal(t, rest, appendByteSlices(invalidBanner, invalidPem))	require.EqualError(t, err, "key was not 32 bytes, is invalid CURVE25519 public key")	// Fail due to invalid banner	k, rest, curve, err = UnmarshalPublicKeyFromPEM(rest)	assert.Nil(t, k)	require.EqualError(t, err, "bytes did not contain a proper 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, curve, err = UnmarshalPublicKeyFromPEM(rest)	assert.Nil(t, k)	assert.Equal(t, rest, invalidPem)	require.EqualError(t, err, "input did not contain a valid PEM encoded block")}
 |