pem_test.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  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. t.Parallel()
  159. pubKey := []byte(`# A good key
  160. -----BEGIN NEBULA ED25519 PUBLIC KEY-----
  161. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
  162. -----END NEBULA ED25519 PUBLIC KEY-----
  163. `)
  164. shortKey := []byte(`# A short key
  165. -----BEGIN NEBULA ED25519 PUBLIC KEY-----
  166. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
  167. -----END NEBULA ED25519 PUBLIC KEY-----
  168. `)
  169. invalidBanner := []byte(`# Invalid banner
  170. -----BEGIN NOT A NEBULA PUBLIC KEY-----
  171. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
  172. -----END NOT A NEBULA PUBLIC KEY-----
  173. `)
  174. invalidPem := []byte(`# Not a valid PEM format
  175. -BEGIN NEBULA ED25519 PUBLIC KEY-----
  176. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
  177. -END NEBULA ED25519 PUBLIC KEY-----`)
  178. keyBundle := appendByteSlices(pubKey, shortKey, invalidBanner, invalidPem)
  179. // Success test case
  180. k, rest, curve, err := UnmarshalPublicKeyFromPEM(keyBundle)
  181. assert.Len(t, k, 32)
  182. assert.Equal(t, Curve_CURVE25519, curve)
  183. require.NoError(t, err)
  184. assert.Equal(t, rest, appendByteSlices(shortKey, invalidBanner, invalidPem))
  185. // Fail due to short key
  186. k, rest, curve, err = UnmarshalPublicKeyFromPEM(rest)
  187. assert.Nil(t, k)
  188. assert.Equal(t, Curve_CURVE25519, curve)
  189. assert.Equal(t, rest, appendByteSlices(invalidBanner, invalidPem))
  190. require.EqualError(t, err, "key was not 32 bytes, is invalid CURVE25519 public key")
  191. // Fail due to invalid banner
  192. k, rest, curve, err = UnmarshalPublicKeyFromPEM(rest)
  193. assert.Nil(t, k)
  194. assert.Equal(t, Curve_CURVE25519, curve)
  195. require.EqualError(t, err, "bytes did not contain a proper public key banner")
  196. assert.Equal(t, rest, invalidPem)
  197. // Fail due to ivalid PEM format, because
  198. // it's missing the requisite pre-encapsulation boundary.
  199. k, rest, curve, err = UnmarshalPublicKeyFromPEM(rest)
  200. assert.Nil(t, k)
  201. assert.Equal(t, Curve_CURVE25519, curve)
  202. assert.Equal(t, rest, invalidPem)
  203. require.EqualError(t, err, "input did not contain a valid PEM encoded block")
  204. }
  205. func TestUnmarshalX25519PublicKey(t *testing.T) {
  206. t.Parallel()
  207. pubKey := []byte(`# A good key
  208. -----BEGIN NEBULA X25519 PUBLIC KEY-----
  209. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
  210. -----END NEBULA X25519 PUBLIC KEY-----
  211. `)
  212. pubP256Key := []byte(`# A good key
  213. -----BEGIN NEBULA P256 PUBLIC KEY-----
  214. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  215. AAAAAAAAAAAAAAAAAAAAAAA=
  216. -----END NEBULA P256 PUBLIC KEY-----
  217. `)
  218. oldPubP256Key := []byte(`# A good key
  219. -----BEGIN NEBULA ECDSA P256 PUBLIC KEY-----
  220. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
  221. AAAAAAAAAAAAAAAAAAAAAAA=
  222. -----END NEBULA ECDSA P256 PUBLIC KEY-----
  223. `)
  224. shortKey := []byte(`# A short key
  225. -----BEGIN NEBULA X25519 PUBLIC KEY-----
  226. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==
  227. -----END NEBULA X25519 PUBLIC KEY-----
  228. `)
  229. invalidBanner := []byte(`# Invalid banner
  230. -----BEGIN NOT A NEBULA PUBLIC KEY-----
  231. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
  232. -----END NOT A NEBULA PUBLIC KEY-----
  233. `)
  234. invalidPem := []byte(`# Not a valid PEM format
  235. -BEGIN NEBULA X25519 PUBLIC KEY-----
  236. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
  237. -END NEBULA X25519 PUBLIC KEY-----`)
  238. keyBundle := appendByteSlices(pubKey, pubP256Key, oldPubP256Key, shortKey, invalidBanner, invalidPem)
  239. // Success test case
  240. k, rest, curve, err := UnmarshalPublicKeyFromPEM(keyBundle)
  241. assert.Len(t, k, 32)
  242. require.NoError(t, err)
  243. assert.Equal(t, rest, appendByteSlices(pubP256Key, oldPubP256Key, shortKey, invalidBanner, invalidPem))
  244. assert.Equal(t, Curve_CURVE25519, curve)
  245. // Success test case
  246. k, rest, curve, err = UnmarshalPublicKeyFromPEM(rest)
  247. assert.Len(t, k, 65)
  248. require.NoError(t, err)
  249. assert.Equal(t, rest, appendByteSlices(oldPubP256Key, shortKey, invalidBanner, invalidPem))
  250. assert.Equal(t, Curve_P256, curve)
  251. // Success test case
  252. k, rest, curve, err = UnmarshalPublicKeyFromPEM(rest)
  253. assert.Len(t, k, 65)
  254. require.NoError(t, err)
  255. assert.Equal(t, rest, appendByteSlices(shortKey, invalidBanner, invalidPem))
  256. assert.Equal(t, Curve_P256, curve)
  257. // Fail due to short key
  258. k, rest, curve, err = UnmarshalPublicKeyFromPEM(rest)
  259. assert.Nil(t, k)
  260. assert.Equal(t, rest, appendByteSlices(invalidBanner, invalidPem))
  261. require.EqualError(t, err, "key was not 32 bytes, is invalid CURVE25519 public key")
  262. // Fail due to invalid banner
  263. k, rest, curve, err = UnmarshalPublicKeyFromPEM(rest)
  264. assert.Nil(t, k)
  265. require.EqualError(t, err, "bytes did not contain a proper public key banner")
  266. assert.Equal(t, rest, invalidPem)
  267. // Fail due to ivalid PEM format, because
  268. // it's missing the requisite pre-encapsulation boundary.
  269. k, rest, curve, err = UnmarshalPublicKeyFromPEM(rest)
  270. assert.Nil(t, k)
  271. assert.Equal(t, rest, invalidPem)
  272. require.EqualError(t, err, "input did not contain a valid PEM encoded block")
  273. }