crypto_test.go 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. package cert
  2. import (
  3. "testing"
  4. "github.com/stretchr/testify/assert"
  5. "github.com/stretchr/testify/require"
  6. "golang.org/x/crypto/argon2"
  7. )
  8. func TestNewArgon2Parameters(t *testing.T) {
  9. p := NewArgon2Parameters(64*1024, 4, 3)
  10. assert.Equal(t, &Argon2Parameters{
  11. version: argon2.Version,
  12. Memory: 64 * 1024,
  13. Parallelism: 4,
  14. Iterations: 3,
  15. }, p)
  16. p = NewArgon2Parameters(2*1024*1024, 2, 1)
  17. assert.Equal(t, &Argon2Parameters{
  18. version: argon2.Version,
  19. Memory: 2 * 1024 * 1024,
  20. Parallelism: 2,
  21. Iterations: 1,
  22. }, p)
  23. }
  24. func TestDecryptAndUnmarshalSigningPrivateKey(t *testing.T) {
  25. passphrase := []byte("DO NOT USE THIS KEY")
  26. privKey := []byte(`# A good key
  27. -----BEGIN NEBULA ED25519 ENCRYPTED PRIVATE KEY-----
  28. CjwKC0FFUy0yNTYtR0NNEi0IExCAgIABGAEgBCognnjujd67Vsv99p22wfAjQaDT
  29. oCMW1mdjkU3gACKNW4MSXOWR9Sts4C81yk1RUku2gvGKs3TB9LYoklLsIizSYOLl
  30. +Vs//O1T0I1Xbml2XBAROsb/VSoDln/6LMqR4B6fn6B3GOsLBBqRI8daDl9lRMPB
  31. qrlJ69wer3ZUHFXA
  32. -----END NEBULA ED25519 ENCRYPTED PRIVATE KEY-----
  33. `)
  34. shortKey := []byte(`# A key which, once decrypted, is too short
  35. -----BEGIN NEBULA ED25519 ENCRYPTED PRIVATE KEY-----
  36. CjwKC0FFUy0yNTYtR0NNEi0IExCAgIABGAEgBCoga5h8owMEBWRSMMJKzuUvWce7
  37. k0qlBkQmCxiuLh80MuASW70YcKt8jeEIS2axo2V6zAKA9TSMcCsJW1kDDXEtL/xe
  38. GLF5T7sDl5COp4LU3pGxpV+KoeQ/S3gQCAAcnaOtnJQX+aSDnbO3jCHyP7U9CHbs
  39. rQr3bdH3Oy/WiYU=
  40. -----END NEBULA ED25519 ENCRYPTED PRIVATE KEY-----
  41. `)
  42. invalidBanner := []byte(`# Invalid banner (not encrypted)
  43. -----BEGIN NEBULA ED25519 PRIVATE KEY-----
  44. bWRp2CTVFhW9HD/qCd28ltDgK3w8VXSeaEYczDWos8sMUBqDb9jP3+NYwcS4lURG
  45. XgLvodMXZJuaFPssp+WwtA==
  46. -----END NEBULA ED25519 PRIVATE KEY-----
  47. `)
  48. invalidPem := []byte(`# Not a valid PEM format
  49. -BEGIN NEBULA ED25519 ENCRYPTED PRIVATE KEY-----
  50. CjwKC0FFUy0yNTYtR0NNEi0IExCAgIABGAEgBCognnjujd67Vsv99p22wfAjQaDT
  51. oCMW1mdjkU3gACKNW4MSXOWR9Sts4C81yk1RUku2gvGKs3TB9LYoklLsIizSYOLl
  52. +Vs//O1T0I1Xbml2XBAROsb/VSoDln/6LMqR4B6fn6B3GOsLBBqRI8daDl9lRMPB
  53. qrlJ69wer3ZUHFXA
  54. -END NEBULA ED25519 ENCRYPTED PRIVATE KEY-----
  55. `)
  56. keyBundle := appendByteSlices(privKey, shortKey, invalidBanner, invalidPem)
  57. // Success test case
  58. curve, k, rest, err := DecryptAndUnmarshalSigningPrivateKey(passphrase, keyBundle)
  59. require.NoError(t, err)
  60. assert.Equal(t, Curve_CURVE25519, curve)
  61. assert.Len(t, k, 64)
  62. assert.Equal(t, rest, appendByteSlices(shortKey, invalidBanner, invalidPem))
  63. // Fail due to short key
  64. curve, k, rest, err = DecryptAndUnmarshalSigningPrivateKey(passphrase, rest)
  65. require.EqualError(t, err, "key was not 64 bytes, is invalid ed25519 private key")
  66. assert.Nil(t, k)
  67. assert.Equal(t, rest, appendByteSlices(invalidBanner, invalidPem))
  68. // Fail due to invalid banner
  69. curve, k, rest, err = DecryptAndUnmarshalSigningPrivateKey(passphrase, rest)
  70. require.EqualError(t, err, "bytes did not contain a proper nebula encrypted Ed25519/ECDSA private key banner")
  71. assert.Nil(t, k)
  72. assert.Equal(t, rest, invalidPem)
  73. // Fail due to ivalid PEM format, because
  74. // it's missing the requisite pre-encapsulation boundary.
  75. curve, k, rest, err = DecryptAndUnmarshalSigningPrivateKey(passphrase, rest)
  76. require.EqualError(t, err, "input did not contain a valid PEM encoded block")
  77. assert.Nil(t, k)
  78. assert.Equal(t, rest, invalidPem)
  79. // Fail due to invalid passphrase
  80. curve, k, rest, err = DecryptAndUnmarshalSigningPrivateKey([]byte("invalid passphrase"), privKey)
  81. require.EqualError(t, err, "invalid passphrase or corrupt private key")
  82. assert.Nil(t, k)
  83. assert.Equal(t, []byte{}, rest)
  84. }
  85. func TestEncryptAndMarshalSigningPrivateKey(t *testing.T) {
  86. // Having proved that decryption works correctly above, we can test the
  87. // encryption function produces a value which can be decrypted
  88. passphrase := []byte("passphrase")
  89. bytes := []byte("AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA")
  90. kdfParams := NewArgon2Parameters(64*1024, 4, 3)
  91. key, err := EncryptAndMarshalSigningPrivateKey(Curve_CURVE25519, bytes, passphrase, kdfParams)
  92. require.NoError(t, err)
  93. // Verify the "key" can be decrypted successfully
  94. curve, k, rest, err := DecryptAndUnmarshalSigningPrivateKey(passphrase, key)
  95. assert.Len(t, k, 64)
  96. assert.Equal(t, Curve_CURVE25519, curve)
  97. assert.Equal(t, []byte{}, rest)
  98. require.NoError(t, err)
  99. // EncryptAndMarshalEd25519PrivateKey does not create any errors itself
  100. }