certificate.go 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. /*
  2. * Copyright (C)2013-2020 ZeroTier, Inc.
  3. *
  4. * Use of this software is governed by the Business Source License included
  5. * in the LICENSE.TXT file in the project's root directory.
  6. *
  7. * Change Date: 2025-01-01
  8. *
  9. * On the date above, in accordance with the Business Source License, use
  10. * of this software will be governed by version 2.0 of the Apache License.
  11. */
  12. /****/
  13. package main
  14. import (
  15. "bytes"
  16. "fmt"
  17. "zerotier/pkg/zerotier"
  18. )
  19. func TestCertificate() bool {
  20. id, err := zerotier.NewIdentityFromString("8e4df28b72:0:ac3d46abe0c21f3cfe7a6c8d6a85cfcffcb82fbd55af6a4d6350657c68200843fa2e16f9418bbd9702cae365f2af5fb4c420908b803a681d4daef6114d78a2d7:bd8dd6e4ce7022d2f812797a80c6ee8ad180dc4ebf301dec8b06d1be08832bddd63a2f1cfa7b2c504474c75bdc8898ba476ef92e8e2d0509f8441985171ff16e")
  21. if err != nil {
  22. fmt.Printf("FATAL: error deserializing test identity: %s\n", err.Error())
  23. return false
  24. }
  25. uniqueId, uniqueIdPrivate, err := zerotier.NewCertificateSubjectUniqueId(zerotier.CertificateUniqueIdTypeNistP384)
  26. if err != nil {
  27. fmt.Printf("FATAL: error generating unique ID: %s", err.Error())
  28. return false
  29. }
  30. var c zerotier.Certificate
  31. c.SerialNo = make([]byte, 48)
  32. for i := 0; i < 48; i++ {
  33. c.SerialNo[i] = byte(i)
  34. }
  35. c.Flags = 1234
  36. c.Timestamp = 5678
  37. c.Validity[0] = 1010
  38. c.Validity[1] = 2020
  39. c.Subject.Timestamp = 31337
  40. c.Subject.Identities = append(c.Subject.Identities, zerotier.CertificateIdentity{
  41. Identity: id,
  42. Locator: nil,
  43. })
  44. c.Subject.Networks = append(c.Subject.Networks, zerotier.CertificateNetwork{
  45. ID: 1111,
  46. Controller: zerotier.Fingerprint{
  47. Address: zerotier.Address(2222),
  48. Hash: c.SerialNo,
  49. },
  50. })
  51. c.Subject.Certificates = append(c.Subject.Certificates, c.SerialNo)
  52. c.Subject.UpdateURLs = append(c.Subject.UpdateURLs, "https://www.zerotier.com/asdfasdf")
  53. c.Subject.Name.SerialNo = "a"
  54. c.Subject.Name.CommonName = "b"
  55. c.Subject.Name.StreetAddress = "c"
  56. c.Subject.Name.Locality = "d"
  57. c.Subject.Name.Province = "e"
  58. c.Subject.Name.PostalCode = "f"
  59. c.Subject.Name.Country = "g"
  60. c.Subject.Name.Organization = "h"
  61. c.Subject.Name.Unit = "i"
  62. c.Subject.Name.Email = "j"
  63. c.Subject.Name.URL = "k"
  64. c.Subject.Name.Host = "l"
  65. c.Subject.UniqueID = uniqueId
  66. c.Issuer = id
  67. c.IssuerName.SerialNo = "m"
  68. c.IssuerName.CommonName = "n"
  69. c.IssuerName.StreetAddress = "o"
  70. c.IssuerName.Locality = "p"
  71. c.IssuerName.Province = "q"
  72. c.IssuerName.PostalCode = "r"
  73. c.IssuerName.Country = "s"
  74. c.IssuerName.Organization = "t"
  75. c.IssuerName.Unit = "u"
  76. c.IssuerName.Email = "v"
  77. c.IssuerName.URL = "w"
  78. c.IssuerName.Host = "x"
  79. c.ExtendedAttributes = c.SerialNo
  80. c.MaxPathLength = 9999
  81. c.Signature = []byte("qwerty")
  82. fmt.Printf("Checking certificate marshal/unmarshal (10000 tests)... ")
  83. for k := 0; k < 10000; k++ {
  84. cb, err := c.Marshal()
  85. if err != nil {
  86. fmt.Printf("marshal FAILED (%s)\n", err.Error())
  87. return false
  88. }
  89. c2, err := zerotier.NewCertificateFromBytes(cb, false)
  90. if err != nil {
  91. fmt.Printf("unmarshal FAILED (%s)\n", err.Error())
  92. return false
  93. }
  94. cb2, err := c2.Marshal()
  95. if err != nil {
  96. fmt.Printf("second marshal FAILED (%s)\n", err.Error())
  97. return false
  98. }
  99. if !bytes.Equal(cb, cb2) {
  100. fmt.Printf("FAILED (results not equal)\n")
  101. return false
  102. }
  103. }
  104. fmt.Println("OK")
  105. fmt.Printf("Checking certificate CSR sign/verify (100 tests)... ")
  106. for k := 0; k < 100; k++ {
  107. csr, err := zerotier.NewCertificateCSR(&c.Subject, uniqueId, uniqueIdPrivate)
  108. if err != nil {
  109. fmt.Printf("CSR generate FAILED (%s)\n", err.Error())
  110. return false
  111. }
  112. //fmt.Printf("CSR size: %d ", len(csr))
  113. csr2, err := zerotier.NewCertificateFromBytes(csr, false)
  114. if err != nil {
  115. fmt.Printf("CSR decode FAILED (%s)\n", err.Error())
  116. return false
  117. }
  118. signedCert, err := csr2.Sign(id)
  119. if err != nil {
  120. fmt.Printf("CSR sign FAILED (%s)\n", err.Error())
  121. return false
  122. }
  123. if len(signedCert.Signature) == 0 {
  124. fmt.Println("CSR sign FAILED (no signature found)", err.Error())
  125. return false
  126. }
  127. }
  128. fmt.Println("OK")
  129. return true
  130. }