sign_test.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. package cert
  2. import (
  3. "crypto/ecdsa"
  4. "crypto/ed25519"
  5. "crypto/elliptic"
  6. "crypto/rand"
  7. "net/netip"
  8. "testing"
  9. "time"
  10. "github.com/slackhq/nebula/cert/p256"
  11. "github.com/stretchr/testify/assert"
  12. "github.com/stretchr/testify/require"
  13. )
  14. func TestCertificateV1_Sign(t *testing.T) {
  15. before := time.Now().Add(time.Second * -60).Round(time.Second)
  16. after := time.Now().Add(time.Second * 60).Round(time.Second)
  17. pubKey := []byte("1234567890abcedfghij1234567890ab")
  18. tbs := TBSCertificate{
  19. Version: Version1,
  20. Name: "testing",
  21. Networks: []netip.Prefix{
  22. mustParsePrefixUnmapped("10.1.1.1/24"),
  23. mustParsePrefixUnmapped("10.1.1.2/16"),
  24. },
  25. UnsafeNetworks: []netip.Prefix{
  26. mustParsePrefixUnmapped("9.1.1.2/24"),
  27. mustParsePrefixUnmapped("9.1.1.3/24"),
  28. },
  29. Groups: []string{"test-group1", "test-group2", "test-group3"},
  30. NotBefore: before,
  31. NotAfter: after,
  32. PublicKey: pubKey,
  33. IsCA: false,
  34. }
  35. pub, priv, err := ed25519.GenerateKey(rand.Reader)
  36. c, err := tbs.Sign(&certificateV1{details: detailsV1{notBefore: before, notAfter: after}}, Curve_CURVE25519, priv)
  37. require.NoError(t, err)
  38. assert.NotNil(t, c)
  39. assert.True(t, c.CheckSignature(pub))
  40. b, err := c.Marshal()
  41. require.NoError(t, err)
  42. uc, err := unmarshalCertificateV1(b, nil)
  43. require.NoError(t, err)
  44. assert.NotNil(t, uc)
  45. }
  46. func TestCertificateV1_SignP256(t *testing.T) {
  47. before := time.Now().Add(time.Second * -60).Round(time.Second)
  48. after := time.Now().Add(time.Second * 60).Round(time.Second)
  49. pubKey := []byte("01234567890abcedfghij1234567890ab1234567890abcedfghij1234567890ab")
  50. tbs := TBSCertificate{
  51. Version: Version1,
  52. Name: "testing",
  53. Networks: []netip.Prefix{
  54. mustParsePrefixUnmapped("10.1.1.1/24"),
  55. mustParsePrefixUnmapped("10.1.1.2/16"),
  56. },
  57. UnsafeNetworks: []netip.Prefix{
  58. mustParsePrefixUnmapped("9.1.1.2/24"),
  59. mustParsePrefixUnmapped("9.1.1.3/16"),
  60. },
  61. Groups: []string{"test-group1", "test-group2", "test-group3"},
  62. NotBefore: before,
  63. NotAfter: after,
  64. PublicKey: pubKey,
  65. IsCA: false,
  66. Curve: Curve_P256,
  67. }
  68. priv, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
  69. require.NoError(t, err)
  70. pub := elliptic.Marshal(elliptic.P256(), priv.PublicKey.X, priv.PublicKey.Y)
  71. rawPriv := priv.D.FillBytes(make([]byte, 32))
  72. c, err := tbs.Sign(&certificateV1{details: detailsV1{notBefore: before, notAfter: after}}, Curve_P256, rawPriv)
  73. require.NoError(t, err)
  74. assert.NotNil(t, c)
  75. assert.True(t, c.CheckSignature(pub))
  76. b, err := c.Marshal()
  77. require.NoError(t, err)
  78. uc, err := unmarshalCertificateV1(b, nil)
  79. require.NoError(t, err)
  80. assert.NotNil(t, uc)
  81. }
  82. func TestCertificate_SignP256_AlwaysNormalized(t *testing.T) {
  83. before := time.Now().Add(time.Second * -60).Round(time.Second)
  84. after := time.Now().Add(time.Second * 60).Round(time.Second)
  85. pubKey := []byte("01234567890abcedfghij1234567890ab1234567890abcedfghij1234567890ab")
  86. tbs := TBSCertificate{
  87. Version: Version1,
  88. Name: "testing",
  89. Networks: []netip.Prefix{
  90. mustParsePrefixUnmapped("10.1.1.1/24"),
  91. mustParsePrefixUnmapped("10.1.1.2/16"),
  92. },
  93. UnsafeNetworks: []netip.Prefix{
  94. mustParsePrefixUnmapped("9.1.1.2/24"),
  95. mustParsePrefixUnmapped("9.1.1.3/16"),
  96. },
  97. Groups: []string{"test-group1", "test-group2", "test-group3"},
  98. NotBefore: before,
  99. NotAfter: after,
  100. PublicKey: pubKey,
  101. IsCA: true,
  102. Curve: Curve_P256,
  103. }
  104. priv, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
  105. require.NoError(t, err)
  106. pub := elliptic.Marshal(elliptic.P256(), priv.PublicKey.X, priv.PublicKey.Y)
  107. rawPriv := priv.D.FillBytes(make([]byte, 32))
  108. for i := 0; i < 1000; i++ {
  109. if i&1 == 1 {
  110. tbs.Version = Version1
  111. } else {
  112. tbs.Version = Version2
  113. }
  114. c, err := tbs.Sign(nil, Curve_P256, rawPriv)
  115. require.NoError(t, err)
  116. assert.NotNil(t, c)
  117. assert.True(t, c.CheckSignature(pub))
  118. normie, err := p256.IsNormalized(c.Signature())
  119. require.NoError(t, err)
  120. assert.True(t, normie)
  121. }
  122. }