| 825 | } |
| 826 | |
| 827 | bool LeaseSetBufferValidate(const uint8_t * ptr, size_t sz, uint64_t & expires) |
| 828 | { |
| 829 | IdentityEx ident(ptr, sz); |
| 830 | size_t size = ident.GetFullLen (); |
| 831 | if (size > sz) |
| 832 | { |
| 833 | LogPrint (eLogError, "LeaseSet: Identity length ", size, " exceeds buffer size ", sz); |
| 834 | return false; |
| 835 | } |
| 836 | // encryption key |
| 837 | size += 256; |
| 838 | // signing key (unused) |
| 839 | size += ident.GetSigningPublicKeyLen (); |
| 840 | uint8_t numLeases = ptr[size]; |
| 841 | ++size; |
| 842 | if (!numLeases || numLeases > MAX_NUM_LEASES) |
| 843 | { |
| 844 | LogPrint (eLogError, "LeaseSet: Incorrect number of leases", (int)numLeases); |
| 845 | return false; |
| 846 | } |
| 847 | const uint8_t * leases = ptr + size; |
| 848 | expires = 0; |
| 849 | /** find lease with the max expiration timestamp */ |
| 850 | for (int i = 0; i < numLeases; i++) |
| 851 | { |
| 852 | leases += 36; // gateway + tunnel ID |
| 853 | uint64_t endDate = bufbe64toh (leases); |
| 854 | leases += 8; // end date |
| 855 | if(endDate > expires) |
| 856 | expires = endDate; |
| 857 | } |
| 858 | return ident.Verify(ptr, leases - ptr, leases); |
| 859 | } |
| 860 | |
| 861 | LocalLeaseSet2::LocalLeaseSet2 (uint8_t storeType, const i2p::data::PrivateKeys& keys, |
| 862 | const EncryptionKeys& encryptionKeys, const std::vector<std::shared_ptr<i2p::tunnel::InboundTunnel> >& tunnels, |
no test coverage detected