certificate_test.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. // SPDX-FileCopyrightText: 2023 The Pion community <https://pion.ly>
  2. // SPDX-License-Identifier: MIT
  3. //go:build !js
  4. // +build !js
  5. package webrtc
  6. import (
  7. "crypto/ecdsa"
  8. "crypto/elliptic"
  9. "crypto/rand"
  10. "crypto/rsa"
  11. "crypto/tls"
  12. "crypto/x509"
  13. "encoding/pem"
  14. "testing"
  15. "time"
  16. "github.com/stretchr/testify/assert"
  17. )
  18. func TestGenerateCertificateRSA(t *testing.T) {
  19. sk, err := rsa.GenerateKey(rand.Reader, 2048)
  20. assert.Nil(t, err)
  21. skPEM := pem.EncodeToMemory(&pem.Block{
  22. Type: "RSA PRIVATE KEY",
  23. Bytes: x509.MarshalPKCS1PrivateKey(sk),
  24. })
  25. cert, err := GenerateCertificate(sk)
  26. assert.Nil(t, err)
  27. certPEM := pem.EncodeToMemory(&pem.Block{
  28. Type: "CERTIFICATE",
  29. Bytes: cert.x509Cert.Raw,
  30. })
  31. _, err = tls.X509KeyPair(certPEM, skPEM)
  32. assert.Nil(t, err)
  33. }
  34. func TestGenerateCertificateECDSA(t *testing.T) {
  35. sk, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
  36. assert.Nil(t, err)
  37. skDER, err := x509.MarshalECPrivateKey(sk)
  38. assert.Nil(t, err)
  39. skPEM := pem.EncodeToMemory(&pem.Block{
  40. Type: "EC PRIVATE KEY",
  41. Bytes: skDER,
  42. })
  43. cert, err := GenerateCertificate(sk)
  44. assert.Nil(t, err)
  45. certPEM := pem.EncodeToMemory(&pem.Block{
  46. Type: "CERTIFICATE",
  47. Bytes: cert.x509Cert.Raw,
  48. })
  49. _, err = tls.X509KeyPair(certPEM, skPEM)
  50. assert.Nil(t, err)
  51. }
  52. func TestGenerateCertificateEqual(t *testing.T) {
  53. sk1, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
  54. assert.Nil(t, err)
  55. sk3, err := rsa.GenerateKey(rand.Reader, 2048)
  56. assert.NoError(t, err)
  57. cert1, err := GenerateCertificate(sk1)
  58. assert.Nil(t, err)
  59. sk2, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
  60. assert.Nil(t, err)
  61. cert2, err := GenerateCertificate(sk2)
  62. assert.Nil(t, err)
  63. cert3, err := GenerateCertificate(sk3)
  64. assert.NoError(t, err)
  65. assert.True(t, cert1.Equals(*cert1))
  66. assert.False(t, cert1.Equals(*cert2))
  67. assert.True(t, cert3.Equals(*cert3))
  68. }
  69. func TestGenerateCertificateExpires(t *testing.T) {
  70. sk, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
  71. assert.Nil(t, err)
  72. cert, err := GenerateCertificate(sk)
  73. assert.Nil(t, err)
  74. now := time.Now()
  75. assert.False(t, cert.Expires().IsZero() || now.After(cert.Expires()))
  76. x509Cert := CertificateFromX509(sk, &x509.Certificate{})
  77. assert.NotNil(t, x509Cert)
  78. assert.Contains(t, x509Cert.statsID, "certificate")
  79. }
  80. func TestBadCertificate(t *testing.T) {
  81. var nokey interface{}
  82. badcert, err := NewCertificate(nokey, x509.Certificate{})
  83. assert.Nil(t, badcert)
  84. assert.Error(t, err)
  85. sk, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
  86. assert.Nil(t, err)
  87. badcert, err = NewCertificate(sk, x509.Certificate{})
  88. assert.Nil(t, badcert)
  89. assert.Error(t, err)
  90. c0 := Certificate{}
  91. c1 := Certificate{}
  92. assert.False(t, c0.Equals(c1))
  93. }
  94. func TestPEM(t *testing.T) {
  95. sk, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader)
  96. assert.Nil(t, err)
  97. cert, err := GenerateCertificate(sk)
  98. assert.Nil(t, err)
  99. pem, err := cert.PEM()
  100. assert.Nil(t, err)
  101. cert2, err := CertificateFromPEM(pem)
  102. assert.Nil(t, err)
  103. pem2, err := cert2.PEM()
  104. assert.Nil(t, err)
  105. assert.Equal(t, pem, pem2)
  106. }