pem_test.go 10 KB

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