crypto_test.go 4.1 KB

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