OwnershipCredential.cpp 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  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. #include "OwnershipCredential.hpp"
  14. namespace ZeroTier {
  15. void OwnershipCredential::addThing(const InetAddress &ip)
  16. {
  17. if (m_thingCount >= ZT_CERTIFICATEOFOWNERSHIP_MAX_THINGS)
  18. return;
  19. if (ip.family() == AF_INET) {
  20. m_thingTypes[m_thingCount] = THING_IPV4_ADDRESS;
  21. Utils::copy<4>(m_thingValues[m_thingCount], &(reinterpret_cast<const struct sockaddr_in *>(&ip)->sin_addr.s_addr));
  22. ++m_thingCount;
  23. } else if (ip.family() == AF_INET6) {
  24. m_thingTypes[m_thingCount] = THING_IPV6_ADDRESS;
  25. Utils::copy<16>(m_thingValues[m_thingCount], reinterpret_cast<const struct sockaddr_in6 *>(&ip)->sin6_addr.s6_addr);
  26. ++m_thingCount;
  27. }
  28. }
  29. void OwnershipCredential::addThing(const MAC &mac)
  30. {
  31. if (m_thingCount >= ZT_CERTIFICATEOFOWNERSHIP_MAX_THINGS)
  32. return;
  33. m_thingTypes[m_thingCount] = THING_MAC_ADDRESS;
  34. mac.copyTo(m_thingValues[m_thingCount]);
  35. ++m_thingCount;
  36. }
  37. bool OwnershipCredential::sign(const Identity &signer)
  38. {
  39. uint8_t buf[ZT_CERTIFICATEOFOWNERSHIP_MARSHAL_SIZE_MAX + 16];
  40. if (signer.hasPrivate()) {
  41. m_signedBy = signer.address();
  42. m_signatureLength = signer.sign(buf, (unsigned int) marshal(buf, true), m_signature, sizeof(m_signature));
  43. return true;
  44. }
  45. return false;
  46. }
  47. int OwnershipCredential::marshal(uint8_t data[ZT_CERTIFICATEOFOWNERSHIP_MARSHAL_SIZE_MAX], bool forSign) const noexcept
  48. {
  49. int p = 0;
  50. if (forSign) {
  51. for (int k = 0;k < 16;++k)
  52. data[p++] = 0x7f;
  53. }
  54. Utils::storeBigEndian<uint64_t>(data + p, m_networkId);
  55. Utils::storeBigEndian<uint64_t>(data + p + 8, (uint64_t) m_ts);
  56. Utils::storeBigEndian<uint64_t>(data + p + 16, m_flags);
  57. Utils::storeBigEndian<uint32_t>(data + p + 24, m_id);
  58. Utils::storeBigEndian<uint16_t>(data + p + 28, (uint16_t) m_thingCount);
  59. p += 30;
  60. for (unsigned int i = 0, j = m_thingCount;i < j;++i) {
  61. data[p++] = m_thingTypes[i];
  62. Utils::copy<ZT_CERTIFICATEOFOWNERSHIP_MAX_THING_VALUE_SIZE>(data + p, m_thingValues[i]);
  63. p += ZT_CERTIFICATEOFOWNERSHIP_MAX_THING_VALUE_SIZE;
  64. }
  65. m_issuedTo.copyTo(data + p);
  66. p += ZT_ADDRESS_LENGTH;
  67. m_signedBy.copyTo(data + p);
  68. p += ZT_ADDRESS_LENGTH;
  69. if (!forSign) {
  70. data[p++] = 1;
  71. Utils::storeBigEndian<uint16_t>(data + p, (uint16_t) m_signatureLength);
  72. p += 2;
  73. Utils::copy(data + p, m_signature, m_signatureLength);
  74. p += (int) m_signatureLength;
  75. }
  76. data[p++] = 0;
  77. data[p++] = 0;
  78. if (forSign) {
  79. for (int k = 0;k < 16;++k)
  80. data[p++] = 0x7f;
  81. }
  82. return p;
  83. }
  84. int OwnershipCredential::unmarshal(const uint8_t *data, int len) noexcept
  85. {
  86. if (len < 30)
  87. return -1;
  88. m_networkId = Utils::loadBigEndian<uint64_t>(data);
  89. m_ts = (int64_t) Utils::loadBigEndian<uint64_t>(data + 8);
  90. m_flags = Utils::loadBigEndian<uint64_t>(data + 16);
  91. m_id = Utils::loadBigEndian<uint32_t>(data + 24);
  92. m_thingCount = Utils::loadBigEndian<uint16_t>(data + 28);
  93. if (m_thingCount > ZT_CERTIFICATEOFOWNERSHIP_MAX_THINGS)
  94. return -1;
  95. int p = 30;
  96. for (unsigned int i = 0, j = m_thingCount;i < j;++i) {
  97. if ((p + 1 + ZT_CERTIFICATEOFOWNERSHIP_MAX_THING_VALUE_SIZE) > len)
  98. return -1;
  99. m_thingTypes[i] = data[p++];
  100. Utils::copy<ZT_CERTIFICATEOFOWNERSHIP_MAX_THING_VALUE_SIZE>(m_thingValues[i], data + p);
  101. p += ZT_CERTIFICATEOFOWNERSHIP_MAX_THING_VALUE_SIZE;
  102. }
  103. if ((p + ZT_ADDRESS_LENGTH + ZT_ADDRESS_LENGTH + 1 + 2) > len)
  104. return -1;
  105. m_issuedTo.setTo(data + p);
  106. p += ZT_ADDRESS_LENGTH;
  107. m_signedBy.setTo(data + p);
  108. p += ZT_ADDRESS_LENGTH + 1;
  109. p += 2 + Utils::loadBigEndian<uint16_t>(data + p);
  110. if (p > len)
  111. return -1;
  112. return p;
  113. }
  114. } // namespace ZeroTier