pem_test.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  1. package cert
  2. import (
  3. "testing"
  4. "github.com/stretchr/testify/assert"
  5. "github.com/stretchr/testify/require"
  6. )
  7. func TestUnmarshalCertificateFromPEM(t *testing.T) {
  8. goodCert := []byte(`
  9. # A good cert
  10. -----BEGIN NEBULA CERTIFICATE-----
  11. CkAKDm5lYnVsYSByb290IGNhKJfap9AFMJfg1+YGOiCUQGByMuNRhIlQBOyzXWbL
  12. vcKBwDhov900phEfJ5DN3kABEkDCq5R8qBiu8sl54yVfgRcQXEDt3cHr8UTSLszv
  13. bzBEr00kERQxxTzTsH8cpYEgRoipvmExvg8WP8NdAJEYJosB
  14. -----END NEBULA CERTIFICATE-----
  15. `)
  16. badBanner := []byte(`# A bad banner
  17. -----BEGIN NOT A NEBULA CERTIFICATE-----
  18. CkAKDm5lYnVsYSByb290IGNhKJfap9AFMJfg1+YGOiCUQGByMuNRhIlQBOyzXWbL
  19. vcKBwDhov900phEfJ5DN3kABEkDCq5R8qBiu8sl54yVfgRcQXEDt3cHr8UTSLszv
  20. bzBEr00kERQxxTzTsH8cpYEgRoipvmExvg8WP8NdAJEYJosB
  21. -----END NOT A NEBULA CERTIFICATE-----
  22. `)
  23. invalidPem := []byte(`# Not a valid PEM format
  24. -BEGIN NEBULA CERTIFICATE-----
  25. CkAKDm5lYnVsYSByb290IGNhKJfap9AFMJfg1+YGOiCUQGByMuNRhIlQBOyzXWbL
  26. vcKBwDhov900phEfJ5DN3kABEkDCq5R8qBiu8sl54yVfgRcQXEDt3cHr8UTSLszv
  27. bzBEr00kERQxxTzTsH8cpYEgRoipvmExvg8WP8NdAJEYJosB
  28. -END NEBULA CERTIFICATE----`)
  29. certBundle := appendByteSlices(goodCert, badBanner, invalidPem)
  30. // Success test case
  31. cert, rest, err := UnmarshalCertificateFromPEM(certBundle)
  32. assert.NotNil(t, cert)
  33. assert.Equal(t, rest, append(badBanner, invalidPem...))
  34. require.NoError(t, err)
  35. // Fail due to invalid banner.
  36. cert, rest, err = UnmarshalCertificateFromPEM(rest)
  37. assert.Nil(t, cert)
  38. assert.Equal(t, rest, invalidPem)
  39. require.EqualError(t, err, "bytes did not contain a proper certificate banner")
  40. // Fail due to ivalid PEM format, because
  41. // it's missing the requisite pre-encapsulation boundary.
  42. cert, rest, err = UnmarshalCertificateFromPEM(rest)
  43. assert.Nil(t, cert)
  44. assert.Equal(t, rest, invalidPem)
  45. require.EqualError(t, err, "input did not contain a valid PEM encoded block")
  46. }
  47. func TestUnmarshalSigningPrivateKeyFromPEM(t *testing.T) {
  48. privKey := []byte(`# A good key
  49. -----BEGIN NEBULA ED25519 PRIVATE KEY-----
  50. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
  51. -----END NEBULA ED25519 PRIVATE KEY-----
  52. `)
  53. privP256Key := []byte(`# A good key
  54. -----BEGIN NEBULA ECDSA P256 PRIVATE KEY-----
  55. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
  56. -----END NEBULA ECDSA P256 PRIVATE KEY-----
  57. `)
  58. shortKey := []byte(`# A short key
  59. -----BEGIN NEBULA ED25519 PRIVATE KEY-----
  60. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  61. -----END NEBULA ED25519 PRIVATE KEY-----
  62. `)
  63. invalidBanner := []byte(`# Invalid banner
  64. -----BEGIN NOT A NEBULA PRIVATE KEY-----
  65. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
  66. -----END NOT A NEBULA PRIVATE KEY-----
  67. `)
  68. invalidPem := []byte(`# Not a valid PEM format
  69. -BEGIN NEBULA ED25519 PRIVATE KEY-----
  70. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
  71. -END NEBULA ED25519 PRIVATE KEY-----`)
  72. keyBundle := appendByteSlices(privKey, privP256Key, shortKey, invalidBanner, invalidPem)
  73. // Success test case
  74. k, rest, curve, err := UnmarshalSigningPrivateKeyFromPEM(keyBundle)
  75. assert.Len(t, k, 64)
  76. assert.Equal(t, rest, appendByteSlices(privP256Key, shortKey, invalidBanner, invalidPem))
  77. assert.Equal(t, Curve_CURVE25519, curve)
  78. require.NoError(t, err)
  79. // Success test case
  80. k, rest, curve, err = UnmarshalSigningPrivateKeyFromPEM(rest)
  81. assert.Len(t, k, 32)
  82. assert.Equal(t, rest, appendByteSlices(shortKey, invalidBanner, invalidPem))
  83. assert.Equal(t, Curve_P256, curve)
  84. require.NoError(t, err)
  85. // Fail due to short key
  86. k, rest, curve, err = UnmarshalSigningPrivateKeyFromPEM(rest)
  87. assert.Nil(t, k)
  88. assert.Equal(t, rest, appendByteSlices(invalidBanner, invalidPem))
  89. require.EqualError(t, err, "key was not 64 bytes, is invalid Ed25519 private key")
  90. // Fail due to invalid banner
  91. k, rest, curve, err = UnmarshalSigningPrivateKeyFromPEM(rest)
  92. assert.Nil(t, k)
  93. assert.Equal(t, rest, invalidPem)
  94. require.EqualError(t, err, "bytes did not contain a proper Ed25519/ECDSA private key banner")
  95. // Fail due to ivalid PEM format, because
  96. // it's missing the requisite pre-encapsulation boundary.
  97. k, rest, curve, err = UnmarshalSigningPrivateKeyFromPEM(rest)
  98. assert.Nil(t, k)
  99. assert.Equal(t, rest, invalidPem)
  100. require.EqualError(t, err, "input did not contain a valid PEM encoded block")
  101. }
  102. func TestUnmarshalPrivateKeyFromPEM(t *testing.T) {
  103. privKey := []byte(`# A good key
  104. -----BEGIN NEBULA X25519 PRIVATE KEY-----
  105. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
  106. -----END NEBULA X25519 PRIVATE KEY-----
  107. `)
  108. privP256Key := []byte(`# A good key
  109. -----BEGIN NEBULA P256 PRIVATE KEY-----
  110. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
  111. -----END NEBULA P256 PRIVATE KEY-----
  112. `)
  113. shortKey := []byte(`# A short key
  114. -----BEGIN NEBULA X25519 PRIVATE KEY-----
  115. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
  116. -----END NEBULA X25519 PRIVATE KEY-----
  117. `)
  118. invalidBanner := []byte(`# Invalid banner
  119. -----BEGIN NOT A NEBULA PRIVATE KEY-----
  120. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
  121. -----END NOT A NEBULA PRIVATE KEY-----
  122. `)
  123. invalidPem := []byte(`# Not a valid PEM format
  124. -BEGIN NEBULA X25519 PRIVATE KEY-----
  125. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
  126. -END NEBULA X25519 PRIVATE KEY-----`)
  127. keyBundle := appendByteSlices(privKey, privP256Key, shortKey, invalidBanner, invalidPem)
  128. // Success test case
  129. k, rest, curve, err := UnmarshalPrivateKeyFromPEM(keyBundle)
  130. assert.Len(t, k, 32)
  131. assert.Equal(t, rest, appendByteSlices(privP256Key, shortKey, invalidBanner, invalidPem))
  132. assert.Equal(t, Curve_CURVE25519, curve)
  133. require.NoError(t, err)
  134. // Success test case
  135. k, rest, curve, err = UnmarshalPrivateKeyFromPEM(rest)
  136. assert.Len(t, k, 32)
  137. assert.Equal(t, rest, appendByteSlices(shortKey, invalidBanner, invalidPem))
  138. assert.Equal(t, Curve_P256, curve)
  139. require.NoError(t, err)
  140. // Fail due to short key
  141. k, rest, curve, err = UnmarshalPrivateKeyFromPEM(rest)
  142. assert.Nil(t, k)
  143. assert.Equal(t, rest, appendByteSlices(invalidBanner, invalidPem))
  144. require.EqualError(t, err, "key was not 32 bytes, is invalid CURVE25519 private key")
  145. // Fail due to invalid banner
  146. k, rest, curve, err = UnmarshalPrivateKeyFromPEM(rest)
  147. assert.Nil(t, k)
  148. assert.Equal(t, rest, invalidPem)
  149. require.EqualError(t, err, "bytes did not contain a proper private key banner")
  150. // Fail due to ivalid PEM format, because
  151. // it's missing the requisite pre-encapsulation boundary.
  152. k, rest, curve, err = UnmarshalPrivateKeyFromPEM(rest)
  153. assert.Nil(t, k)
  154. assert.Equal(t, rest, invalidPem)
  155. require.EqualError(t, err, "input did not contain a valid PEM encoded block")
  156. }
  157. func TestUnmarshalPublicKeyFromPEM(t *testing.T) {
  158. pubKey := []byte(`# A good key
  159. -----BEGIN NEBULA ED25519 PUBLIC KEY-----
  160. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
  161. -----END NEBULA ED25519 PUBLIC KEY-----
  162. `)
  163. shortKey := []byte(`# A short key
  164. -----BEGIN NEBULA ED25519 PUBLIC KEY-----
  165. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
  166. -----END NEBULA ED25519 PUBLIC KEY-----
  167. `)
  168. invalidBanner := []byte(`# Invalid banner
  169. -----BEGIN NOT A NEBULA PUBLIC KEY-----
  170. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
  171. -----END NOT A NEBULA PUBLIC KEY-----
  172. `)
  173. invalidPem := []byte(`# Not a valid PEM format
  174. -BEGIN NEBULA ED25519 PUBLIC KEY-----
  175. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
  176. -END NEBULA ED25519 PUBLIC KEY-----`)
  177. keyBundle := appendByteSlices(pubKey, shortKey, invalidBanner, invalidPem)
  178. // Success test case
  179. k, rest, curve, err := UnmarshalPublicKeyFromPEM(keyBundle)
  180. assert.Len(t, k, 32)
  181. assert.Equal(t, Curve_CURVE25519, curve)
  182. require.NoError(t, err)
  183. assert.Equal(t, rest, appendByteSlices(shortKey, invalidBanner, invalidPem))
  184. // Fail due to short key
  185. k, rest, curve, err = UnmarshalPublicKeyFromPEM(rest)
  186. assert.Nil(t, k)
  187. assert.Equal(t, Curve_CURVE25519, curve)
  188. assert.Equal(t, rest, appendByteSlices(invalidBanner, invalidPem))
  189. require.EqualError(t, err, "key was not 32 bytes, is invalid CURVE25519 public key")
  190. // Fail due to invalid banner
  191. k, rest, curve, err = UnmarshalPublicKeyFromPEM(rest)
  192. assert.Nil(t, k)
  193. assert.Equal(t, Curve_CURVE25519, curve)
  194. require.EqualError(t, err, "bytes did not contain a proper public key banner")
  195. assert.Equal(t, rest, invalidPem)
  196. // Fail due to ivalid PEM format, because
  197. // it's missing the requisite pre-encapsulation boundary.
  198. k, rest, curve, err = UnmarshalPublicKeyFromPEM(rest)
  199. assert.Nil(t, k)
  200. assert.Equal(t, Curve_CURVE25519, curve)
  201. assert.Equal(t, rest, invalidPem)
  202. require.EqualError(t, err, "input did not contain a valid PEM encoded block")
  203. }
  204. func TestUnmarshalX25519PublicKey(t *testing.T) {
  205. pubKey := []byte(`# A good key
  206. -----BEGIN NEBULA X25519 PUBLIC KEY-----
  207. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
  208. -----END NEBULA X25519 PUBLIC KEY-----
  209. `)
  210. pubP256Key := []byte(`# A good key
  211. -----BEGIN NEBULA P256 PUBLIC KEY-----
  212. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  213. AAAAAAAAAAAAAAAAAAAAAAA=
  214. -----END NEBULA P256 PUBLIC KEY-----
  215. `)
  216. shortKey := []byte(`# A short key
  217. -----BEGIN NEBULA X25519 PUBLIC KEY-----
  218. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
  219. -----END NEBULA X25519 PUBLIC KEY-----
  220. `)
  221. invalidBanner := []byte(`# Invalid banner
  222. -----BEGIN NOT A NEBULA PUBLIC KEY-----
  223. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
  224. -----END NOT A NEBULA PUBLIC KEY-----
  225. `)
  226. invalidPem := []byte(`# Not a valid PEM format
  227. -BEGIN NEBULA X25519 PUBLIC KEY-----
  228. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
  229. -END NEBULA X25519 PUBLIC KEY-----`)
  230. keyBundle := appendByteSlices(pubKey, pubP256Key, shortKey, invalidBanner, invalidPem)
  231. // Success test case
  232. k, rest, curve, err := UnmarshalPublicKeyFromPEM(keyBundle)
  233. assert.Len(t, k, 32)
  234. require.NoError(t, err)
  235. assert.Equal(t, rest, appendByteSlices(pubP256Key, shortKey, invalidBanner, invalidPem))
  236. assert.Equal(t, Curve_CURVE25519, curve)
  237. // Success test case
  238. k, rest, curve, err = UnmarshalPublicKeyFromPEM(rest)
  239. assert.Len(t, k, 65)
  240. require.NoError(t, err)
  241. assert.Equal(t, rest, appendByteSlices(shortKey, invalidBanner, invalidPem))
  242. assert.Equal(t, Curve_P256, curve)
  243. // Fail due to short key
  244. k, rest, curve, err = UnmarshalPublicKeyFromPEM(rest)
  245. assert.Nil(t, k)
  246. assert.Equal(t, rest, appendByteSlices(invalidBanner, invalidPem))
  247. require.EqualError(t, err, "key was not 32 bytes, is invalid CURVE25519 public key")
  248. // Fail due to invalid banner
  249. k, rest, curve, err = UnmarshalPublicKeyFromPEM(rest)
  250. assert.Nil(t, k)
  251. require.EqualError(t, err, "bytes did not contain a proper public key banner")
  252. assert.Equal(t, rest, invalidPem)
  253. // Fail due to ivalid PEM format, because
  254. // it's missing the requisite pre-encapsulation boundary.
  255. k, rest, curve, err = UnmarshalPublicKeyFromPEM(rest)
  256. assert.Nil(t, k)
  257. assert.Equal(t, rest, invalidPem)
  258. require.EqualError(t, err, "input did not contain a valid PEM encoded block")
  259. }