mirror of
https://github.com/zerotier/ZeroTierOne.git
synced 2025-04-26 17:03:43 +02:00
Simplify Locator slightly.
This commit is contained in:
parent
8153211b26
commit
0acc731bf4
7 changed files with 74 additions and 78 deletions
|
@ -489,13 +489,6 @@ ZT_MAYBE_UNUSED char *ZT_Locator_toString(
|
|||
return reinterpret_cast<const ZeroTier::Locator *>(loc)->toString(buf);
|
||||
}
|
||||
|
||||
ZT_MAYBE_UNUSED const ZT_Fingerprint *ZT_Locator_fingerprint(const ZT_Locator *loc)
|
||||
{
|
||||
if (!loc)
|
||||
return nullptr;
|
||||
return (ZT_Fingerprint *) (&(reinterpret_cast<const ZeroTier::Locator *>(loc)->signer()));
|
||||
}
|
||||
|
||||
ZT_MAYBE_UNUSED int64_t ZT_Locator_revision(const ZT_Locator *loc)
|
||||
{
|
||||
if (!loc)
|
||||
|
@ -503,6 +496,26 @@ ZT_MAYBE_UNUSED int64_t ZT_Locator_revision(const ZT_Locator *loc)
|
|||
return reinterpret_cast<const ZeroTier::Locator *>(loc)->revision();
|
||||
}
|
||||
|
||||
ZT_MAYBE_UNUSED uint64_t ZT_Locator_signer(const ZT_Locator *loc)
|
||||
{
|
||||
if (!loc)
|
||||
return 0;
|
||||
return reinterpret_cast<const ZeroTier::Locator *>(loc)->signer().toInt();
|
||||
}
|
||||
|
||||
ZT_MAYBE_UNUSED int ZT_Locator_equals(const ZT_Locator *a, const ZT_Locator *b)
|
||||
{
|
||||
if (a) {
|
||||
if (b) {
|
||||
if (*reinterpret_cast<const ZeroTier::Locator *>(a) == *reinterpret_cast<const ZeroTier::Locator *>(b))
|
||||
return 1;
|
||||
}
|
||||
} else if (!b) {
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
ZT_MAYBE_UNUSED unsigned int ZT_Locator_endpointCount(const ZT_Locator *loc)
|
||||
{ return (loc) ? (unsigned int) (reinterpret_cast<const ZeroTier::Locator *>(loc)->endpoints().size()) : 0; }
|
||||
|
||||
|
|
|
@ -49,7 +49,7 @@ bool Locator::add(const Endpoint &ep, const SharedPtr< const EndpointAttributes
|
|||
bool Locator::sign(const int64_t rev, const Identity &id) noexcept
|
||||
{
|
||||
m_revision = rev;
|
||||
m_signer = id.fingerprint();
|
||||
m_signer = id.address();
|
||||
|
||||
m_sortEndpoints();
|
||||
|
||||
|
@ -67,7 +67,7 @@ bool Locator::sign(const int64_t rev, const Identity &id) noexcept
|
|||
bool Locator::verify(const Identity &id) const noexcept
|
||||
{
|
||||
try {
|
||||
if ((m_revision > 0) && (m_signer == id.fingerprint())) {
|
||||
if ((m_revision > 0) && (m_signer == id.address())) {
|
||||
uint8_t signdata[ZT_LOCATOR_MARSHAL_SIZE_MAX];
|
||||
const unsigned int signlen = marshal(signdata, true);
|
||||
return id.verify(signdata, signlen, m_signature.data(), m_signature.size());
|
||||
|
@ -80,7 +80,7 @@ char *Locator::toString(char s[ZT_LOCATOR_STRING_SIZE_MAX]) const noexcept
|
|||
{
|
||||
static_assert(ZT_LOCATOR_STRING_SIZE_MAX > ((((ZT_LOCATOR_MARSHAL_SIZE_MAX / 5) + 1) * 8) + ZT_ADDRESS_LENGTH_HEX + 1), "overflow");
|
||||
uint8_t bin[ZT_LOCATOR_MARSHAL_SIZE_MAX];
|
||||
Address(m_signer.address).toString(s);
|
||||
m_signer.toString(s);
|
||||
s[ZT_ADDRESS_LENGTH_HEX] = '@';
|
||||
Utils::b32e(bin, marshal(bin, false), s + (ZT_ADDRESS_LENGTH_HEX + 1), ZT_LOCATOR_STRING_SIZE_MAX - (ZT_ADDRESS_LENGTH_HEX + 1));
|
||||
return s;
|
||||
|
@ -102,17 +102,13 @@ bool Locator::fromString(const char *s) noexcept
|
|||
int Locator::marshal(uint8_t data[ZT_LOCATOR_MARSHAL_SIZE_MAX], const bool excludeSignature) const noexcept
|
||||
{
|
||||
Utils::storeBigEndian<uint64_t>(data, (uint64_t) m_revision);
|
||||
int p = 8;
|
||||
m_signer.copyTo(data + 8);
|
||||
int p = 8 + ZT_ADDRESS_LENGTH;
|
||||
|
||||
int l = m_signer.marshal(data + p);
|
||||
if (l <= 0)
|
||||
return -1;
|
||||
p += l;
|
||||
|
||||
Utils::storeBigEndian<uint16_t>(data + p, (uint16_t) m_endpoints.size());
|
||||
Utils::storeBigEndian<uint16_t>(data + p, (uint16_t)m_endpoints.size());
|
||||
p += 2;
|
||||
for (Vector< std::pair< Endpoint, SharedPtr< const EndpointAttributes > > >::const_iterator e(m_endpoints.begin());e != m_endpoints.end();++e) {
|
||||
l = e->first.marshal(data + p);
|
||||
int l = e->first.marshal(data + p);
|
||||
if (l <= 0)
|
||||
return -1;
|
||||
p += l;
|
||||
|
@ -141,15 +137,11 @@ int Locator::marshal(uint8_t data[ZT_LOCATOR_MARSHAL_SIZE_MAX], const bool exclu
|
|||
|
||||
int Locator::unmarshal(const uint8_t *data, const int len) noexcept
|
||||
{
|
||||
if (unlikely(len < 8))
|
||||
if (unlikely(len < (8 + ZT_ADDRESS_LENGTH)))
|
||||
return -1;
|
||||
m_revision = (int64_t)Utils::loadBigEndian<uint64_t>(data);
|
||||
int p = 8;
|
||||
|
||||
int l = m_signer.unmarshal(data + p, len - p);
|
||||
if (l <= 0)
|
||||
return -1;
|
||||
p += l;
|
||||
m_signer.setTo(data + 8);
|
||||
int p = 8 + ZT_ADDRESS_LENGTH;
|
||||
|
||||
if (unlikely(p + 2) > len)
|
||||
return -1;
|
||||
|
@ -160,7 +152,7 @@ int Locator::unmarshal(const uint8_t *data, const int len) noexcept
|
|||
m_endpoints.resize(endpointCount);
|
||||
m_endpoints.shrink_to_fit();
|
||||
for (unsigned int i = 0;i < endpointCount;++i) {
|
||||
l = m_endpoints[i].first.unmarshal(data + p, len - p);
|
||||
int l = m_endpoints[i].first.unmarshal(data + p, len - p);
|
||||
if (l <= 0)
|
||||
return -1;
|
||||
p += l;
|
||||
|
|
|
@ -35,7 +35,7 @@
|
|||
*/
|
||||
#define ZT_LOCATOR_MAX_ENDPOINTS 16
|
||||
|
||||
#define ZT_LOCATOR_MARSHAL_SIZE_MAX (8 + ZT_FINGERPRINT_MARSHAL_SIZE + 2 + (ZT_LOCATOR_MAX_ENDPOINTS * (ZT_ENDPOINT_MARSHAL_SIZE_MAX + ZT_LOCATOR_MAX_ENDPOINT_ATTRIBUTES_SIZE)) + 2 + 2 + ZT_SIGNATURE_BUFFER_SIZE)
|
||||
#define ZT_LOCATOR_MARSHAL_SIZE_MAX (8 + ZT_ADDRESS_LENGTH + 2 + (ZT_LOCATOR_MAX_ENDPOINTS * (ZT_ENDPOINT_MARSHAL_SIZE_MAX + ZT_LOCATOR_MAX_ENDPOINT_ATTRIBUTES_SIZE)) + 2 + 2 + ZT_SIGNATURE_BUFFER_SIZE)
|
||||
|
||||
/**
|
||||
* Maximum size of a string format Locator (this is way larger than needed)
|
||||
|
@ -109,16 +109,16 @@ public:
|
|||
m_revision(0)
|
||||
{}
|
||||
|
||||
explicit Locator(const char *const str) noexcept;
|
||||
|
||||
ZT_INLINE Locator(const Locator &loc) noexcept:
|
||||
m_revision(loc.m_revision),
|
||||
m_signer(loc.m_signer),
|
||||
m_endpoints(loc.m_endpoints),
|
||||
m_signature(loc.m_signature),
|
||||
ZT_INLINE Locator(const Locator &l) noexcept:
|
||||
m_revision(l.m_revision),
|
||||
m_signer(l.m_signer),
|
||||
m_endpoints(l.m_endpoints),
|
||||
m_signature(l.m_signature),
|
||||
__refCount(0)
|
||||
{}
|
||||
|
||||
explicit Locator(const char *const str) noexcept;
|
||||
|
||||
/**
|
||||
* @return Timestamp (a.k.a. revision number) set by Location signer
|
||||
*/
|
||||
|
@ -126,9 +126,9 @@ public:
|
|||
{ return m_revision; }
|
||||
|
||||
/**
|
||||
* @return Fingerprint of identity that signed this locator
|
||||
* @return ZeroTier address of signer
|
||||
*/
|
||||
ZT_INLINE const Fingerprint &signer() const noexcept
|
||||
ZT_INLINE Address signer() const noexcept
|
||||
{ return m_signer; }
|
||||
|
||||
/**
|
||||
|
@ -232,7 +232,7 @@ private:
|
|||
void m_sortEndpoints() noexcept;
|
||||
|
||||
int64_t m_revision;
|
||||
Fingerprint m_signer;
|
||||
Address m_signer;
|
||||
Vector <std::pair< Endpoint, SharedPtr< const EndpointAttributes > >> m_endpoints;
|
||||
FCV< uint8_t, ZT_SIGNATURE_BUFFER_SIZE > m_signature;
|
||||
std::atomic< int > __refCount;
|
||||
|
|
|
@ -2689,16 +2689,6 @@ ZT_SDK_API char *ZT_Locator_toString(
|
|||
char *buf,
|
||||
int capacity);
|
||||
|
||||
/**
|
||||
* Get a pointer to the fingerprint of this locator's signer.
|
||||
*
|
||||
* The returned pointer remains valid as long as the Locator is not deleted.
|
||||
*
|
||||
* @param loc Locator to query
|
||||
* @return Pointer to fingerprint of signer
|
||||
*/
|
||||
ZT_SDK_API const ZT_Fingerprint *ZT_Locator_fingerprint(const ZT_Locator *loc);
|
||||
|
||||
/**
|
||||
* Get a locator's revision
|
||||
*
|
||||
|
@ -2707,6 +2697,23 @@ ZT_SDK_API const ZT_Fingerprint *ZT_Locator_fingerprint(const ZT_Locator *loc);
|
|||
*/
|
||||
ZT_SDK_API int64_t ZT_Locator_revision(const ZT_Locator *loc);
|
||||
|
||||
/**
|
||||
* Get a locator's signer
|
||||
*
|
||||
* @param loc Locator to query
|
||||
* @return 40-bit ZeroTier address of signer
|
||||
*/
|
||||
ZT_SDK_API uint64_t ZT_Locator_signer(const ZT_Locator *loc);
|
||||
|
||||
/**
|
||||
* Compare two locators
|
||||
*
|
||||
* @param a First locator
|
||||
* @param b Second locator
|
||||
* @return Non-zero if a equals b
|
||||
*/
|
||||
ZT_SDK_API int ZT_Locator_equals(const ZT_Locator *a, const ZT_Locator *b);
|
||||
|
||||
/**
|
||||
* Get the number of endpoints in this locator
|
||||
*
|
||||
|
|
|
@ -84,8 +84,6 @@ impl Buffer {
|
|||
impl Drop for Buffer {
|
||||
#[inline(always)]
|
||||
fn drop(&mut self) {
|
||||
unsafe {
|
||||
ztcore::ZT_freeBuffer(self.zt_core_buf as *mut c_void);
|
||||
}
|
||||
unsafe { ztcore::ZT_freeBuffer(self.zt_core_buf as *mut c_void); }
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,7 +19,7 @@ use std::pin::Pin;
|
|||
use std::ptr::{copy_nonoverlapping, null, null_mut};
|
||||
|
||||
use num_derive::{FromPrimitive, ToPrimitive};
|
||||
use num_traits::FromPrimitive;
|
||||
use num_traits::{FromPrimitive, ToPrimitive};
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use crate::*;
|
||||
|
@ -42,19 +42,12 @@ fn vec_to_array<const L: usize>(v: &Vec<u8>) -> [u8; L] {
|
|||
|
||||
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#[derive(FromPrimitive, PartialEq, Eq, Clone, Copy)]
|
||||
#[derive(FromPrimitive, ToPrimitive, PartialEq, Eq, Clone, Copy)]
|
||||
pub enum CertificatePublicKeyAlgorithm {
|
||||
None = ztcore::ZT_CertificatePublicKeyAlgorithm_ZT_CERTIFICATE_PUBLIC_KEY_ALGORITHM_NONE as isize,
|
||||
ECDSANistP384 = ztcore::ZT_CertificatePublicKeyAlgorithm_ZT_CERTIFICATE_PUBLIC_KEY_ALGORITHM_ECDSA_NIST_P_384 as isize,
|
||||
}
|
||||
|
||||
impl CertificatePublicKeyAlgorithm {
|
||||
#[inline(always)]
|
||||
pub fn to_i32(&self) -> i32 {
|
||||
*self as i32
|
||||
}
|
||||
}
|
||||
|
||||
impl From<i32> for CertificatePublicKeyAlgorithm {
|
||||
#[inline(always)]
|
||||
fn from(n: i32) -> CertificatePublicKeyAlgorithm {
|
||||
|
@ -534,7 +527,7 @@ impl Certificate {
|
|||
let mut private_key = [0_u8; ztcore::ZT_CERTIFICATE_MAX_PRIVATE_KEY_SIZE as usize];
|
||||
let mut public_key_size: c_int = 0;
|
||||
let mut private_key_size: c_int = 0;
|
||||
let r = unsafe { ztcore::ZT_Certificate_newKeyPair(alg.to_i32() as ztcore::ZT_CertificatePublicKeyAlgorithm, public_key.as_mut_ptr(), &mut public_key_size, private_key.as_mut_ptr(), &mut private_key_size) };
|
||||
let r = unsafe { ztcore::ZT_Certificate_newKeyPair(alg.to_i32().unwrap() as ztcore::ZT_CertificatePublicKeyAlgorithm, public_key.as_mut_ptr(), &mut public_key_size, private_key.as_mut_ptr(), &mut private_key_size) };
|
||||
if r == 0 {
|
||||
if public_key_size > 0 && private_key_size > 0 {
|
||||
Ok((public_key[0..public_key_size as usize].to_vec(), private_key[0..private_key_size as usize].to_vec()))
|
||||
|
|
|
@ -45,7 +45,7 @@ impl Locator {
|
|||
pub(crate) fn new_from_capi(l: *const ztcore::ZT_Locator, requires_delete: bool) -> Locator {
|
||||
Locator{
|
||||
capi: l,
|
||||
requires_delete: requires_delete
|
||||
requires_delete
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -66,9 +66,12 @@ impl Locator {
|
|||
|
||||
#[inline(always)]
|
||||
pub fn revision(&self) -> i64 {
|
||||
unsafe {
|
||||
ztcore::ZT_Locator_revision(self.capi) as i64
|
||||
}
|
||||
unsafe { ztcore::ZT_Locator_revision(self.capi) as i64 }
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
pub fn signer(&self) -> Address {
|
||||
unsafe { Address(ztcore::ZT_Locator_signer(self.capi)) }
|
||||
}
|
||||
|
||||
pub fn endpoints(&self) -> Vec<Endpoint> {
|
||||
|
@ -86,28 +89,17 @@ impl Locator {
|
|||
eps
|
||||
}
|
||||
|
||||
#[inline(always)]
|
||||
pub fn verify(&self, id: &Identity) -> bool {
|
||||
unsafe { ztcore::ZT_Locator_verify(self.capi, id.capi) != 0 }
|
||||
}
|
||||
|
||||
pub fn signer(&self) -> Fingerprint {
|
||||
unsafe {
|
||||
let fp = ztcore::ZT_Locator_fingerprint(self.capi);
|
||||
if fp.is_null() {
|
||||
panic!("ZT_Locator_fingerprint() returned null, should not be allowed");
|
||||
}
|
||||
Fingerprint::new_from_capi(&*fp)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Drop for Locator {
|
||||
#[inline(always)]
|
||||
fn drop(&mut self) {
|
||||
if self.requires_delete {
|
||||
unsafe {
|
||||
ztcore::ZT_Locator_delete(self.capi);
|
||||
}
|
||||
unsafe { ztcore::ZT_Locator_delete(self.capi); }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -132,8 +124,9 @@ impl ToString for Locator {
|
|||
}
|
||||
|
||||
impl PartialEq for Locator {
|
||||
#[inline(always)]
|
||||
fn eq(&self, other: &Locator) -> bool {
|
||||
self.to_string() == other.to_string()
|
||||
unsafe { ztcore::ZT_Locator_equals(self.capi, other.capi) != 0 }
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue